Surveillance de la performance de l'application (Application Performance Monitoring - APM) L'extension contient une API d'observations événements, qui permet aux applications de surveiller les commandes et les activités internes liées à la Spécification de découverte et de surveillance du serveur. Ce tutoriel démontrera la surveillance des commandes en utilisant l'interface MongoDB\Driver\Monitoring\CommandSubscriber. L'interface MongoDB\Driver\Monitoring\CommandSubscriber définit trois méthodes: commandStarted, commandSucceeded, et commandFailed. Chacune de ces trois méthodes accepte un seul argument event d'une classe spécifique pour l'événement respectif. Par exemple, l'argument $event de commandSucceeded est un objet MongoDB\Driver\Monitoring\CommandSucceededEvent. Dans ce tutoriel, nous allons implémenter un observateur qui crée une liste de tous les profils de requête et le temps moyen qu'ils ont pris.
Structure des classes d'observations Nous commençons par le cadre de notre observateur: ]]>
Enregistrement de l'observateur Une fois qu'un objet observateur est instancié, il doit être enregistré avec le système de surveillance de l'extension. Cela se fait en appelant MongoDB\Driver\Monitoring\addSubscriber ou MongoDB\Driver\Manager::addSubscriber pour enregistrer l'observateur globalement ou avec un Manager spécifique, respectivement. ]]>
Implémenter la logique Avec l'objet enregistré, la seule chose qui reste est d'implémenter la logique dans la classe observatrice. Pour corréler les deux événements qui composent une commande exécutée avec succès (commandStarted et commandSucceeded), chaque objet d'événement expose un champ requestId. Pour enregistrer le temps moyen par forme de requête, nous allons commencer par vérifier une commande find dans l'événement commandStarted. Nous allons ensuite ajouter un élément à la propriété pendingCommands indexé par son requestId et avec sa valeur représentant la forme de requête. Si nous recevons un événement commandSucceeded correspondant avec le même requestId, nous ajoutons la durée de l'événement (depuis durationMicros) au temps total et incrémentons le compteur d'opérations. Si un événement commandFailed correspondant est rencontré, nous supprimons simplement l'entrée de la propriété pendingCommands. getCommandName() ) { $queryShape = $this->createQueryShape( (array) $event->getCommand()->filter ); $this->pendingCommands[$event->getRequestId()] = $queryShape; } } public function commandSucceeded( \MongoDB\Driver\Monitoring\CommandSucceededEvent $event ): void { $requestId = $event->getRequestId(); if ( array_key_exists( $requestId, $this->pendingCommands ) ) { $this->queryShapeStats[$this->pendingCommands[$requestId]]['count']++; $this->queryShapeStats[$this->pendingCommands[$requestId]]['duration'] += $event->getDurationMicros(); unset( $this->pendingCommands[$requestId] ); } } public function commandFailed( \MongoDB\Driver\Monitoring\CommandFailedEvent $event ): void { if ( array_key_exists( $event->getRequestId(), $this->pendingCommands ) ) { unset( $this->pendingCommands[$event->getRequestId()] ); } } public function __destruct() { foreach( $this->queryShapeStats as $shape => $stats ) { echo "Shape: ", $shape, " (", $stats['count'], ")\n ", $stats['duration'] / $stats['count'], "µs\n\n"; } } } $m = new \MongoDB\Driver\Manager( 'mongodb://localhost:27016' ); /* Ajouter l'observateur */ \MongoDB\Driver\Monitoring\addSubscriber( new QueryTimeCollector() ); /* Faire une série de requêtes */ $query = new \MongoDB\Driver\Query( [ 'region_slug' => 'scotland-highlands', 'age' => [ '$gte' => 20 ] ] ); $cursor = $m->executeQuery( 'dramio.whisky', $query ); $query = new \MongoDB\Driver\Query( [ 'region_slug' => 'scotland-lowlands', 'age' => [ '$gte' => 15 ] ] ); $cursor = $m->executeQuery( 'dramio.whisky', $query ); $query = new \MongoDB\Driver\Query( [ 'region_slug' => 'scotland-lowlands' ] ); $cursor = $m->executeQuery( 'dramio.whisky', $query ); ?> ]]>