Einfaches Korrelieren von Logdaten und APM-Traces für bessere Observability mit dem Elastic Stack | Elastic Blog
Engineering

Einfaches Korrelieren von Logdaten und APM-Traces für bessere Observability

APM, das Monitoring der Anwendungsleistung, und Logging ermöglichen essenzielle Einblicke in Ihr Ökosystem. Werden die so gewonnenen Informationen mit Kontext zusammengeführt, lassen sich daraus entscheidende Schlussfolgerungen für die Lösung konkreter Anwendungsprobleme ziehen.

Je komplexer die zu analysierenden Logdaten sind, desto schwieriger kann es mit den herkömmlichen Tools werden, zu den relevanten Stellen zu gelangen. Mit Elastic Observability (mit dem Elastic Stack im Rücken) ist das Korrelieren von Logdaten mit APM so einfach wie ein paar Klicks in Kibana. Über Ihre Webanwendung können Sie ohne viel Aufwand die Logdaten für eine konkrete Anforderung eines Nutzers bei einer beliebigen Transaktion einsehen.

Aufrufen von Trace-Logdaten in Elastic APM

Unten sehen Sie einen Screenshot von Elastic APM mit einer Aufschlüsselung aller Operationen, die mit einer bestimmten Transaktion verbunden sind. Wenn wir auf Actions klicken

Wählen Sie rechts oben in der Trace-Übersicht in Elastic APM „Actions“ aus.

und Show trace logs auswählen,

Klicken Sie auf „Show trace logs“.

erhalten wir Folgendes:

Jetzt sehen Sie die mit dem Trace in Elastic APM verknüpften Logs.

Diese Meldungen enthalten zusätzliche Details, die zu dieser konkreten Transaktion gehören. So detailreich kann nur ein Log sein, da weder in APM noch anderswo beim Monitoring genügend Platz dafür ist. Da der Elastic Stack diese verschiedenen Facetten des Monitorings in sich integriert, haben wir nun ausreichend Flexibilität, was das Hinzufügen zusätzlicher Details zu unseren Transaktionen angeht. Die Tatsache, dass alle diese unterschiedlichen Datentypen in einem gemeinsamen Datenspeicher residieren, ermöglicht es uns, unsere Untersuchungen schnell zu pivotieren.

Installieren und Konfigurieren des Elastic APM-Python-Agents

Vielleicht sagen Sie sich: „Das ist ja alles schön und gut, aber wie schaffe ich es, bei mir im System ähnliche Ergebnisse zu erzielen?“

Ich zeige Ihnen anhand eines Beispiels, wie Sie Logdaten und APM-Traces integrieren können. Unten sehen Sie den relevanten Code aus der Python-Anwendung, die in den Screenshots oben zu sehen ist. Wir brauchen eine Möglichkeit, jeder Anforderung, die Nutzer an unsere Anwendung senden, Informationen hinzuzufügen.

Aber schön der Reihe nach: Zunächst einmal müssen wir den Elastic APM-Python-Agent installieren. Wir fügen ihn als Abhängigkeit hinzu. Es handelt sich hierbei um eine Flask-Anwendung, was durch den Zusatz [flask] in eckigen Klammern zum Namen der Abhängigkeit deutlich wird. Details zu den einzelnen unterstützten Frameworks können der Dokumentation für den Python-Agent entnommen werden.

# In requirements.txt 
elastic-apm[flask]==5.3.3

Als Erstes müssen wir dafür sorgen, dass wir die richtigen Importe vorliegen haben:

# In app.py 
import logging 
from elasticapm.contrib.flask import ElasticAPM 
from elasticapm.handlers.logging import Formatter

Anschließend konfigurieren wir den Python-Agent so, dass er Informationen an den APM-Server sendet:

# In app.py 
app = Flask(__name__)  # Anwendung wie üblich initialisieren 
app.config['ELASTIC_APM'] = { 
  'SERVICE_NAME': 'foodbankhero', 

  # Benutzerdefinierte URL für den APM-Server festlegen (Standard: http://localhost:8200) 
  'SERVER_URL': 'http://localhost:8200' 

  # Zu verwenden, wenn APM-Server ein Token benötigt 
  # Der APM-Server kann aus Sicherheitsgründen ein Token benötigen, um zu verhindern, dass er von Dritten mit Zufallsdaten zugeschüttet wird. 
  # 'SECRET_TOKEN': '' 
} 
apm = ElasticAPM(app)  # Das ist die magische Zeile, die unsere Flask-Anwendung mit APM instrumentiert.

Konfigurieren Ihrer Logs

Jetzt gehts daran, die Logs so zu konfigurieren, dass sie mit APM-Traces korreliert werden können, wie in den Screenshots oben gezeigt:

# In app.py 
fh = logging.FileHandler('foodbankhero.log') 

# Wir haben vorher einen individuellen Formatter aus dem Python-Agent importiert. 
formatter = Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") 
fh.setFormatter(formatter) 
logging.getLogger().addHandler(fh) 

# … irgendwo tief drin in der Anwendung ... 
logging.getLogger().info(‘Foodbank {} needs {} items’.format(id, len(items))) 
logging.getLogger().info(‘Returning {} foodbank records’.format(len(results)))

Ihre Logs müssten jetzt ungefähr so aussehen:

2020-05-12 01:57:14,029 - flask.app - INFO - 172.22.0.1 - - [12/May/2020 01:57:15] "GET / HTTP/1.1" 200 - | elasticapm transaction.id=f31f884b961a6089 trace.id=02bd57be0eff9979c94951d0d53e80c0 span.id=None

Bei dieser Konfiguration wird jede Logzeile für jede Anforderung durch Tracing-Informationen ergänzt. Das gilt sogar für Anforderungen von statischen Assets (sofern die Anwendung so konfiguriert ist, dass sie sie bedient). Dazu ein Beispiel:

2020-05-12 01:57:14,029 - werkzeug - INFO - 172.22.0.1 - - [12/May/2020 01:57:14] "GET /favicon.ico HTTP/1.1" 404 - | elasticapm transaction.id=f31f884b961a6089  
trace.id=02bd57be0eff9979c94951d0d53e80c0 span.id=None

Elastic APM selbst ausprobieren

Möchten Sie traditionelle Silos aufbrechen und Probleme durch Kontext schneller lösen? Mit Elastic Observability können Sie Daten ganz einfach korrelieren und blitzschnell zur jeweils erforderlichen Stelle navigieren.

Erleben Sie mit eigenen Augen, wie einfach es ist, mit Elastic APM loszulegen – alles, was Sie brauchen, um mit dem Senden von Daten an Elasticsearch zu beginnen, sind ein paar zusätzliche Codezeilen in Ihrem Projekt. Nutzen Sie die Möglichkeit, Elastic Cloud kostenlos auszuprobieren, um Ihre Logdaten und APM-Traces miteinander zu korrelieren.