graphite: Ein NGINX-Modul zum Sammeln von Statistiken in Graphite
Installation
Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:
- RedHat Enterprise Linux 7, 8, 9 und 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 und Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-graphite
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-graphite
Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:
load_module modules/ngx_http_graphite_module.so;
Dieses Dokument beschreibt nginx-module-graphite v4.3, das am 20. Januar 2023 veröffentlicht wurde.
Ein NGINX-Modul zum Sammeln von Standortstatistiken in Graphite.
Funktionen
- Aggregation von Standort-, Server- oder HTTP-Metriken
- Berechnung von Perzentilen
- Senden von Daten an Graphite über UDP oder TCP auf nicht blockierende Weise
- Senden von benutzerdefinierten Metriken aus Lua
Zusammenfassung
http {
graphite_config prefix=playground server=127.0.0.1;
server {
location /foo/ {
graphite_data nginx.foo;
}
}
}
Beschreibung
Dieses Modul verwendet einen gemeinsamen Speicherbereich, um aggregierte Statistiken von allen Arbeitern zu sammeln und berechnete Werte für die letzte Minute alle 60 Sekunden (Standard) über UDP oder TCP auf nicht blockierende Weise an Graphite zu senden. Die Statistiken werden in Echtzeit in einem festgelegten Puffer aggregiert, der beim Serverstart zugewiesen wird und die Serverleistung nicht beeinträchtigt.
Dieses Modul wird seit etwa einem Jahr aktiv auf Mail.Ru Sites (einer der größten Webdienste in Russland) verwendet und gilt als stabil und gut getestet.
Um Metriken von den NGINX-Kernmodulen (ssl, gzip, upstream) zu sammeln, muss ein kleiner Patch auf den NGINX-Quellbaum angewendet werden. Siehe die Installationsanweisungen. Sie können dieses Modul als dynamisches Modul erstellen, aber dann können Sie keine Metriken von den NGINX-Kernmodulen (ssl, gzip, upstream) und Lua-Funktionen sammeln.
Direktiven
graphite_config
Syntax: graphite_config key1=<value1> key2=<value2> ... keyN=<valueN>
Kontext: http
Geben Sie globale Einstellungen für eine gesamte Serverinstanz an.
| Param | Erforderlich | Standard | Beschreibung |
|---|---|---|---|
| prefix | Pfadpräfix für alle Grafiken | ||
| host | gethostname() | Hostname für alle Grafiken | |
| server | Ja | IP-Adresse des carbon-cache-Servers | |
| protocol | udp | Protokoll des carbon-cache-Servers (udp oder tcp) | |
| port | 2003 | Port des carbon-cache-Servers | |
| frequency | 60 | Wie oft Werte an Graphite gesendet werden (Sekunden) | |
| intervals | 1m | Aggregationsintervalle, Zeitintervallliste, senkrechter Strich als Trennzeichen (m - Minuten) |
|
| params | * | Begrenzung der zu verfolgenden Metriken, senkrechter Strich als Trennzeichen | |
| shared | 2m | Größe des gemeinsamen Speichers, erhöhen im Falle eines zu kleinen gemeinsamen Speichers-Fehlers |
|
| buffer | 64k | Größe des Netzwerkpuffers, erhöhen im Falle eines zu kleinen Puffers-Fehlers |
|
| package | 1400 | Maximale UDP-Paketgröße | |
| template | Vorlage für den Grafikenamen (Standard ist $prefix.$host.$split.$param_$interval) | ||
| error_log | Pfadsuffix für Fehlerprotokollgrafiken (*) |
(*): funktioniert nur, wenn nginx_error_log_limiting*.patch auf den NGINX-Quellcode angewendet wird
Beispiel (Standard):
http {
graphite_config prefix=playground server=127.0.0.1;
}
Beispiel (benutzerdefiniert):
http {
graphite_config prefix=playground server=127.0.0.1 intervals=1m|5m|15m params=rps|request_time|upstream_time template=$prefix.$host.$split.$param_$interval;
}
Beispiel (error_log):
http {
graphite_config prefix=playground server=127.0.0.1 error_log=log;
}
graphite_default_data
Syntax: graphite_default_data <path prefix> [params=<params>] [if=<condition>]
Kontext: http, server
Erstellen Sie einen Messpunkt in allen verschachtelten Standorten. Sie können die Variablen "$location" oder "$server" verwenden, die den Namen des aktuellen Standorts und den Namen des aktuellen Servers darstellen, wobei alle nicht-alphanumerischen Zeichen durch "_" ersetzt werden. Führende und nachfolgende "_" werden gelöscht.
Beispiel:
graphite_default_data nginx.$location;
location /foo/ {
}
location /bar/ {
}
Daten für /foo/ werden an nginx.foo gesendet, Daten für /bar/ - an nginx.bar. Der <params>-Parameter (1.3.0) gibt die Liste der zu sammelnden Parameter für alle verschachtelten Standorte an. Um alle Standardparameter hinzuzufügen, verwenden Sie *. Der <if>-Parameter (1.1.0) aktiviert das bedingte Protokollieren. Eine Anfrage wird nicht protokolliert, wenn die Bedingung auf "0" oder einen leeren String evaluiert.
Beispiel (mit $server):
graphite_default_data nginx.$server.$location
server {
server_name foo_host;
location /foo/ {
}
}
server {
server_name bar_host;
location /bar/ {
}
}
Daten für /foo/ werden an nginx.foo_host.foo gesendet, Daten für /bar/ - an nginx.bar_host.bar.
graphite_data
Syntax: graphite_data <path prefix> [params=<params>] [if=<condition>]
Kontext: http, server, location, if
Erstellen Sie einen Messpunkt in einem bestimmten Standort.
Beispiel:
location /foo/ {
graphite_data nginx.foo;
}
Der <params>-Parameter (1.3.0) gibt die Liste der zu sammelnden Parameter für diesen Standort an. Um alle Standardparameter hinzuzufügen, verwenden Sie *. Der <if>-Parameter (1.1.0) aktiviert das bedingte Protokollieren. Eine Anfrage wird nicht protokolliert, wenn die Bedingung auf "0" oder einen leeren String evaluiert.
Beispiel:
map $scheme $is_http { http 1; }
map $scheme $is_https { https 1; }
...
location /bar/ {
graphite_data nginx.all.bar;
graphite_data nginx.http.bar if=$is_http;
graphite_data nginx.https.bar if=$is_https;
graphite_data nginx.arg params=rps|request_time;
graphite_data nginx.ext params=*|rps|request_time;
}
graphite_param
Syntax: graphite_param name=<path> interval=<time value> aggregate=<func>
Kontext: location
| Param | Erforderlich | Beschreibung |
|---|---|---|
| name | Ja | Pfadpräfix für alle Grafiken |
| interval | Ja* | Aggregationsintervall, Zeitintervallwertformat (m - Minuten) |
| aggregate | Ja* | Aggregationsfunktion auf Werte |
| percentile | Ja* | Perzentilniveau |
Aggregationsfunktionen
| func | Beschreibung |
|---|---|
| sum | Summe der Werte pro Intervall |
| persec | Summe der Werte pro Sekunde (sum geteilt durch Sekunden im interval) |
| avg | Durchschnittswert im Intervall |
| gauge | Messwert |
Beispiel: siehe unten.
Nginx API für Lua
Syntax: ngx.graphite.param(<name>)
Erhalten Sie einen Link auf einen Graphite-Parametername, um ihn anstelle des Namens für die folgenden Funktionen zu verwenden. Der Link ist bis zum NGINX-Neuladen gültig. Nachdem Sie den Link eines Parameters erhalten haben, können Sie weiterhin den Parameternamen an die folgenden Funktionen übergeben. Sie können den Link eines Parameters mehrmals erhalten, Sie erhalten immer dasselbe Objekt unter demselben Namen (ein lightuserdata). Die Funktion gibt false zurück, wenn der durch den Namen angegebene Parameter nicht existiert. Die Funktion gibt nil bei Fehlern beim Abrufen des Links zurück. Funktionen greifen schneller auf Parameterinformationen über den Link zu als über den Namen.
Verfügbar nach Anwendung des Patches auf das lua-nginx-module. Die Funktion ist im Patch für das Lua-Modul v0.10.12 enthalten. Siehe die Installationsanweisungen.
Syntax: ngx.graphite(<name_or_link>,<value>[,<config>])
Schreiben Sie den Statwert in die Aggregatorfunktion. Gleitkommazahlen werden in value akzeptiert.
Verfügbar nach Anwendung des Patches auf das lua-nginx-module. Siehe die Installationsanweisungen.
ngx.graphite(name, value, config)
Beispiel:
location /foo/ {
graphite_param name=lua.foo_sum aggregate=sum interval=1m;
graphite_param name=lua.foo_rps aggregate=persec interval=1m;
graphite_param name=lua.foo_avg aggregate=avg interval=1m;
graphite_param name=lua.foo_gauge aggregate=gauge;
content_by_lua '
ngx.graphite("lua.foo_sum", 0.01)
ngx.graphite("lua.foo_rps", 1)
ngx.graphite("lua.foo_avg", ngx.var.request_uri:len())
local foo_gauge_link = ngx.graphite.param("lua.foo_gauge")
ngx.graphite(foo_gauge_link, 10)
ngx.graphite(foo_gauge_link, -2)
ngx.graphite("lua.auto_rps", 1, "aggregate=persec interval=1m percentile=50|90|99")
ngx.say("hello")
';
}
Sie müssen entweder den Befehl graphite_param angeben oder das Argument config übergeben. Wenn Sie die zweite Option wählen, werden die Daten für diese Grafik nicht gesendet, bis der erste Aufruf von ngx.graphite erfolgt.
Warnung:
Wenn Sie die Grafik nicht mit dem Befehl graphite_param deklarieren, wird der Speicher für die Grafik dynamisch im gemeinsamen Speicher des Moduls zugewiesen. Wenn der gemeinsame Speicher des Moduls während des Betriebs von NGINX erschöpft ist, werden keine neuen Grafiken erstellt und eine Fehlermeldung wird protokolliert.
Syntax: ngx.graphite.get(<name_or_link>)
Erhalten Sie den Wert des Gauge-Parameters mit dem angegebenen name_or_link.
Syntax: ngx.graphite.set(<name>,<value>)
Setzen Sie value auf den Gauge-Parameter mit dem angegebenen name_or_link.
Parameter
| Param | Einheiten | Funktion | Beschreibung |
|---|---|---|---|
| request_time | ms | avg | Gesamtzeit, die für die Bearbeitung der Anfrage aufgewendet wurde |
| bytes_sent | bytes | avg | Länge der HTTP-Antwort |
| body_bytes_sent | bytes | avg | Länge des HTTP-Antwortkörpers |
| request_length | bytes | avg | Länge der HTTP-Anfrage |
| ssl_handshake_time | ms | avg | Zeit, die für das SSL-Handschlag aufgewendet wurde |
| ssl_cache_usage | % | last | Wie viel SSL-Cache verwendet wird |
| content_time | ms | avg | Zeit, die für die Generierung von Inhalten innerhalb von NGINX aufgewendet wurde |
| gzip_time | ms | avg | Zeit, die für das Gzippen von Inhalten im laufenden Betrieb aufgewendet wurde |
| upstream_time | ms | avg | Zeit, die für die Kommunikation mit dem Upstream aufgewendet wurde |
| upstream_connect_time | ms | avg | Zeit, die für die Verbindung zum Upstream aufgewendet wurde (NGINX >= 1.9.1) |
| upstream_header_time | ms | avg | Zeit, die für den Upstream-Header aufgewendet wurde (NGINX >= 1.9.1) |
| rps | rps | sum | Gesamtanzahl der Anfragen pro Sekunde |
| keepalive_rps | rps | sum | Anzahl der Anfragen, die über eine zuvor geöffnete Keepalive-Verbindung gesendet wurden |
| response_2xx_rps | rps | sum | Gesamtanzahl der Antworten mit 2xx-Code |
| response_3xx_rps | rps | sum | Gesamtanzahl der Antworten mit 3xx-Code |
| response_4xx_rps | rps | sum | Gesamtanzahl der Antworten mit 4xx-Code |
| response_5xx_rps | rps | sum | Gesamtanzahl der Antworten mit 5xx-Code |
| response_[0-9]{3}_rps | rps | sum | Gesamtanzahl der Antworten mit dem angegebenen Code |
| upstream_cache_(miss|bypass|expired|stale|updating|revalidated|hit)_rps | rps | sum | Gesamtantworten mit einem bestimmten Upstream-Cache-Status |
| lua_time | ms | avg | Zeit, die für Lua-Code aufgewendet wurde |
Perzentile
Um den Perzentilwert für einen beliebigen Parameter zu berechnen, setzen Sie das Perzentilniveau über /. Z.B. request_time/50|request_time/90|request_time/99.
Patch zum Hinzufügen der API zum Senden von Metriken aus Lua-Code (optional)
patch -p1 < /path/to/graphite-nginx-module/lua_module_v0_9_11.patch cd ..
wget 'http://nginx.org/download/nginx-1.9.2.tar.gz' tar -xzf nginx-1.9.2.tar.gz cd nginx-1.9.2/
GitHub
Sie finden zusätzliche Konfigurationstipps und Dokumentation für dieses Modul im GitHub-Repository für nginx-module-graphite.