Release 6.2 des elastischen Stapels Säge in den Morgengrauen der Anwendungsleistung Überwachung. APM -Agenten in mehreren Sprachen wurden damit veröffentlicht, aber irgendwie gehörte PHP nicht unter sich. Diese Bibliothek fügt diesen APM -Agenten hinzu, sodass wir unsere Anwendungsleistungsmessungen gerne an den elastischen APM -Server versenden können.
Achtung: Alpha
Derzeit befindet sich die Bibliothek in der Alpha -Phase, was bedeutet, dass sich die Schnittstelle möglicherweise noch ändert und sie nicht für die Produktionsnutzung bereit ist. Ich würde es sehr schätzen, wenn Sie die aktuelle Version ausprobieren und alle Probleme melden, auf die Sie stoßen.
Fügen Sie die Bibliothek Ihrer Anwendung mit Composer hinzu:
composer require techdeco/elastic-apm-agentDies funktioniert jedoch nur, wenn Sie die folgenden virtuellen Pakete implementiert haben (weitere Informationen zu jedem von ihnen unten):
Dies scheint ein bisschen mühsam für Sie zu sein, vielleicht sogar ein bisschen faul von unserer Seite - warum nicht dieses Paket einfach eines auswählen lassen? - Es bietet Ihnen jedoch die größte Flexibilität und eine minimale Wahrscheinlichkeit von Konflikten mit den in Ihrem Projekt bereits verwendeten Paketen.
Nehmen wir an, Sie haben keine dieser Implementierungen in Ihrem Projekt und wählen jeweils Guzzle 6, PHP HTTPs Nachricht und Monolog; Sie können diese Bibliothek mit:
composer require techdeco/elastic-apm-agent
php-http/guzzle6-adapter
php-http/message
monolog/monolog Um Daten an den APM -Server zu senden, benötigt der APM -Agent in dieser Bibliothek einen HTTP -Client. Um Sie nicht zu einer Wahl für einen bestimmten HTTP-Client zu zwingen, hängt die Bibliothek von einer Implementierung der php-http/async-client-implementation ab. Ihr Projekt muss diese Implementierung bereitstellen, für die Sie mögliche Kandidaten auf der PHP-HTTP-Website finden können.
Gleiches gilt dafür, dass Sie keine Wahl für eine bestimmte HTTP-Nachrichtenfabrik zwingen, die Ihr Projekt verlässt, um eine Implementierung von php-http/message-factory-implementation bereitzustellen, für die Sie mögliche Kandidaten auf der PHP-HTTP-Site finden können
Auch für die Protokollierung benötigt dieses Paket eine Implementierung, damit der Kunde Sie benachrichtigen kann, wenn die Dinge seitwärts gehen. Sie finden alle Implementierungen für psr/log-implemtation bei Packagist. Wenn Sie nicht wissen, welches Sie auswählen möchten, ist Monolog hervorragend.
Um der Bibliothek mitzuteilen, wie sie eine Verbindung zum APM -Server herstellt, initialisieren Sie mindestens eine Implementierung von LoggerInterface und einem ClientConfiguration -Objekt und geben Sie sie dem HttplugAsyncClient an. Das HTTP -Client und die Message Factory sind optional. Wenn sie nicht injiziert werden, wird der Kunde versuchen, sie zu entdecken.
$ 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 hat einen wirklich tollen Job gemacht, um nahtlos in viele Sprachen und Frameworks integriert zu werden. Diese Bibliothek hofft, der PHP -Community den gleichen Service zu bieten. Sie können entweder die von der Bibliothek bereitgestellten Bausteine in einer Do-it-yourself-Lösung verwenden oder die Komponenten auf höherer Ebene wie die Middleware verwenden.
Der APM -Server von Elastic nimmt zwei Arten von Ereignissen auf: Transaktionen und Fehler. Sobald Sie den Client erstellt haben, können Sie jeweils ein TechDeCoElasticApmAgentRequestTransaction oder TechDeCoElasticApmAgentRequestError mit diesem Client an den APM -Server senden. Um diese beiden Arten von Anfragen zu erstellen, lesen Sie den TechDeCoElasticApmAgentMessage -Namespace für alle benötigten Komponenten.
Beachten Sie, dass alle Anforderungs- und Nachrichtenobjekte unveränderlich sind, sodass jeder Aufruf einer Methode eine neue Instanz mit einer mutierten Eigenschaft zurückgibt. Arbeiten Sie unbedingt mit dieser neuen Instanz anstelle dessen, die Sie durchgeführt haben.
# 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! Um die Antwortzeit- und Berichtsfehler zu messen (indem Sie Ausnahmen erfassen), können Sie die PSR-15-konforme Middleware an Ihre Anwendung anschließen. Wenn Sie die Transaktion, die Sie an der Anforderung oder Antwort an den APM -Server senden, an den APM -Server anreichern möchten, implementieren Sie den OpenTransactionRequestEnricher oder OpenTransactionResponseEnricher und verbinden Sie die Middleware.
Die TransactionMiddleware injiziert eine OpenTransaction in die weitergeleitete Anforderung unter dem Attributnamen apm-transaction (verweisen Sie jedoch besser darauf mit der konstanten TransactionMiddleware::TRANSACTION_ATTRIBUTE ).
Sie können der OpenTransaction Span S und Ereignisse hinzufügen. Wenn Sie eine Antwort geben, nimmt die Middleware sie zusammen und sendet sie zusammen mit der Transaktion an den APM -Server. Dies ist eines der Ansichtsobjekte, die veränderlich sind , sodass Sie nicht jedes Mal das Anforderungsattribut ersetzen müssen, wenn Sie etwas ändern.
Wenn Sie Throwable S an APM fangen und melden möchten, fügen Sie auch die ErrorMiddleware in Ihren Middleware -Stapel ein. Es wird jedes Throwable fangen und versuchen, so viel Sinn wie möglich zu machen. Um dem Fehler noch mehr Kontext zu geben, können Sie das Context in der Instanziierung der Middleware injizieren. Es wird dies als Basis für den Kontext des Kontexts verwenden.
Manchmal möchten Sie die Transaktion mit Daten aus der Anfrage oder Antwort anreichern. Um dies zu ermöglichen, verbinden Sie die OpenTransactionRequestEnrichmentMiddleware und OpenTransactionRequestEnrichmentMiddleware und injizieren Sie Ihre Implementierungen von OpenTransactionRequestEnricher und OpenTransactionResponseEnricher s, um den OpenTransaction Informationen hinzuzufügen
In dieser Bibliothek sind auch einige Anreicherimplementierungen enthalten:
RequestHeaderBlacklistEnricher : Fügt der Request im Context Header hinzu, außer wenn sich ihr Name in einer schwarzen Liste befindet.ResponseHeaderBlacklistEnricher : Fügt der Response im Context Header hinzu, außer wenn sich ihr Name in einer schwarzen Liste befindet. Offensichtlich kann die beiden Middleware kombiniert werden. Die empfohlene Möglichkeit, dies zu tun, besteht darin, zuerst TransactionMiddleware , dann die ErrorMiddleware und schließlich die OpenTransactionRequestEnrichmentMiddleware und OpenTransactionRequestEnrichmentMiddleware anzuschließen. Auf diese Weise wird die Transaktion angereichert, jeder Fehler korreliert mit der Transaktion und die Transaktionsdauer ist so realistisch wie möglich.
Um Ihre Caching-Anrufe zu überwachen, wickeln Sie Ihre Caching-Implementierungsbibliothek in die PSR-6-konforme Caching-Schicht ein. Für jeden Anruf wird eine Spannweite erstellt.
Stellen Sie vor dem Aufrufen von Methoden des CacheItemPoolInterface sicher, dass Sie eine OpenTransaction injizieren , siehe Abschnitt Open Transaction unten.
Um Ihre Anrufe bei externen HTTP -Diensten zu überwachen, wickeln Sie Ihren HTTPLUG -Client in den HttpClientWrapper ein. Für jede von Ihnen gesendete HTTP -Anfrage wird eine Spannweite erstellt.
Der Wrapper fügt den X-Correlation-ID Header der Anfrage vor, die ihn weiterleitet. Der Header enthält eine UUID und bietet Ihnen die Möglichkeit, HTTP -Anfragen in Ihrer Infrastruktur zu korrelieren. Die Middleware in dieser Bibliothek nimmt den Header auf und fügt die Korrelations -ID zu den Tags des Kontextes der Transaktion hinzu. Wenn im Header keine Korrelations -ID gefunden werden kann, wird eine neue erstellt.
Stellen Sie vor dem Aufrufen von Methoden des HttpClientInterface sicher, dass Sie eine OpenTransaction injizieren , siehe Abschnitt Open Transaction unten.
Einige der Convenience -Kurse in dieser Bibliothek benötigen eine OpenTransaction , bevor sie funktionieren können. Alle diese Klassen werden die OpenTransactionEnricher -Schnittstelle implementieren. Es war eine absichtliche Entscheidung, einen Setter zu verwenden, anstatt die OpenTransaction im Konstruktor zu verlangen, einfach weil er zu diesem Zeitpunkt nicht vorhanden ist, benötigt sie Laufzeitinformationen, die erstellt werden müssen.
Sie können die OpenTransaction entweder von einem Anforderungsattribut abrufen, wenn Sie die Middleware in dieser Bibliothek verwenden, oder Sie können Ihre eigene erstellen und später in eine Transaction konvertieren, die Sie über den Client an den APM -Server senden können.