탄성 스택의 릴리스 6.2는 애플리케이션 성능 모니터링의 새벽에 보았습니다. 여러 언어로 된 APM 에이전트가 출시되었지만 어떻게 든 PHP가 그 중 하나가 아니 었습니다. ¯_ (ツ) _/¯이 라이브러리는 APM 에이전트를 추가하여 응용 프로그램 성능 측정을 탄성 APM 서버에 행복하게 배송 할 수 있습니다.
주의 : 알파
현재 라이브러리는 알파 단계에 있습니다. 즉, 인터페이스가 여전히 변경 될 수 있으며 생산 사용이 준비되지 않았습니다. 현재 버전을 시험해보고 발생하는 문제를보고하면 매우 감사합니다.
작곡가로 애플리케이션에 라이브러리를 추가하십시오.
composer require techdeco/elastic-apm-agent그러나 이것은 다음 가상 패키지를 구현 한 경우에만 작동합니다 (아래 각각에 대한 자세한 정보).
이것은 당신을위한 약간의 번거 로움처럼 보일 것입니다. 어쩌면 우리 옆에서 약간 게으른 것 같습니다. 왜이 패키지를 선택하지 않겠습니까? - 그러나 프로젝트에 이미 사용 된 패키지와 가장 많은 유연성과 최소한의 충돌 가능성을 제공합니다.
프로젝트에 이러한 구현이 없으며 각각 Guzzle 6, PHP HTTP의 메시지 및 독백을 선택한다고 가정 해 봅시다. 이 라이브러리를 다음과 같이 설치할 수 있습니다.
composer require techdeco/elastic-apm-agent
php-http/guzzle6-adapter
php-http/message
monolog/monolog APM 서버로 데이터를 보내려면이 라이브러리의 APM 에이전트에는 HTTP 클라이언트가 필요합니다. 특정 HTTP 클라이언트를위한 선택을 강요하지 않기 위해 라이브러리는 php-http/async-client-implementation 의 구현에 따라 다릅니다. 프로젝트는 PHP-HTTP 사이트에서 가능한 후보자를 찾을 수있는 구현을 제공해야합니다.
PHP-HTTP 사이트에서 가능한 후보자를 찾을 수있는 php-http/message-factory-implementation 의 구현을 제공하기 위해 프로젝트를 떠나 특정 HTTP 메시지 공장을 선택하게하지 않아도됩니다.
또한 로깅의 경우이 패키지에는 구현이 필요하므로 클라이언트가 옆으로 갈 때 알릴 수 있습니다. Packagist에서 psr/log-implemtation 의 모든 구현을 찾을 수 있습니다. 어느 것을 골라야하는지 모르면 독백은 훌륭한 것입니다.
APM 서버에 연결하는 방법을 라이브러리에 알리려면 최소한 LoggerInterface 및 ClientConfiguration 객체의 구현을 초기화하고 HttplugAsyncClient 에 제공하십시오. HTTP 클라이언트 및 메시지 공장은 선택 사항입니다. 그들이 주입되지 않으면 고객은 그들을 발견하려고합니다.
$ 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은 많은 언어와 프레임 워크와 완벽하게 통합하는 훌륭한 일을했습니다. 이 도서관은 PHP 커뮤니티에 동일한 서비스를 제공하기를 희망합니다. 라이브러리에서 제공 한 빌딩 블록을 Do-it-Yourself 솔루션에서 사용하거나 미들웨어와 같은 고급 편의성 구성 요소를 사용할 수 있습니다.
Elastic의 APM 서버는 트랜잭션과 오류의 두 가지 유형의 이벤트를 수집합니다. 클라이언트를 생성 한 후에는 각각 TechDeCoElasticApmAgentRequestTransaction 또는 TechDeCoElasticApmAgentRequestError APM 서버로 보낼 수 있습니다. 이 두 가지 유형의 요청을 만들려면 필요한 모든 구성 요소에 대해 TechDeCoElasticApmAgentMessage 네임 스페이스를 확인하십시오.
모든 요청 및 메시지 객체는 불변이 없으므로 메소드에 대한 모든 호출은 부동산으로 새 인스턴스를 반환합니다. 통화를 수행 한 새로운 인스턴스 대신 새 인스턴스를 사용해야합니다.
# 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! 응답 시간과보고 오류를 측정하려면 (예외를 포착하여) PSR-15 호환 미들웨어를 응용 프로그램에 연결할 수 있습니다. 요청 또는 응답에 따라 APM 서버로 전송하는 트랜잭션을 풍부하게하려면 OpenTransactionRequestEnricher 또는 OpenTransactionResponseEnricher 구현하고 미들웨어를 연결하십시오.
TransactionMiddleware 속성 이름 apm-transaction 에서 전달 된 요청에 OpenTransaction 주입합니다 (그러나 CORTANT TransactionMiddleware::TRANSACTION_ATTRIBUTE 사용하여이를 더 잘 참조하십시오).
Span S 및 Mark Events를 OpenTransaction 에 추가 할 수 있으며 응답을 제공하면 미들웨어가 픽업하여 트랜잭션과 함께 APM 서버로 보냅니다. 이것은 변이 가능한 보기 객체 중 하나이므로 무언가를 변경할 때마다 요청 속성을 교체 할 필요가 없습니다.
Throwable S를 APM에 잡아보고하려면 미들웨어 스택에 ErrorMiddleware 도 포함하십시오. 그것은 Throwable 모든 것을 잡아서 가능한 한 많이 이해하려고 노력할 것입니다. 더 많은 컨텍스트에 오류를 주려면 미들웨어의 인스턴스화에 대한 Context 객체를 주입 할 수 있습니다. 그것은 그것을 구축 컨텍스트의 기반으로 사용할 것입니다.
때로는 요청 또는 응답에서 데이터로 트랜잭션을 풍부하게하려고합니다. 이를 가능하게하려면 OpenTransactionRequestEnrichmentMiddleware 및 OpenTransactionRequestEnrichmentMiddleware 를 연결하고 각각 OpenTransactionRequestEnricher S 및 OpenTransactionResponseEnricher S의 구현을 주입하여 OpenTransaction 에 정보를 추가하십시오.
이 라이브러리에는 몇 가지 농축기 구현이 포함되어 있습니다.
RequestHeaderBlacklistEnricher : 이름이 블랙리스트에있는 경우를 제외하고 Context 에서 Request 에 헤더를 추가합니다.ResponseHeaderBlacklistEnricher : 이름이 블랙리스트에있는 경우를 제외하고 Context 에서 Response 에 헤더를 추가합니다. 분명히 두 개의 미들웨어를 결합 할 수 있습니다. 이를 수행하는 권장 방법은 먼저 TransactionMiddleware 연결 한 다음 ErrorMiddleware 및 마지막으로 OpenTransactionRequestEnrichmentMiddleware 및 OpenTransactionRequestEnrichmentMiddleware 를 연결하는 것입니다. 이렇게하면 거래가 풍부 해지고 모든 오류는 거래와 관련이 있으며 거래 기간은 가능한 한 현실적입니다.
캐싱 호출을 모니터링하려면 Caching 구현 라이브러리를 PSR-6 호환 캐싱 레이어로 감습니다. 각 호출마다 스팬이 생성됩니다.
CacheItemPoolInterface 의 모든 메소드를 호출하기 전에 OpenTransaction 을 주입 하는지 확인하고 아래의 열린 트랜잭션 섹션을 참조하십시오.
외부 HTTP 서비스에 대한 통화를 모니터링하려면 httplug 클라이언트를 HttpClientWrapper 에 마무리하십시오. 보내는 각 HTTP 요청에 대한 범위가 생성됩니다.
래퍼는 X-Correlation-ID 헤더를 전달하기 전에 요청에 추가합니다. 헤더에는 UUID가 포함되어 있으며 인프라 전체에 걸쳐 계단식 HTTP 요청을 연관시킬 수있는 기회를 제공합니다. 이 라이브러리의 미들웨어는 헤더를 선택하고 트랜잭션 컨텍스트의 태그에 상관 ID를 추가합니다. 헤더에서 상관 관계 ID를 찾을 수없는 경우 새 제품이 생성됩니다.
HttpClientInterface 의 모든 방법을 호출하기 전에 OpenTransaction 주입 하는지 확인하십시오. 아래의 열린 트랜잭션 섹션을 참조하십시오.
이 라이브러리의 편의 클래스 중 일부는 기능을 수행하기 전에 OpenTransaction 필요합니다. 이 모든 클래스는 OpenTransactionEnricher 인터페이스를 구현합니다. 생성자에서 OpenTransaction 요구하는 대신 세터를 사용하는 것은 의도적 인 선택이었습니다. 그 당시에는 존재하지 않기 때문에 런타임 정보가 필요합니다.
이 라이브러리에서 미들웨어를 사용하는 경우 요청 속성 OpenTransaction 가져 오거나 직접 생성하고 나중에 Client 를 통해 APM 서버로 보낼 수있는 Transaction 으로 전환 할 수 있습니다.