Überwachen von Fehlern und Ereignissen im PostgreSQL-Protokoll (grok_exporter)

Guten Tag, Kollegen und Habretchiki! Heute möchte ich Ihnen einen kleinen Hinweis geben, wie Sie die betriebliche Überwachung von Fehlern und Ereignissen, die im PostgreSQL-Protokoll angezeigt werden, mit Prometheus und dem Exporteur von Metriken grok_exporter organisieren können.

Ich muss sofort sagen, dass dies natĂŒrlich ein Sonderfall bei der Verwendung dieses Exporteurs ist. Warum wird es benötigt und wer könnte interessiert sein?

EinfĂŒhrung


Wer braucht das?


Wenn Prometheus bereits in Ihrer Infrastruktur vorhanden ist und die Erstellung einer separaten Infrastruktur zum Sammeln und Analysieren von Protokollen wie ELK oder Greylog teuer und unpraktisch ist (wenn Prometheus nicht vorhanden ist, ist dies kein Problem, es ist einfach und schnell zu installieren).

Das Tool ist nicht nur fĂŒr DBAs nĂŒtzlich, sondern auch fĂŒr Anwendungsadministratoren im Allgemeinen fĂŒr alle, die irgendwie mit Anwendungsprotokollen arbeiten. Es ermöglicht Ihnen, schnell Informationen ĂŒber das Verhalten von Freiberuflern zu erhalten und einen bestimmten Bezugspunkt fĂŒr die weitere Analyse der Situation zu haben.

WofĂŒr ist das alles?


Durch die Überwachung von Protokollen erhalten Sie ein vollstĂ€ndigeres Bild und können schneller auf neu auftretende Probleme reagieren, sei es: Autorisierungsversuche (einschließlich erfolgloser), verschiedene Fehler oder bestimmte Ereignisse.

Hier gibt es eine gute Liste, die aus Ereigniskategorien besteht (siehe Abschnitt Protokollereigniskategorien). Sie kann zum Erstellen von Regeln in Prometheus verwendet werden.

grok_exporter


Mit dem Metrikexporter grok_exporter können Sie unstrukturierte Daten aus der Quelle lesen, sie gemĂ€ĂŸ den Regeln in strukturierte Daten konvertieren und als Metriken in einem von Prometheus verstandenen Format weitergeben.

Der Exporter wurde im Image eines Plug- Ins in ELK Plugins-Filters-Grok erstellt , mit dem Sie eine Reihe von Plugins-Filtern-Grok-Vorlagen unverÀndert verwenden können .

Installation


Die Installation ist unkompliziert und einfach. Folgen Sie dazu einfach dem Link und laden Sie die gewĂŒnschte Version herunter (und ja, alle sind Vorabversionen, und die neuesten Versionen befinden sich noch im Release Candidate-Stadium) und entpacken Sie das resultierende Archiv.

Als Ergebnis erhalten wir den folgenden Satz:

grok_exporter-1.0.0.RC3.linux-amd64
├── patterns
│   ├── ruby
│   ├── redis
│   ├── rails
│   ├── postgresql
│   ├── nagios
│   ├── mongodb
│   ├── mcollective-patterns
│   ├── mcollective
│   ├── linux-syslog
│   ├── junos
│   ├── java
│   ├── haproxy
│   ├── grok-patterns
│   ├── firewalls
│   ├── exim
│   ├── bro
│   ├── bacula
│   └── aws
├── grok_exporter
└── example
    ├── exim-rejected-RCPT-examples.log
    ├── config.yml
    └── config_logstash_http_input_ipv6.yml

wo:

  • grok_exporter - ausfĂŒhrbare Exporter-Datei
  • Muster - enthĂ€lt eine Reihe von Mustern
  • Beispiel - enthĂ€lt einen Testdatensatz und eine Beispielkonfigurationsdatei

Um den Exporter zu starten, fĂŒhren Sie einfach die ausfĂŒhrbare Datei aus. Die Konfigurationsdatei config.yml wird in dem Verzeichnis durchsucht, aus dem die Anwendung gestartet wird, oder ihr Speicherort wird durch die Option -config angegeben



Einrichtung und Vorbereitung der Arbeit


PostgreSQL


, PostgreSQL. :


  1. grok_exporter . , pg_reload_conf.

    • alter system set log_directory to '/var/log/postgresql'; 
    • alter system set log_file_mode to '0644';
  2. log_line_prefix, . , . :

     alter system set log_line_prefix to '%t datname:%d,client:%h,app:%a,usename:%u,session:%c ';

grok_exporter


ZunĂ€chst bearbeiten wir die Vorlage pattern / postgresql entsprechend dem Format unserer Protokolldatei und fĂŒgen zusĂ€tzliche Konstruktionen hinzu. Ich betone noch einmal, dass die Syntax der Vorlagen vollstĂ€ndig mit der in Plugins-Filters-Grok verwendeten ĂŒbereinstimmt . Daher können und sollten Sie fĂŒr alle Probleme im Zusammenhang mit der Syntax die Dokumentation lesen . Lassen Sie uns also unsere Vorlage fĂŒr PostgreSQL in das Formular bringen (die Datei patterns / grok-patterns enthĂ€lt bereits eine große Anzahl grundlegender Vorlagen):

#     - postgresql
PG_TIMESTAMP %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND} [A-Z]{3,4}

#    
PG_ERROR_PATTERN (ERROR|WARNING|FATAL|PANIC)

# log_line_prefix   - PostgreSQL
PG_PREFIX %{PG_TIMESTAMP} datname:(%{DATA:datname})?,client:(%{DATA:client_host})?,app:(%{DATA:app_name})?,usename:(%{USER:usename})?,session:(%{DATA:session})?

#    log_level     
PG_ERROR_LEVEL %{PG_ERROR_PATTERN:log_level}:

#    
PG_EVENT_AUTH LOG:  connection authorized:

#      SIGHUP,   
PG_EVENT_RELOAD LOG:  received SIGHUP, reloading configuration files

Mit dem Design ()?können Sie angeben, dass der Wert optional ist.


Hier wird anhand von Beispielen ausfĂŒhrlich beschrieben, wie eine Konfigurationsdatei erstellt wird. Im Folgenden wird nur angegeben, was verwendet wird.


Eine kurze Beschreibung der Konfigurationsdatei (aus der Dokumentation)
YAML :

  1. global —
    • config_version — . grok_exporter, ≄ 1.0.0.RC3, 3
      retention_check_interval — . , .

  2. input — .

    • type — . : file, stdin, webhook. , file;
    • path|paths — c -(-). ;
    • readall — , .
      true — , . Prometheus .
      false — , grok_exporter;
    • fail_on_missing_logfile — -. true — , ;
  3. imports — , , . 2, , grok.

    • type — grok_patterns () metrics ();
    • file|dir — . , .

  4. grok_patterns — , .
  5. metrics — . — counter, gauge, histogram, or summary.
  6. server —

      protocol: https
      host: localhost
      port: 9144
      path: /metrics
      cert: /path/to/cert
      key: /path/to/key
    



In der Syntax der 3. Version der Konfigurationsdatei wurde es möglich, Metriken aus einzelnen Dateien zu importieren. Auf diese Weise können Sie Metriken nach Zweck gruppieren.

Erstellen Sie als NĂ€chstes die Konfigurationsdatei base config.yml . Darin setzen wir: den Pfad zu den PostgreSQL-Protokolldateien per Maske; Importvorlagen aus dem Muster - Verzeichnis und Metriken aus dem metrics.d Verzeichnis ; Wir geben an, nach welchem ​​Protokoll und an welchem ​​Port Metriken beantragt werden mĂŒssen.

config.yml
  config_version: 3
  retention_check_interval: 10s
input:
  type: file
  path: /var/log/postgresql/postgresql-*.log
  readall: false
imports:
- type: grok_patterns
  dir: ./patterns
- type: metrics
  dir: ./metrics.d
server:
  protocol: http
  port: 9144


, metrics.d postgresql.yml, .

, , .. ( retention, - 2 30 ) , . retention_check_interval.

, :

  • , ;
  • — GAUGE COUNTER, . .. GAUGE, ;
  • Wenn kumulativ auf true gesetzt ist, werden die Werte der Metriken mit demselben Satz von Beschriftungen summiert. Dies ist das erwartete Verhalten. Eine unerwartete Situation kann auftreten, wenn Sie bei der zweiten Anforderung die Summe der Werte in der Anforderung plus des vorherigen Werts abrufen können.
  • Wenn kumulativ auf falsch gesetzt ist und Metriken mit denselben Beschriftungen vorhanden sind, wird nur der letzte Wert angezeigt.

Es stellte sich heraus, dass viele Briefe verwirrend und stellenweise unverstÀndlich waren, aber ich werde versuchen, dies in den folgenden Beispielen offenzulegen.

Wir haben also eine Konfigurationsdatei, die vier Metriken, drei ZĂ€hler und einen beliebigen Wert zurĂŒckgeben kann. TatsĂ€chlich berĂŒcksichtigen die ersten drei die Anzahl der Übereinstimmungen des Übereinstimmungsvorlagenfelds mit den von der Quelle empfangenen Zeichenfolgen, die vierte - zeigt die Summe der Werte an.

postgresql.yaml
#  - 
- type:   counter
  name:   pg_grok_error_count
  help:   Count of line error
  match:  '%{PG_PREFIX} %{PG_ERROR_LEVEL}  %{GREEDYDATA:message}'
  labels:
    log_level:   '{{.log_level}}'
    usename:     '{{.usename}}'
    datname:     '{{.datname}}'
    app_name:    '{{.app_name}}'
    client_host: '{{.client_host}}'
    message:     '{{.message}}'

#   
- type:   counter
  name:   pg_grok_auth_succes_count
  help:   Count of connections authorized
  match:  '%{PG_PREFIX} %{PG_EVENT_AUTH}'
  labels:
    usename:     '{{.usename}}'
    datname:     '{{.datname}}'
    app_name:    '{{.app_name}}'
    client_host: '{{.client_host}}'

#   
- type:   counter
  name:   pg_grok_reload_conf_count
  help:   Count of call pg_reload_conf
  match:  '%{PG_PREFIX} %{PG_EVENT_RELOAD}'
  labels:
    session:     '{{.session}}'

#   
- type:       gauge
  name:       pg_grok_tpm_file_size_bytes
  help:       Size of tmp file created by time
  match:      '%{PG_PREFIX} %{PG_EVENT_TMP_FILE}'
  value:      '{{.size}}'
  cumulative: true
  retention:  5s
  labels:
    static:     'temp_file'


Trainieren


pg_grok_error_count


Die Metrik zĂ€hlt die Anzahl der Ereignisse ERROR, WARNING, FATAL und PANIC gemĂ€ĂŸ dem Muster. Es kann zur Überwachung und Warnung im Notfall nĂŒtzlich sein. Beispielsweise können Sie eine Warnung in den folgenden FĂ€llen konfigurieren: Versuche einer nicht erfolgreichen Autorisierung, Überschreiten des Schwellenwerts fĂŒr die Anzahl der Fehler pro Zeiteinheit oder wenn sich die Datenbank nach einem Fehler in einem Wiederherstellungszustand befindet, und vieles mehr ( Protokollereigniskategorien ).

Beispielsweise richten wir eine Warnung ĂŒber fehlgeschlagene Autorisierungsversuche ein. Ein Beispiel fĂŒr einen erfolglosen Anmeldeversuch in der PostgreSQL-Protokolldatei sieht folgendermaßen aus:

2020-04-20 23:34:53 AEST datname:test,client:127.0.0.1,app:[unknown],usename:test_user,session:5e9da4fd.733 FATAL:  password authentication failed for user "test_user"
2020-04-20 23:34:53 AEST datname:test,client:127.0.0.1,app:[unknown],usename:test_user,session:5e9da4fd.733 DETAIL:  Password does not match for user "test_user".
        Connection matched pg_hba.conf line 86: "host    all             all             127.0.0.1/32            md5"

In der Ausgabe von grok_exporter können fehlgeschlagene Authentifizierungsversuche anhand des Nachrichtenetiketts identifiziert werden, das die Kennwortkennwortauthentifizierung enthĂ€lt, die fĂŒr ... fehlgeschlagen ist :

pg_grok_error_count{app_name="[unknown]",client_host="127.0.0.1",datname="postgres",log_level="FATAL",message="password authentication failed for user "postgres"", usename="postgres"} 15
pg_grok_error_count{app_name="[unknown]",client_host="127.0.0.1",datname="test",log_level="FATAL",message="password authentication failed for user \"test_user\"",usename="test_user"} 5

Die erhaltenen Daten helfen bei der Formulierung einer Regel fĂŒr Prometheus. Die Empfindlichkeit kann basierend auf Ihren eigenen RealitĂ€ten angepasst werden.

groups:
- name: AuthAlert
  rules:
  - alert: AuthFail
    expr: sum(rate(pg_grok_error_count{message=~"password authentication failed for user.*"}[1m])) by (instance) > 0.1
    for: 30s
    labels:
      severity: warning
    annotations:
      summary: Too many fail authorization for {{ $labels.instance }}

pg_grok_reload_conf_count


Ebenso können Sie die AusfĂŒhrung des Befehls pg_reload_conf verfolgen. DarĂŒber hinaus lohnt es sich, auf die Liste der Labels oder vielmehr auf die Tatsache zu achten, dass nur ein Session-Label verwendet wird. Dies liegt an der Tatsache, dass das Ereignis als Teil des Serverprozesses und nicht der Benutzersitzung erstellt wird.

In der PostgreSQL-Protokolldatei sieht dieses Ereignis folgendermaßen aus:

2020-04-21 01:20:26 AEST datname:,client:,app:,usename:,session:5e9d9371.564 LOG:  received SIGHUP, reloading configuration files

Jene. Es ist ersichtlich, dass die im vorherigen Beispiel verwendeten Beschriftungen leer sind. In diesem Fall verwenden wir die Sitzungskennung zur Identifizierung und sie Àndert sich erst, wenn die Instanz von PostgreSQL gestoppt oder neu gestartet wird.

Eine Ă€hnliche Situation besteht fĂŒr andere Ă€hnliche FĂ€lle, z. B. das Stoppen einer Instanz:

2020-04-21 01:32:52 AEST datname:,client:,app:,usename:,session:5e9d9371.564 LOG:  received fast shutdown request
2020-04-21 01:32:53 AEST datname:,client:,app:,usename:,session:5e9d9371.564 LOG:  database system is shut down

In der Ausgabe von grok_exporter erhalten wir:

# HELP pg_grok_reload_conf_count Count of call pg_reload_conf
# TYPE pg_grok_reload_conf_count counter
pg_grok_reload_conf_count{session="5e9d9371.564"} 5

Die Regel fĂŒr die Benachrichtigung, es macht keinen Sinn, sie zur Sprache zu bringen, sie wird der oben diskutierten Ă€hnlich sein.

pg_grok_tpm_file_size_bytes


Ich werde sofort reservieren, dass dieses Beispiel aus der Kategorie "Kugelpferd im Vakuum" stammt und in grĂ¶ĂŸerem Umfang angegeben wird, um zu zeigen, wie Sie das Verhalten von Metriken Ă€ndern können.

Das Verhalten der Spurmetriken kann durch Änderung der beeinflusst werden Retention und kumulative Parameter . Im Gegensatz zu einem normalen ZĂ€hler, der die Anzahl der Zeilen berĂŒcksichtigt, die mit dem Übereinstimmungsmuster ĂŒbereinstimmen, können Sie mit der Anzeige Daten aus der Protokolldatei bearbeiten. Es stellt sich heraus, dass wir es akkumulieren können, indem wir es um den erhaltenen Wert erhöhen oder verringern oder es als willkĂŒrlich Ă€ndernden Wert verwenden. Im ersten Fall interessiert uns also die GrĂ¶ĂŸe des Inkrements, im zweiten der Wert an sich.

Schauen wir uns einige Beispiele an:

  1. , (cumulative: true). , , . , retention_check_interval + retention <= scrape_interval — Prometheus.

    - PostgreSQL :

    2020-04-21 02:51:15 AEST datname:,client:,app:,usename:,session:5e9dd2f3.1278 LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4728.0", size 46931968
    2020-04-21 02:51:15 AEST datname:,client:,app:,usename:,session:5e9dd2f3.1279 LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4729.0", size 46276608
    2020-04-21 02:51:15 AEST datname:postgres,client:[local],app:psql,usename:postgres,session:5e9dc0a8.112c LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4396.14", size 47194112
    

    , :

    pg_grok_tpm_file_size_bytes{static="temp_file"} 1.40402688e+08
    

    .

    , :

    pg_grok_tpm_file_size_bytes{static="temp_file"} 1.1911168e+07
    

    : , .
  2. , , (retention) (cumulative: true)
    , - PostgreSQL :


    2020-04-21 03:03:40 AEST datname:,client:,app:,usename:,session:5e9dd5dc.12c6 LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4806.0", size 46260224
    2020-04-21 03:03:40 AEST datname:,client:,app:,usename:,session:5e9dd5dc.12c5 LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4805.0", size 46833664
    2020-04-21 03:03:40 AEST datname:postgres,client:[local],app:psql,usename:postgres,session:5e9dc0a8.112c LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4396.15", size 47316992
    

    :

    pg_grok_tpm_file_size_bytes{static="temp_file"} 1.40402688e+08
    

    , . :

    2020-04-21 03:10:40 AEST datname:,client:,app:,usename:,session:5e9dd76e.1325 LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4901.0", size 46776320
    2020-04-21 03:10:40 AEST datname:,client:,app:,usename:,session:5e9dd76e.1324 LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4900.0", size 45768704
    2020-04-21 03:10:40 AEST datname:postgres,client:[local],app:psql,usename:postgres,session:5e9dc0a8.112c LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4396.18", size 47841280
    

    :

    pg_grok_tpm_file_size_bytes{static="temp_file"} 2.80772608e+08
    

    , . , .
  3. , cumulative false , .

    :

    2020-04-21 03:41:04 AEST datname:,client:,app:,usename:,session:5e9ddea4.1393 LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp5011.0", size 11763712
    2020-04-21 03:41:04 AEST datname:,client:,app:,usename:,session:5e9ddea4.1392 LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp5010.0", size 11501568
    2020-04-21 03:41:04 AEST datname:postgres,client:[local],app:psql,usename:postgres,session:5e9dc0a8.112c LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp4396.19", size 11911168
    

    :

    # HELP pg_grok_tpm_file_size_bytes Size of tmp file created by time
    # TYPE pg_grok_tpm_file_size_bytes gauge
    pg_grok_tpm_file_size_bytes{static="temp_file"} 1.1911168e+07
    

    , . , .


Zweifellos ist grok_exporter das richtige Werkzeug zur Überwachung von Anwendungen. Es ermöglicht Ihnen, die "schwer zugĂ€nglichen" Systeme fĂŒr Überwachungssysteme und -orte zu untersuchen und die Überwachung mit zusĂ€tzlichen (Kontroll-) Metriken zu bereichern, wĂ€hrend Sie recht einfach, funktional und leicht bleiben.

Gleichzeitig ist es auch fĂŒr Entwickler nĂŒtzlich, da es zumindest indirekt ĂŒber ein Überwachungssystem auf Anwendungsprotokolle zugreift. Hier können Sie Metriken aus verschiedenen Quellen korrelieren.

Ein weiterer positiver Punkt ist, dass das Projekt neue Funktionen entwickelt und erwirbt.

Ich hoffe wiederum, dass diese kurze Notiz nĂŒtzlich sein wird, auch fĂŒr das Projekt selbst. Mehr Sterne, mehr Spaß bei der Arbeit!

Danke an alle!

Source: https://habr.com/ru/post/undefined/


All Articles