Cloud Monitoring mit Datadog in Apache APISIX

API7.ai

November 12, 2021

Ecosystem

Titelbild

Mit zunehmender Komplexität von IT-Produkten und der Entwicklung von Anwendungen für Endverbraucher wird die Überwachung zu einem integralen Bestandteil jeder Anwendungsbereitstellung. Darüber hinaus ist eine effektive Überwachung von entscheidender Bedeutung, um die endlose Nachfrage nach schnellen Upgrade-Zyklen zu erfüllen, während gleichzeitig Stabilität, optimierte Leistung und ein perfektes Gleichgewicht zwischen Service-Level-Indikatoren (SLI), Service-Level-Zielen (SLO) und Service-Level-Vereinbarungen (SLA) gewährleistet werden.

Als Cloud-API-Management-Produkt entkoppelt Apache APISIX die Beobachtbarkeitsaspekte von der Anwendung, was den Entwicklern den Vorteil bietet, Anwendungen zu erstellen, die sich ausschließlich auf die Geschäftslogik konzentrieren, während Apache APISIX die Beobachtbarkeit für die Plattform ihrer Wahl übernimmt.

Apache APISIX hat kürzlich ein neues Plugin veröffentlicht: APISIX-Datadog, um eine tiefergehende Integration mit Datadog zu ermöglichen. Dieser Artikel stellt das APISIX-Datadog-Plugin und seine Funktionen vor.

Wie das APISIX-Datadog-Plugin funktioniert

APISIX-Datadog-Plugin-Architektur

Das APISIX-Datadog-Plugin sendet seine benutzerdefinierten Metriken an den DogStatsD-Server, der mit dem Datadog-Agent über eine UDP-Verbindung gebündelt ist. DogStatsD ist im Grunde eine Implementierung des StatsD-Protokolls. Es sammelt die benutzerdefinierten Metriken für den Apache APISIX-Agent, aggregiert sie zu einem einzigen Datenpunkt und sendet sie an den konfigurierten Datadog-Server. Um mehr über DogStatsD zu erfahren, besuchen Sie bitte die DogStatsD-Dokumentation.

Wenn APISIX-Datadog aktiviert ist, exportiert der Apache APISIX-Agent die folgenden Metriken für jeden Anfrage-Antwort-Zyklus an den DogStatsD-Server:

MetriknameStatsD-TypBeschreibung
Request CounterCounterAnzahl der empfangenen Anfragen.
Request LatencyHistogramZeit, die zur Bearbeitung der Anfrage benötigt wird (in Millisekunden).
Upstream latencyHistogramZeit, die seit der Weiterleitung der Anfrage an den Upstream-Server bis zum Empfang einer Antwort benötigt wird (in Millisekunden).
APISIX LatencyHistogramZeit, die der APISIX-Agent zur Bearbeitung der Anfrage benötigt (in Millisekunden).
Ingress SizeTimerGröße des Anfragekörpers in Bytes.
Egress SizeTimerGröße des Antwortkörpers in Bytes.

Die Metriken werden mit den folgenden Tags an den DogStatsD-Agent gesendet. Wenn es keinen geeigneten Wert für ein bestimmtes Tag gibt, wird das Tag einfach weggelassen.

MetriknameBeschreibung
route_nameName, der in der Routenschemadefinition angegeben ist. Wenn nicht vorhanden, wird auf den Routen-ID-Wert zurückgegriffen.
service_idWenn eine Route mit der Abstraktion eines Dienstes erstellt wurde, wird die entsprechende Dienst-ID verwendet.
consumerWenn die Route einen verknüpften Consumer hat, wird der Benutzername des Consumers als Tag hinzugefügt.
balancer_ipIP des Upstream-Balancers, der die aktuelle Anfrage verarbeitet hat.
response_statusHTTP-Antwortstatuscode.
schemeSchema, das für die Anfragen verwendet wurde, wie HTTP, gRPC, gRPCs usw.

Das Plugin verwaltet einen Puffer mit einem Timer. Wenn der Timer abläuft, sendet das APISIX-Datadog-Plugin die gepufferten Metriken als Batch an den lokal laufenden DogStatsD-Server. Dieser Ansatz ist weniger ressourcenintensiv (obwohl dies möglicherweise unbedeutend ist, da UDP-Sockets sehr leichtgewichtig sind), indem derselbe UDP-Socket wiederverwendet wird, und überlastet das Netzwerk nicht ständig, da der Timer konfiguriert werden kann.

Schritte zum Ausführen des Datadog-Agents

  1. Wenn Sie Datadog bereits in Ihrer Infrastruktur verwenden, müssen Sie einen Datadog-Agent in Ihren Systemen installiert haben. Dies kann entweder ein Docker-Container, ein Pod oder ein Binär für den jeweiligen Paketmanager sein. In diesem Fall sind Sie bereits bereit. Stellen Sie nur sicher, dass der Port 8125/udp durch die Firewall (falls vorhanden) zugelassen ist, d.h. genauer gesagt, dass der Apache APISIX-Agent den Port 8125 des Datadog-Agents erreichen kann. Sie können diesen Unterabschnitt überspringen.

Um mehr darüber zu erfahren, wie Sie einen vollständigen Datadog-Agent installieren, besuchen Sie hier.

  1. Wenn Sie neu bei Datadog sind
    1. Erstellen Sie zunächst ein Konto, indem Sie www.datadoghq.com besuchen.
    2. Generieren Sie einen API-Schlüssel. API-Schlüssel generieren
  2. Das APISIX-Datadog-Plugin benötigt nur die DogStatsD-Komponente von datadog/agent, da das Plugin Metriken asynchron an den DogStatsD-Server sendet, der dem StatsD-Protokoll über einen Standard-UDP-Socket folgt. Aus diesem Grund empfiehlt APISIX die Verwendung des eigenständigen datadog/dogstatsd-Images anstelle des vollständigen Agents. Es ist extrem leichtgewichtig (nur ~11 MB groß) im Vergleich zu ~2,8 GB des datadog/agent-Images.

Um es als Container auszuführen:

# pull the latest image
docker pull datadog/dogstatsd:latest
# run a detached container
docker run -d --name dogstatsd-agent -e DD_API_KEY=<Your API Key from step 2> -p 8125:8125/udp  datadog/dogstatsd

Wenn Sie Kubernetes in Ihrer Produktionsumgebung verwenden, können Sie dogstatsd als Daemonset oder als Multi-Container-Pod neben dem Apache APISIX-Agent bereitstellen.

Verwendung von Datadog mit Apache APISIX

Aktivierung des APISIX-Datadog-Plugins

Das folgende Beispiel zeigt, wie das Datadog-Plugin für eine bestimmte Route aktiviert wird. Wir gehen davon aus, dass Ihr dogstatsd-Agent bereits läuft.

# enable plugin for a specific route
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
        "datadog": {}
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:1980": 1
        }
    },
    "uri": "/hello"
}'

Jetzt werden alle Anfragen an den Endpunkt /hello die oben genannten Metriken generieren und an den lokalen DogStatsD-Server des Datadog-Agents senden.

Benutzerdefinierte Konfiguration

In der Standardkonfiguration erwartet das Plugin, dass der DogStatsD-Dienst unter 127.0.0.1:8125 verfügbar ist. Wenn Sie die Konfiguration aktualisieren möchten, aktualisieren Sie bitte die Plugin-Metadaten:

Metadaten-Schema

NameTypErforderlichStandardBeschreibung
hostsstringoptional"127.0.0.1"Die Host-Adresse des DogStatsD-Servers
portintegeroptional8125Der Host-Port des DogStatsD-Servers
namespacestringoptional"apisix"Präfix für alle benutzerdefinierten Metriken, die vom APISIX-Agent gesendet werden. Nützlich für die Suche nach Entitäten für Metrikdiagramme. z.B. (apisix.request.counter)
constant_tagsarrayoptional["source
"]
Statische Tags, die in die generierten Metriken eingebettet sind. Nützlich für die Gruppierung von Metriken nach bestimmten Signalen.

Um mehr darüber zu erfahren, wie Sie effektiv Tags schreiben, besuchen Sie hier

Stellen Sie eine Anfrage an den Endpunkt /apisix/admin/plugin_metadata mit den aktualisierten Metadaten wie folgt:

curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/datadog -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "host": "127.0.0.1",
    "port": 8125,
    "constant_tags": [
        "source:apisix",
        "service:custom"
    ],
    "namespace": "apisix"
}'

Plugin-Schema

Ebenso gibt es einige Attribute, die beim Aktivieren des Plugins angepasst werden können.

NameTypErforderlichStandardGültigBeschreibung
batch_max_sizeintegeroptional5000[1,...]Maximale Puffergröße jedes Batches
inactive_timeoutintegeroptional5[1,...]Maximale Alter in Sekunden, wenn der Puffer bei Inaktivität geleert wird
buffer_durationintegeroptional60[1,...]Maximale Alter in Sekunden des ältesten Eintrags in einem Batch, bevor der Batch verarbeitet werden muss
max_retry_countintegeroptional1[1,...]Maximale Anzahl von Wiederholungsversuchen, wenn ein Eintrag den DogStatsD-Server nicht erreicht

Da alle Felder optional sind und wenn keine Attribute gesetzt sind, wird das Datadog-Plugin mit den Standardwerten instanziiert. Um ein Attribut zu aktualisieren, aktualisieren Sie einfach die entsprechende Route, den Dienst oder den Consumer mit dem aktualisierten Attributwert. Beispielsweise ändert der folgende Code die maximale Puffergröße jedes Batches:

'{
...
"plugins": {
    "datadog": {
        "batch_max_size": 10
    }
}
... }'

Deaktivierung des APISIX-Datadog-Plugins

Um das Plugin zu deaktivieren, entfernen Sie einfach die entsprechende JSON-Konfiguration in der Plugin-Konfiguration, um datadog zu deaktivieren. APISIX-Plugins werden hot-reloaded, daher ist kein Neustart von APISIX erforderlich.

# disable plugin for a route
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/hello",
    "plugins": {},
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:1980": 1
        }
    }
}'
Tags: