Version 6.2 de la pile élastique Saw à l'aube de la surveillance des performances de l'application. Les agents APM dans plusieurs langues ont été publiés avec lui, mais en quelque sorte, PHP n'était pas parmi eux ¯_ (ツ) _ / ¯ Cette bibliothèque ajoute que l'agent APM afin que nous puissions avec plaisir nos mesures de performance de l'application au serveur APM élastique.
Attention: alpha
Actuellement, la bibliothèque est en phase alpha, ce qui signifie que l'interface pourrait toujours changer et elle n'est pas prête pour une utilisation en production. J'apprécierais beaucoup si vous essayez la version actuelle et que vous signalez les problèmes que vous rencontrez.
Ajoutez la bibliothèque à votre application avec le compositeur:
composer require techdeco/elastic-apm-agentCela ne fonctionnera cependant que si vous avez des implémentations des packages virtuels suivants installés (plus d'informations sur chacun d'eux ci-dessous):
Cela vous semble un peu compliqué, peut-être même un peu paresseux de notre côté - pourquoi ne pas laisser ce package en choisir un? - Mais il vous offre le plus de flexibilité et un risque minimal de conflits avec des packages déjà utilisés dans votre projet.
Disons que vous n'avez aucune de ces implémentations dans votre projet et que vous choisissez respectivement Guzzle 6, Message et monologue de PHP HTTP; Vous pouvez installer cette bibliothèque avec:
composer require techdeco/elastic-apm-agent
php-http/guzzle6-adapter
php-http/message
monolog/monolog Pour envoyer des données au serveur APM, l'agent APM de cette bibliothèque a besoin d'un client HTTP. Pour ne pas vous forcer à un choix pour un client HTTP spécifique, la bibliothèque dépend d'une implémentation de la mise en œuvre de php-http/async-client-implementation . Votre projet doit fournir cette implémentation, pour laquelle vous pouvez trouver des candidats possibles sur le site PHP-HTTP.
Il en va de même pour ne pas vous forcer à un choix pour une usine de messages HTTP spécifique, qui laisse votre projet pour fournir une implémentation de php-http/message-factory-implementation , pour laquelle vous pouvez trouver des candidats possibles sur le site PHP-HTTP
Et aussi pour la journalisation, ce package a besoin d'une implémentation afin que le client puisse vous informer lorsque les choses se déroulent sur le côté. Vous pouvez trouver toute l'implémentation pour psr/log-implemtation chez Packagist. Si vous ne savez pas lequel choisir, Monolog est un excellent.
Pour dire à la bibliothèque comment se connecter au serveur APM, initialisez au moins une implémentation de LoggerInterface et un objet ClientConfiguration et donnez-le au HttplugAsyncClient . Le client HTTP et l'usine de messages sont facultatifs; S'ils ne sont pas injectés, le client essaiera de les découvrir.
$ config = ( new ClientConfiguration ( ' http://foo.bar ' ))-> authenticatedByToken ( ' alloy ' );
$ httpClient = . . . # Implementation of php-http/async-client-implementation
$ requestFactory = . . . # implementation of php-http/message-factory-implementation
$ logger = . . . # implementation of psr/log-implementation
$ client = new HttplugAsyncClient ( $ logger , $ config , $ httpClient , $ requestFactory );Elastic a fait un très bon travail en intégrant de manière transparente avec beaucoup de langues et de cadres. Cette bibliothèque espère fournir ce même service à la communauté PHP. Vous pouvez soit choisir d'utiliser les éléments constitutifs fournis par la bibliothèque dans une solution de bricolage ou d'utiliser les composants de commodité de niveau supérieur, comme le middleware.
Le serveur APM d'Elastic ingère deux types d'événements: les transactions et les erreurs. Une fois que vous avez créé le client, vous pouvez envoyer respectivement une TechDeCoElasticApmAgentRequestTransaction ou TechDeCoElasticApmAgentRequestError avec ce client au serveur APM. Pour créer ces deux types de demandes, consultez l'espace de noms TechDeCoElasticApmAgentMessage pour tous les composants nécessaires.
Sachez que tous les objets de demande et de message sont immuables afin que chaque appel à une méthode renvoie une nouvelle instance avec une propriété mutée. Assurez-vous de travailler avec cette nouvelle instance au lieu de celle sur laquelle vous avez effectué l'appel.
# Bad example
$ error = new Error (...);
$ error -> onSystem (...); // New instance is in the wind
$ error -> inProcess (...) // New instance is in the wind
# Good example
$ error = new Error (...);
$ error = $ error -> onSystem (...)-> inProcess (...); // Got it! Pour mesurer le temps de réponse et le rapport des erreurs (en attrapant des exceptions), vous pouvez connecter le middleware conforme PSR-15 à votre application. Si vous souhaitez enrichir la transaction que vous envoyez au serveur APM en fonction de la demande ou de la réponse, implémentez l' OpenTransactionRequestEnricher ou OpenTransactionResponseEnricher et branchez le middleware.
Le TransactionMiddleware injectera un OpenTransaction dans la demande transférée sous le nom d'attribut apm-transaction (mais vous mieux vous référer à lui en utilisant la TransactionMiddleware::TRANSACTION_ATTRIBUTE ).
Vous pouvez ajouter des événements Span S et Mark à l' OpenTransaction et lorsque vous donnez une réponse, le middleware les ramassera et les envoie avec la transaction au serveur APM. C'est l'un des objets de vue qui est mutable , vous n'avez donc pas à remplacer l'attribut de demande chaque fois que vous changez quelque chose.
Si vous souhaitez attraper et signaler Throwable S à APM, incluez également le ErrorMiddleware dans votre pile de middleware. Il attrapera n'importe quel Throwable et essaiera de le donner autant de sens que possible. Pour donner encore plus de contexte à l'erreur, vous pouvez injecter un objet Context sur l'instanciation du middleware. Il l'utilisera comme base pour construire le contexte.
Parfois, vous souhaitez enrichir la transaction avec les données de la demande ou de la réponse. Pour rendre cela possible, branchez l' OpenTransactionRequestEnrichmentMiddleware et OpenTransactionRequestEnrichmentMiddleware et injectez vos implémentations respectivement OpenTransactionRequestEnricher S et OpenTransactionResponseEnricher pour ajouter des informations à l' OpenTransaction
Il y a également quelques implémentations d'enricher incluses dans cette bibliothèque:
RequestHeaderBlacklistEnricher : ajoute des en-têtes à la Request dans le Context sauf lorsque leur nom est dans une liste noire.ResponseHeaderBlacklistEnricher : ajoute des en-têtes à la Response dans le Context sauf lorsque leur nom est dans une liste noire. De toute évidence, les deux middleware peuvent être combinés. La façon recommandée de procéder est d'abord de connecter TransactionMiddleware , puis l' ErrorMiddleware et enfin le OpenTransactionRequestEnrichmentMiddleware et OpenTransactionRequestEnrichmentMiddleware . De cette façon, la transaction sera enrichie, toute erreur sera corrélée à la transaction et la durée de la transaction sera aussi réaliste que possible.
Pour surveiller vos appels de mise en cache, enveloppez votre bibliothèque d'implémentation de mise en cache dans la couche de mise en cache conforme PSR-6. Il créera une portée pour chaque appel.
Avant d'appeler toutes les méthodes de CacheItemPoolInterface , assurez-vous d'injecter une OpenTransaction , consultez la section de transaction ouverte ci-dessous.
Pour surveiller vos appels vers des services HTTP externes, enveloppez votre client HTTPLUG dans le HttpClientWrapper . Il créera une portée pour chaque demande HTTP que vous envoyez.
Le wrapper ajoutera l'en-tête X-Correlation-ID à la demande avant qu'il ne le transfère. L'en-tête contiendra un UUID et vous donnera la possibilité de corréler les demandes HTTP en cascade tout au long de votre infrastructure. Le middleware de cette bibliothèque ramassera l'en-tête et ajoutera l'ID de corrélation aux balises du contexte de la transaction. Si aucun ID de corrélation ne peut être trouvé dans l'en-tête, un nouveau sera créé.
Avant d'appeler toutes les méthodes de la HttpClientInterface , assurez-vous d'injecter un OpenTransaction , consultez la section de transaction ouverte ci-dessous.
Plusieurs des classes de commodité de cette bibliothèque ont besoin d'un OpenTransaction avant de pouvoir fonctionner. Toutes ces classes implémenteront l'interface OpenTransactionEnricher . C'était un choix délibéré d'utiliser un secteur au lieu d'exiger l' OpenTransaction dans le constructeur, simplement parce qu'il n'existe pas à ce moment-là, il a besoin d'informations d'exécution à créer.
Vous pouvez obtenir l' OpenTransaction , obtenir un attribut de demande si vous utilisez le middleware dans cette bibliothèque, ou vous pouvez créer le vôtre et le convertir plus tard en une Transaction que vous pouvez envoyer au serveur APM via le Client .