彈性堆棧的第6.2版鋸到應用程序性能監控的曙光。使用了幾種語言的APM代理,但其中以某種方式不在其中php是_(ツ)_/é該庫中添加了APM代理,因此我們可以很樂意將應用程序性能測量運送到Elastic APM服務器上。
注意:alpha
目前,該庫處於Alpha階段,這意味著接口可能仍會更改,並且還沒有準備好生產使用。如果您嘗試當前版本並報告遇到的任何問題,我將非常感謝。
使用Composer將庫添加到您的應用程序中:
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網站上找到可能的候選人。
不強迫您進入特定的HTTP消息工廠的選擇,這也是如此,這使您的項目提供了php-http/message-factory-implementation的實現,您可以在PHP-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社區提供相同的服務。您可以選擇在自己動手的解決方案中使用圖書館提供的構建塊,也可以使用更高級別的便利組件,例如中間件。
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 (但是您可以使用常量的TransactionMiddleware::TRANSACTION_ATTRIBUTE更好地引用它。
您可以將Span S和標記事件添加到OpenTransaction ,當您給出響應時,中間件將拾取它們,並將其與交易一起發送到APM服務器。這是可變的視圖對象之一,因此您無需每次更改某些內容時都替換請求屬性。
如果您想捕獲並將其Throwable到APM,也可以在中間件堆棧中包含ErrorMiddleware 。它將捕捉到任何Throwable ,並嘗試使其盡可能多地了解。為了給出更多錯誤的上下文,您可以在中間件實例化上註入Context對象。它將以此為基礎建築環境。
有時您想通過請求或響應的數據來豐富交易。為了使之成為可能,請連接OpenTransactionRequestEnrichmentMiddleware和OpenTransactionRequestEnrichmentMiddleware ,並分別注入您的OpenTransactionRequestEnricher和OpenTransactionResponseEnricher OpenTransaction實現
該庫中還包含了一些濃度實現:
RequestHeaderBlacklistEnricher :在Context標題添加到Request中,除非他們的名稱在黑名單中。ResponseHeaderBlacklistEnricher :在Context標題添加到Response中,除非他們的名稱在黑名單中。 顯然,這兩個中間件可以組合。推薦的方法是首先連接TransactionMiddleware ,然後是ErrorMiddleware ,最後是OpenTransactionRequestEnrichmentMiddleware和OpenTransactionRequestEnrichmentMiddleware 。這樣,交易將得到豐富,任何錯誤都將與交易相關,交易持續時間將盡可能現實。
要監視您的緩存電話,請在符合PSR-6的緩存層中包裝您的緩存實現庫。它將為每個調用創建一個跨度。
在調用CacheItemPoolInterface的任何方法之前,請確保注入OpenTransaction ,請參閱下面的“開放事務”部分。
要監視您對外部HTTP服務的呼叫,請將您的HTTPLUG客戶端包裝在HttpClientWrapper中。它將為您發送的每個HTTP請求創建一個跨度。
包裝器將在請求轉發之前,將X-Correlation-ID標頭添加到請求。標題將包含一個UUID,它使您有機會在整個基礎架構中將級聯的HTTP請求相關聯。該庫中的中間件將拾取標題,並將相關ID添加到交易上下文的標籤中。如果在標題中找不到相關ID,則將創建一個新的。
在調用HttpClientInterface的任何方法之前,請確保注入OpenTransaction ,請參閱下面的“開放事務”部分。
該庫中的幾個便利性課程需要使用OpenTransaction才能運行。所有這些類將實現OpenTransactionEnricher接口。它是一個故意的選擇,而不是僅僅因為當時不存在構造函數中的OpenTransaction ,它需要創建運行時信息。
如果您使用此庫中的中間件,則可以從請求屬性中獲取OpenTransaction ,或者可以創建自己的中間件,然後將其轉換為可以通過Client發送到APM服務器的Transaction 。