Cloud Monitoring mit Datadog in Apache APISIX
API7.ai
November 12, 2021
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
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:
Metrikname | StatsD-Typ | Beschreibung |
---|---|---|
Request Counter | Counter | Anzahl der empfangenen Anfragen. |
Request Latency | Histogram | Zeit, die zur Bearbeitung der Anfrage benötigt wird (in Millisekunden). |
Upstream latency | Histogram | Zeit, die seit der Weiterleitung der Anfrage an den Upstream-Server bis zum Empfang einer Antwort benötigt wird (in Millisekunden). |
APISIX Latency | Histogram | Zeit, die der APISIX-Agent zur Bearbeitung der Anfrage benötigt (in Millisekunden). |
Ingress Size | Timer | Größe des Anfragekörpers in Bytes. |
Egress Size | Timer | Größ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.
Metrikname | Beschreibung |
---|---|
route_name | Name, der in der Routenschemadefinition angegeben ist. Wenn nicht vorhanden, wird auf den Routen-ID-Wert zurückgegriffen. |
service_id | Wenn eine Route mit der Abstraktion eines Dienstes erstellt wurde, wird die entsprechende Dienst-ID verwendet. |
consumer | Wenn die Route einen verknüpften Consumer hat, wird der Benutzername des Consumers als Tag hinzugefügt. |
balancer_ip | IP des Upstream-Balancers, der die aktuelle Anfrage verarbeitet hat. |
response_status | HTTP-Antwortstatuscode. |
scheme | Schema, 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
- 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.
- Wenn Sie neu bei Datadog sind
- Erstellen Sie zunächst ein Konto, indem Sie www.datadoghq.com besuchen.
- Generieren Sie einen API-Schlüssel.
- 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ändigendatadog/dogstatsd
-Images anstelle des vollständigen Agents. Es ist extrem leichtgewichtig (nur ~11 MB groß) im Vergleich zu ~2,8 GB desdatadog/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
Name | Typ | Erforderlich | Standard | Beschreibung |
---|---|---|---|---|
hosts | string | optional | "127.0.0.1" | Die Host-Adresse des DogStatsD-Servers |
port | integer | optional | 8125 | Der Host-Port des DogStatsD-Servers |
namespace | string | optional | "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_tags | array | optional | ["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.
Name | Typ | Erforderlich | Standard | Gültig | Beschreibung |
---|---|---|---|---|---|
batch_max_size | integer | optional | 5000 | [1,...] | Maximale Puffergröße jedes Batches |
inactive_timeout | integer | optional | 5 | [1,...] | Maximale Alter in Sekunden, wenn der Puffer bei Inaktivität geleert wird |
buffer_duration | integer | optional | 60 | [1,...] | Maximale Alter in Sekunden des ältesten Eintrags in einem Batch, bevor der Batch verarbeitet werden muss |
max_retry_count | integer | optional | 1 | [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
}
}
}'