Start · Sprachen · PHP · Referenz · MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent

Klasse

Repräsentiert ein Ereignis, das ausgelöst wird, wenn ein Server-Heartbeat erfolgreich abgeschlossen wurde.

seit PHP 1.3.0 Kategorie: db

Signatur

class MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent

Beschreibung

Die Klasse MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent ist Teil des SDAM-Monitoring-Systems (Server Discovery and Monitoring) des MongoDB PHP-Treibers. Ein Objekt dieser Klasse wird erstellt und an registrierte Subscriber übergeben, sobald der Treiber einen erfolgreichen Heartbeat zu einem MongoDB-Server empfangen hat.

Ein Heartbeat ist eine periodische Überprüfung, mit der der Treiber den Zustand und die Topologie eines Servers überwacht. Das Ereignis liefert Informationen über den betroffenen Server (Host und Port) sowie die Antwortdauer, was für Performance-Analysen und Diagnosen nützlich ist.

Um dieses Ereignis zu empfangen, muss eine Klasse das Interface MongoDB\Driver\Monitoring\SDAMSubscriber implementieren und die Methode serverHeartbeatSucceeded() definieren. Der Subscriber wird anschließend mit MongoDB\Driver\Monitoring\addSubscriber() oder auf einem MongoDB\Driver\Manager registriert.

Objekte dieser Klasse können nicht direkt instanziiert werden – sie werden ausschließlich intern vom Treiber erzeugt und an die entsprechenden Subscriber-Methoden weitergegeben.

Beispiele

Heartbeat-Ereignis mit einem SDAM-Subscriber überwachen

<?php

use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
use MongoDB\Driver\Monitoring\ServerChangedEvent;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;

class HeartbeatLogger implements SDAMSubscriber
{
    public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}

    public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void
    {
        printf(
            "Heartbeat erfolgreich: Host=%s:%d, Dauer=%.4f ms, StreamID=%s\n",
            $event->getHost(),
            $event->getPort(),
            $event->getDurationMicros() / 1000,
            $event->isAwaited() ? 'awaited' : 'standard'
        );
    }

    public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
    public function serverChanged(ServerChangedEvent $event): void {}
    public function serverClosed(ServerClosedEvent $event): void {}
    public function serverOpening(ServerOpeningEvent $event): void {}
    public function topologyChanged(TopologyChangedEvent $event): void {}
    public function topologyClosed(TopologyClosedEvent $event): void {}
    public function topologyOpening(TopologyOpeningEvent $event): void {}
}

$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
$manager->addSubscriber(new HeartbeatLogger());

// Eine Abfrage auslösen, damit der Treiber einen Heartbeat durchführt
$command = new MongoDB\Driver\Command(['ping' => 1]);
$manager->executeCommand('admin', $command);
Heartbeat erfolgreich: Host=127.0.0.1:27017, Dauer=0.8500 ms, StreamID=standard

Heartbeat-Dauer für Performance-Monitoring erfassen

<?php

use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
use MongoDB\Driver\Monitoring\ServerChangedEvent;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;

class HeartbeatMetrics implements SDAMSubscriber
{
    private array $durations = [];

    public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void
    {
        $key = $event->getHost() . ':' . $event->getPort();
        $this->durations[$key][] = $event->getDurationMicros();
    }

    public function getAverageDurations(): array
    {
        $averages = [];
        foreach ($this->durations as $server => $times) {
            $averages[$server] = array_sum($times) / count($times);
        }
        return $averages;
    }

    public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}
    public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
    public function serverChanged(ServerChangedEvent $event): void {}
    public function serverClosed(ServerClosedEvent $event): void {}
    public function serverOpening(ServerOpeningEvent $event): void {}
    public function topologyChanged(TopologyChangedEvent $event): void {}
    public function topologyClosed(TopologyClosedEvent $event): void {}
    public function topologyOpening(TopologyOpeningEvent $event): void {}
}

$metrics = new HeartbeatMetrics();
$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
$manager->addSubscriber($metrics);

$command = new MongoDB\Driver\Command(['ping' => 1]);
$manager->executeCommand('admin', $command);

foreach ($metrics->getAverageDurations() as $server => $avgMicros) {
    printf("Server %s – Ø Heartbeat-Dauer: %.2f µs\n", $server, $avgMicros);
}
Server 127.0.0.1:27017 – Ø Heartbeat-Dauer: 850.00 µs

// Wichtig · Fallstricke

Instanziierung: Objekte vom Typ ServerHeartbeatSucceededEvent können nicht manuell erzeugt werden. Der Treiber erstellt sie ausschließlich intern und reicht sie an die serverHeartbeatSucceeded()-Methode registrierter Subscriber weiter.

Awaited Heartbeats: Ab MongoDB 4.4 unterstützt der Treiber sogenannte awaited Heartbeats (Exhaust Cursors für SDAM). Mit isAwaited() lässt sich unterscheiden, ob ein Heartbeat auf eine sofortige oder verzögerte Server-Antwort gewartet hat. Die Dauer kann bei awaited Heartbeats erheblich höher sein.

Methoden der Klasse: getHost(): string, getPort(): int, getDurationMicros(): float, isAwaited(): bool und getReply(): MongoDB\Driver\ServerDescription.