Versión 6.2 de la sierra de pila elástica al amanecer del monitoreo del rendimiento de la aplicación. Los agentes de APM en varios idiomas se lanzaron con él, pero de alguna manera PHP no estuvo entre ellos ¯_ (ツ) _/¯ Esta biblioteca agrega que APM Agent para que podamos enviar felizmente nuestras mediciones de rendimiento de la aplicación al servidor APM elástico.
Atención: alfa
Actualmente, la biblioteca está en la fase alfa, lo que significa que la interfaz aún podría cambiar y no está lista para el uso de producción. Lo agradecería mucho si prueba la versión actual e informa cualquier problema que encuentre.
Agregue la biblioteca a su aplicación con el compositor:
composer require techdeco/elastic-apm-agentSin embargo, esto solo funcionará si tiene implementaciones de los siguientes paquetes virtuales instalados (más información sobre cada uno de ellos a continuación):
Esto te parece una molestia, tal vez incluso un poco flojo de nuestro lado, ¿por qué no dejar que este paquete solo elija uno? - Pero le proporciona la mayor flexibilidad y una posibilidad mínima de conflictos con los paquetes ya utilizados en su proyecto.
Supongamos que no tiene ninguna de estas implementaciones en su proyecto y elige respectivamente Guzzle 6, el mensaje y el monólogo de PHP HTTP; Puede instalar esta biblioteca con:
composer require techdeco/elastic-apm-agent
php-http/guzzle6-adapter
php-http/message
monolog/monolog Para enviar datos al servidor APM, el agente APM en esta biblioteca necesita un cliente HTTP. Para no obligarlo a elegir para un cliente HTTP específico, la biblioteca depende de una implementación de php-http/async-client-implementation . Su proyecto debe proporcionar esa implementación, para la cual puede encontrar posibles candidatos en el sitio PHP-HTTP.
Lo mismo ocurre con no obligarlo a una opción para una fábrica de mensajes HTTP específica, que deja su proyecto para proporcionar una implementación de php-http/message-factory-implementation , para la cual puede encontrar posibles candidatos en el sitio PHP-HTTP
Y también para el registro, este paquete necesita una implementación para que el cliente pueda notificarle cuándo las cosas van de lado. Puede encontrar toda la implementación para psr/log-implemtation en Packagist. Si no sabe cuál elegir, el monólogo es excelente.
Para decirle a la biblioteca cómo conectarse al servidor APM, inicialice al menos una implementación de LoggerInterface y un objeto ClientConfiguration y dárselo al HttplugAsyncClient . El cliente HTTP y la fábrica de mensajes son opcionales; Si no se inyectan, el cliente intentará descubrirlos.
$ 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 hizo un gran trabajo integrándose perfectamente con muchos idiomas y marcos. Esta biblioteca espera proporcionar ese mismo servicio a la comunidad PHP. Puede optar por usar los bloques de construcción proporcionados por la biblioteca en una solución de bricolaje o usar los componentes de conveniencia de nivel superior, como el middleware.
El servidor APM de Elastic ingiere dos tipos de eventos: transacciones y errores. Una vez que haya creado el cliente, puede enviar respectivamente un TechDeCoElasticApmAgentRequestTransaction o TechDeCoElasticApmAgentRequestError con ese cliente al servidor APM. Para crear estos dos tipos de solicitudes, consulte el espacio de nombres TechDeCoElasticApmAgentMessage para todos los componentes necesarios.
Tenga en cuenta que todos los objetos de solicitud y mensaje son inmutables, por lo que cada llamada a un método devolverá una nueva instancia con una propiedad mutada. Asegúrese de trabajar con esa nueva instancia en lugar de la que realizó la llamada.
# 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! Para medir el tiempo de respuesta y los errores de informe (al atrapar excepciones), puede conectar el middleware compatible con PSR-15 a su aplicación. Si desea enriquecer la transacción que envía al servidor APM en función de la solicitud o respuesta, implementa OpenTransactionRequestEnricher u OpenTransactionResponseEnricher y conecte el middleware.
TransactionMiddleware inyectará una OpenTransaction en la solicitud reenviada bajo el nombre del atributo apm-transaction (pero usted es mejor referencia a él utilizando el constante TransactionMiddleware::TRANSACTION_ATTRIBUTE ).
Puede agregar eventos Span S y Mark a OpenTransaction y cuando da una respuesta, el middleware los recogerá y los enviará junto con la transacción al servidor APM. Este es uno de los objetos de vista que es mutable , por lo que no tiene que reemplazar el atributo de solicitud cada vez que cambia algo.
Si desea atrapar e Throwable a APM, también incluya el ErrorMiddleware en su pila de middleware. Atrapará cualquier Throwable e intentará tener la mayor sensación posible de él. Para dar el error aún más contexto, puede en el objeto Context inyectado en la instanciación del middleware. Lo usará como base para el contexto de construcción.
A veces desea enriquecer la transacción con datos de la solicitud o respuesta. Para que esto sea posible, conecte el OpenTransactionRequestEnrichmentMiddleware y OpenTransactionRequestEnrichmentMiddleware e inyecte sus implementaciones de OpenTransactionRequestEnricher sy OpenTransactionResponseEnricher s para agregar información a la OpenTransaction
También hay algunas implementaciones enriquecedoras en esta biblioteca:
RequestHeaderBlacklistEnricher : agrega encabezados a la Request en el Context excepto cuando su nombre está en una lista negra.ResponseHeaderBlacklistEnricher : agrega encabezados a la Response en el Context excepto cuando su nombre está en una lista negra. Obviamente, los dos middleware se pueden combinar. La forma recomendada de hacer esto es conectar primero TransactionMiddleware , luego ErrorMiddleware y finalmente el OpenTransactionRequestEnrichmentMiddleware y OpenTransactionRequestEnrichmentMiddleware . De esa manera, la transacción se enriquece, cualquier error se correlacionará con la transacción y la duración de la transacción será lo más realista posible.
Para monitorear sus llamadas de almacenamiento en caché, envuelva su biblioteca de implementación de almacenamiento en caché en la capa de almacenamiento de caché que cumple con PSR-6. Creará un tramo para cada llamada.
Antes de llamar a cualquier método de CacheItemPoolInterface , asegúrese de inyectar una OpenTransaction , consulte la sección de transacción abierta a continuación.
Para monitorear sus llamadas a servicios HTTP externos, envuelva su cliente HTTPlug en el HttpClientWrapper . Creará un tramo para cada solicitud HTTP que envíe.
El envoltorio agregará el encabezado X-Correlation-ID a la solicitud antes de que lo reenvíe. El encabezado contendrá un UUID y le brinda la oportunidad de correlacionar las solicitudes HTTP en cascada a lo largo de su infraestructura. El middleware en esta biblioteca recogerá el encabezado y agregará la ID de correlación a las etiquetas del contexto de la transacción. Si no se puede encontrar una identificación de correlación en el encabezado, se creará una nueva.
Antes de llamar a cualquier método de la HttpClientInterface , asegúrese de inyectar una OpenTransaction , consulte la sección de transacción abierta a continuación.
Varias de las clases de conveniencia en esta biblioteca necesitan una OpenTransaction antes de que puedan funcionar. Todas estas clases implementarán la interfaz OpenTransactionEnricher . Era una elección deliberada usar un setter en lugar de requerir la OpenTransaction en el constructor, simplemente porque no existe en ese momento, necesita que se cree información de tiempo de ejecución.
Puede obtener OpenTransaction , o lo obtenga de un atributo de solicitud si usa el middleware en esta biblioteca, o puede crear la suya y convertirlo más tarde en una Transaction que puede enviar al servidor APM a través del Client .