Signatur
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-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);
}
// 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.