In einem unserer letzten Blogposts haben wir Ihnen gezeigt, wie Sie mit der kostenlosen und offenen Tier von Elastic Observability loslegen können. Hier erfahren Sie nun, wie Sie Ihr Deployment so erweitern können, dass Sie auch Metriken aus dem Monitoring der Anwendungsleistung (Application Performance Monitoring, APM) zusammentragen können, um auf diese Weise Daten in Ihrem Observability-Cluster zu verfolgen oder zu „tracen“ – kostenlos!
Was ist APM?
APM (Application Performance Monitoring) gibt Ihnen Aufschluss darüber, womit Ihre Anwendungen ihre Zeit verbringen, was sie tun, welche anderen Anwendungen oder Dienste sie aufrufen und auf welche Fehler oder Ausnahmen sie stoßen.
Außerdem können Sie mithilfe von APM auch den Verlauf und die Trends bei den wichtigsten Leistungsindikatoren wie Latenz und Durchsatz sowie Informationen zu Transaktionen und Abhängigkeiten einsehen:
Ganz gleich, ob Sie Alerts für SLA-Verletzungen einrichten, versuchen, die Auswirkungen Ihrer neuesten Version abzuschätzen, oder entscheiden wollen, was als Nächstes verbessert werden soll – APM kann Ihnen bei der Ursachenanalyse helfen, damit Sie Ihren Nutzer:innen ein bestmögliches Nutzungserlebnis bieten und Ihre MTTR (Mean Time to Resolution) gen Null senken können.
Logische Architektur
Elastic APM nutzt die APM-Integration in Elastic Agent, die Trace- und Metrikdaten aus Anwendungen, die mit APM-Agents instrumentiert sind, an einen Elastic Observability-Cluster weiterleitet. Dabei werden unterschiedliche Agent-Varianten unterstützt:
- Native Elastic APM-Agents, die für mehrere Sprachen verfügbar sind, wie z. B. Java, .NET, Go, Ruby, Python, Node.js, PHP und clientseitiges JavaScript
- Code, der mit OpenTelemetry instrumentiert ist
- Code, der mit OpenTracing instrumentiert ist
- Code, der mit Jaeger instrumentiert ist
In diesem Blogpost zeigen wir zur Demonstration die Instrumentierung von Code mit dem nativen Elastic APM-Python-Agent, aber die allgemeinen Schritte sind für die meisten anderen Sprachen recht ähnlich.
Wichtig: Es gibt einen deutlichen Unterschied zwischen dem Elastic APM-Agent und dem Elastic Agent. Wie in der Grafik oben klar wird, handelt es sich dabei um völlig verschiedene Komponenten, die nicht verwechselt werden dürfen.
Elastic Agent installieren
Der erste Schritt besteht darin, den Elastic Agent zu installieren. Dazu muss Fleet installiert sein, es ist aber auch möglich, den Elastic Agent als eigenständige Komponente zu installieren. Installieren Sie den Elastic Agent an einem beliebigen Ort. Wie das geht, erfahren Sie hier. Auf diese Weise erhalten Sie einen Endpoint für die APM-Integration, den Sie nutzen können. In Elastic Cloud ist dieser Schritt nicht erforderlich, da wir die APM-Integration für Sie hosten. Kontrollieren Sie, dass der Elastic Agent funktioniert, indem Sie Folgendes ausführen:
curl <ELASTIC_AGENT_HOSTNAME>:8200
Instrumentieren von Beispielcode mit einem Elastic APM-Agent
Die Vorgehensweise bei den Agents für die verschiedenen Sprachen ist zwar je nach Programmiersprache unterschiedlich, aber der Ablauf ähnelt sich im Großen und Ganzen. Zuerst fügen Sie die Abhängigkeit für den Agent in der nativen Spezifikation der Sprache hinzu, dann konfigurieren Sie den Agent so, dass er weiß, wie er die APM-Integration findet.
Sie haben die freie Wahl, welche Agent-Variante Sie ausprobieren möchten. Ich zeige Ihnen hier die Vorgehensweise bei Python anhand eines von mir erstellten Python-Beispiels.
Beispielcode abrufen (oder eigenen Code verwenden)
Zunächst klone ich das GitHub-Repository, dann wechsle ich das Verzeichnis:
git clone https://github.com/davidgeorgehope/PythonElasticAPMExample
cd PythonElasticAPMExample
Abhängigkeit hinzufügen
Das Hinzufügen der Elastic APM-Abhängigkeit ist einfach: Wenn Sie sich die Datei app.py aus dem GitHub-Repository ansehen, werden Ihnen darin die folgenden Codezeilen auffallen:
import elasticapm
from elasticapm import Client
app = Flask(__name__)
app.config["ELASTIC_APM"] = { "SERVICE_NAME": os.environ.get("APM_SERVICE_NAME", "flask-app"), "SECRET_TOKEN": os.environ.get("APM_SECRET_TOKEN", ""), "SERVER_URL": os.environ.get("APM_SERVER_URL", "http://localhost:8200"),}
elasticapm.instrumentation.control.instrument()
client = Client(app.config["ELASTIC_APM"])
Die Python-Bibliothek für Flask ist in der Lage, Transaktionen automatisch zu erkennen, aber Sie können Transaktionen auch wie folgt im Code starten, wie wir es in diesem Beispiel getan haben:
@app.route("/")
def hello():
client.begin_transaction('demo-transaction')
client.end_transaction('demo-transaction', 'success')
Agent konfigurieren
Die Agents müssen Anwendungs-Trace-Daten an die APM-Integration senden und dazu muss die Integration erreichbar sein. Ich habe den Elastic Agent so konfiguriert, dass er die IP-Adresse meines lokalen Hosts abhört, damit alle Komponenten in meinem Subnetz Daten an ihn senden können. Wie Sie dem unten stehenden Code entnehmen können, verwenden wir docker-compose.yml, um die Konfiguration über Umgebungsvariablen beizusteuern. Diese Variablen müssen natürlich an Ihre eigene Elastic-Installation angepasst werden.
# docker-compose.yml
version: "3.9"
services:
flask_app:
build: .
ports:
- "5001:5001"
environment:
- PORT=5001
- APM_SERVICE_NAME=flask-app
- APM_SECRET_TOKEN=your_secret_token
- APM_SERVER_URL=http://host.docker.internal:8200
Einige Anmerkungen zu dem, was Sie oben sehen:
- service_name: Wenn Sie diese Angabe weglassen, wird standardmäßig der Name der Anwendung verwendet. Mit diesem Parameter überschreiben Sie die Standardeinstellung.
- secret_token: Mit geheimen Token können Sie Anfragen beim APM-Server autorisieren, Voraussetzung dafür ist aber, dass der APM-Server mit SSL/TLS eingerichtet ist und dass ein geheimes Token festgelegt wurde. Wir verwenden zwischen Agents und APM-Server kein HTTPS, daher kommentieren wir dies aus.
- server_url: Damit legen wir fest, wie der Agent die APM-Integration innerhalb von Elastic Agent erreichen kann. Sie müssen diese Angabe durch den Namen oder die IP-Adresse Ihres Hosts ersetzen, auf dem Elastic Agent ausgeführt wird.
Nachdem wir nun die Konfiguration auf der Elastic APM-Seite abgeschlossen haben, befolgen wir einfach die Schritte in der README, um das Ganze zu starten.
docker-compose up --build -d
Der Build-Schritt braucht ein paar Minuten.
Wenn Sie zur laufenden Beispielanwendung gehen möchten, rufen Sie http://localhost:5001 auf. Wirklich viel tut das Beispiel nicht, aber es generiert ein paar APM-Daten. Um etwas Last zu erzeugen, können Sie die Daten mehrmals neu laden oder ein schnelles kleines Skript ausführen:
#!/bin/bash
# load_test.sh
url="http://localhost:5001"
for i in {1..1000}
do
curl -s -o /dev/null $url
sleep 1
done
Das Skript sorgt dafür, dass die Seiten sekündlich neu geladen werden.
Kehren Sie zu Kibana zurück und gehen Sie zur APM-App (indem Sie auf das Hamburger-Symbol und dann auf APM klicken). Sie müssten dann unseren neuen Dienst flask-app sehen (ich lasse meinen laufen, damit ein paar mehr historische Daten zu sehen sind):

Die Seite „Service Overview“ bietet einen zentralen Überblick über den Zustand des jeweiligen Dienstes mit allen Informationen, die Sie benötigen. Wenn Sie Entwickler:in oder SRE sind, finden Sie auf dieser Seite Antworten auf Fragen wie die Folgenden:
- Wie hat sich ein neues Deployment auf die Performance ausgewirkt?
- Welche Transaktionen sind am stärksten betroffen?
- Wie korreliert die Performance mit der zugrunde liegenden Infrastruktur?
Diese Ansicht enthält eine Liste aller Anwendungen, die im angegebenen Zeitraum (in diesem Fall die letzten 15 Minuten) Anwendungs-Trace-Daten an Elastic APM gesendet haben. Außerdem finden Sie hier Sparklines mit Minigraphen zu Latenz, Durchsatz und Fehlerrate. Wenn wir auf flask-app klicken, gelangen wir zur Seite Service Overview, auf der die verschiedenen Transaktionen innerhalb des Dienstes zu sehen sind (zur Erinnerung: mein Skript greift auf den /-Endpoint zu, wie im Abschnitt Transactions zu sehen ist). Auf diese Weise erhalten wir größere Graphen zu Latenz, Durchsatz, Fehlern und Fehlerraten.

Wenn Sie echte Anwendungen unter echter Last instrumentieren, werden Sie deutlich mehr Konnektivität (und Fehler!) sehen.
Wenn wir in der Transaktionsansicht auf eine Transaktion klicken, in diesem Fall auf demo-transaction in unserer Beispiel-App, können wir genau sehen, welche Operationen aufgerufen wurden:

Dazu gehören auch detaillierte Informationen zu den Aufrufen externer Dienste, z. B. zu Datenbankabfragen:

Wie geht es weiter?
Nachdem Sie nun Ihren Elastic Observability-Cluster zum Laufen gebracht haben und quasi out of the box Anwendungs-Trace-Daten sammeln, empfehle ich Ihnen, sich mit den öffentlichen APIs für die von Ihren Anwendungen verwendeten Sprachen zu beschäftigen, mit denen Sie Ihre APM-Daten auf die nächste Stufe heben können. Die APIs ermöglichen es Ihnen, benutzerdefinierte Metadaten hinzuzufügen, benutzerdefinierte Spans zu erstellen und vieles mehr. Die Spezifikationen für die öffentlichen APIs für die verschiedenen APM-Agent-Varianten (für Java, Ruby, Python usw.) finden Sie auf den Dokumentationsseiten des APM-Agents.
Wenn Sie mehr über Elastic APM erfahren möchten, sehen Sie sich unser Webinar zur Rolle von Elastic APM beim Umstieg auf cloudnative Architekturen an. Darin werden noch weitere Möglichkeiten vorgestellt, wie Elastic APM Ihnen in Ihrem Ökosystem helfen kann.
Wenn Sie lieber uns das Hosten Ihres Observability-Clusters überlassen möchten, können Sie den Elasticsearch Service auf Elastic Cloud kostenlos ausprobieren. Ändern Sie in diesem Fall Ihre Agents so, dass Sie auf Ihren neuen Cluster verweisen.
Englische Originalversion ursprünglich veröffentlicht am 5. Mai 2021; aktualisiert am 6. April 2023.