Zum Inhalt

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.