Engineering

Wie Daten über Logstash oder Kafka aus Elastic APM gesendet werden können

In modernen Deployments haben Anwendungsserver oft eine kurze Lebensdauer oder verwenden unzuverlässigere Hardware (präemptive VMs mit niedriger Priorität, Spot-Instances) als andere Komponenten, wie Nachrichtenwarteschlangen und Datenbanken. In diesen Fällen ist es am besten, die Daten schnell in ein verlässlicheres System zu übertragen.

Seit Release 6.4.0 können Daten durch APM Server an Logstash oder Kafka gesendet werden. Dadurch wird die benötigte Zuverlässigkeit diesen Systemen überlassen. Durch die Verwendung von Logstash können Sie Ihre APM-Daten auch mit einem der vielen verfügbaren Logstash-Plugins anreichern.

An dieser Stelle behandeln wir die Konfiguration und gehen auf einige Vorbehalte ein, Daten vor der Aufnahme in Elasticsearch durch ein anderes System zu senden.

  1. Logstash für die Ausgabe an Elasticsearch konfigurieren
  2. Elastic APM Server konfigurieren, um an Logstash zu senden
  3. Elasticsearch konfigurieren
  4. Optional Quellzuordnungen einschließen
  5. Kafka hinzufügen

Logstash konfigurieren

Fügen Sie zuerst eine Pipeline hinzu, um Logstash so zu konfigurieren, dass es Ereignisse von APM Server mit dem Beats/Lumberjack-Protokoll empfängt und sie an Elasticsearch weitersendet.

input {
   beats {
        id => "apm-server"
        port => 5044
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "apm-%{[beat][version]}-%{[processor][event]}-%{+YYYY.MM.dd}"
  }
}

Pro Ereignistyp (Transaktion, Span, usw.) wird an jedem Tag ein Index erstellt, genauso wie ihn die Standardkonfiguration von APM Server erstellen würde. Quellzuordnungen verursachen eine kleine Schwierigkeit, auf die wir in diesem Blogpost später eingehen.

Wer genauer hinschaut, könnte sich fragen, was die Verweise auf Beat bedeuten. APM Server baut auf dem Beats-Framework auf und reicht daher für Ereignisse dieselben Metadaten weiter. APM-Daten können also in derselben Logstash-Instanz wie andere Beat-Daten mit einem bedingten [@metadata][beat] == "apm-server“ abgewickelt werden.

APM Server konfigurieren

Da Logstash nun konfiguriert ist, aktualisieren Sie apm-server.yml von APM Server, damit Ereignisse entsprechend ausgegeben werden:

output.elasticsearch:
  enabled: false
output.logstash
  enabled: true
  hosts: ["logstash:5044"]

Zusätzliche Optionen wie Backoff, Proxy und SSL-Einstellungen finden Sie in der Elastic APM Server-Dokumentation.

Wenn Sie Monitoring in APM Server aktiviert haben, legen Sie auf jeden Fall die folgenden Einstellungen fest:

xpack.monitoring.elasticsearch:
  enabled: true
  hosts: ["elasticsearch:9200"]

Dadurch fließt das Monitoring von APM Server weiterhin direkt in Elasticsearch.

Elasticsearch konfigurieren

Nun fehlt nur noch ein Schritt, bevor wir APM Server starten können. Elasticsearch muss zuerst wissen, wie es APM-Daten so speichern soll, wie es die APM-Benutzeroberfläche erwartet. Es braucht also eine Indexvorlage. Für das Laden dieser Vorlage gibt es zwei Optionen.

Wenn Sie einen APM Server temporär auf Elasticsearch weisen können, kann das wie folgt erledigt werden:

 apm-server setup --template

Exportieren Sie andernfalls die Vorlage zuerst aus APM Server:

apm-server export template > apm-6.4.2.tmpl.json

Laden Sie sie dann in Elasticsearch. Mit Curl kann das wie folgt erreicht werden:

curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_template/apm-6.4.2 -d @apm-6.4.2.tmpl.json

Diese Befehle sollten melden, ob Operationen erfolgreich waren oder gescheitert sind. Wenn Sie bestätigen möchten, ob die Vorlage erfolgreich geladen wurde, formulieren Sie die Anfrage _template/apm-*. Dies sollte eine Dokumentmenge wie die folgende zurückgeben:

{
  "apm-6.4.2": {
    "order": 1,
    "index_patterns": [
      "apm-6.4.2-*"
    ],
...

Beachten Sie, dass das Indexmuster der Konfiguration im Logstash-Schritt entspricht. Achten Sie auch darauf, dass Versionsinformationen enthalten sind. Dieser Einrichtungsschritt sollte also

  1. mit genau derselben Version von APM Server ausgeführt werden, die sich mit Logstash verbindet.
  2. bei jedem Upgrade von APM Server wiederholt werden.

Verwenden Sie es

Jetzt starten Sie APM Server und beginnen, das Anwendungsverhalten zu analysieren.

Quellzuordnungen

Quellzuordnungen werden verwendet, um verborgenen Code wieder seinen ursprünglichen Quellen zuzuordnen. Am häufigsten werden sie zur Umkehrung der Verkleinerung von JavaScripts genutzt.

Quellzuordnungen müssen besonders beachtet werden, falls die APM Server-Ausgabe nicht Elasticsearch ist. Unabhängig davon, wie sie Elasticsearch letztendlich erreichen, müssen sie dort gespeichert werden, damit APM Server sie nutzen kann. Um die Speicherung von Quellzuordnungen zu konfigurieren, legen Sie rum.source_mapping.elasticsearch beispielsweise wie folgt fest:

apm-server:
  rum:
    source_mapping:
      elasticsearch:
        hosts: ["elasticsearch:9200"]
        index_pattern: "apm-*-sourcemap*"

Das teilt APM Server mit, Quellzuordnungen in Indizes zu suchen, die apm-*-sourcemap* entsprechen.

Quellzuordnungen können zwar über Logstash hochgeladen werden, wir empfehlen aber, sie während Ihres Deployment-Prozesses direkt nach Elasticsearch zu senden. So stellen Sie sicher, dass sie gespeichert werden, bevor Ereignisse eintreffen, die zugeordnet werden müssen. Wenn das nicht möglich ist, entspricht die Logstash-Konfiguration in diesem Blogpost dem Standard-Indexmuster, das zum Abrufen von Quellzuordnungen verwendet wird, sobald diese angewendet werden müssen. Zusätzliche Änderungen sind also nicht notwendig.

Kafka dem Datenfluss hinzufügen

Kafka kann auch dazu dienen, Ereignisse zu puffern, die von APM Server ausgegeben und auf Elasticsearch übertragen werden sollen. Eine einfache APM Server-Konfiguration mit Kafka sieht so aus:

output.kafka:
  enabled: true
  hosts: ["kafka:9092"]
  topics:
    - default: 'apm'
      topic: 'apm-%{[context.service.name]}'

Hier wird die Verwendung von einem Thema pro Service gezeigt, was aber nicht erforderlich ist. Zusätzliche Konfigurationsoptionen sind in der Dokumentation beschrieben.

Sobald Ereignisse in Kafka fließen, kann Logstash so konfiguriert werden, dass es sie in Elasticsearch zieht, Beispiel:

input {
  kafka {
    id => "apm-server-kafka"
    bootstrap_servers => ["kafka:9092"]
    topics_pattern => "apm.*"
    codec => "json"
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "apm-%{[beat][version]}-%{[processor][event]}-%{+YYYY.MM.dd}"
  }
}

Pro Ereignistyp (Transaktion, Span, usw.) wird wieder an jedem Tag ein Index erstellt, genauso wie ihn die Standardkonfiguration von APM Server erstellen würde. Weitere Optionen für das Kafka-Input-Plugin von Logstash sind in der Dokumentation beschrieben.

Probieren Sie es aus

APM Server bietet Ihnen eine gewisse Flexibilität bei der Versendung Ihrer APM-Daten mit Logstash oder Kafka. Probieren Sie es aus, und bringen Sie Ihr Feedback im Diskussionsforum ein. Wir freuen uns immer über Beiträge. Schauen Sie sich also gerne den Quellcode an, und öffnen Sie eine Anfrage oder einen Pull Request.strong text