مراقبة الأخطاء والأحداث في سجل PostgreSQL (grok_exporter)

مساء الخير زملائي و habretchiki! اليوم ، أود أن أشارك معك ملاحظة صغيرة حول كيفية تنظيم المراقبة التشغيلية للأخطاء والأحداث التي تظهر في سجل PostgreSQL باستخدام Prometheus ومصدر المقاييس grok_exporter.

يجب أن أقول على الفور أن هذه بالطبع حالة خاصة لاستخدام هذا المصدر. فلماذا هو مطلوب ومن الذي قد يكون مهتما؟

المقدمة


من يحتاج هذا؟


إذا كان Prometheus موجودًا بالفعل في بنيتك الأساسية وأن إنشاء بنية أساسية منفصلة لجمع وتحليل السجلات ، مثل ELK أو Greylog ، يعد مكلفًا وغير عملي (إذا لم يكن هناك Prometheus ، فهذا ليس مشكلة ، فهو سهل وسريع التثبيت).

ستكون الأداة مفيدة ليس فقط لـ DBAs ، ولكن أيضًا لمسؤولي التطبيق ، بشكل عام ، لجميع أولئك الذين يعملون بطريقة ما مع سجلات التطبيق. يسمح لك بالحصول بسرعة على معلومات حول السلوك المستقل ولديه نقطة مرجعية معينة لمزيد من التحليل للموقف.

ما كل هذا؟


تسمح لك سجلات المراقبة بالحصول على صورة أكثر اكتمالاً والاستجابة بسرعة أكبر للمشكلات الناشئة ، سواء كانت محاولات التفويض (بما في ذلك المحاولات غير الناجحة) ، أو الأخطاء المختلفة ، أو الأحداث المحددة.

هناك قائمة جيدة هنا ، تم تشكيلها حسب فئات الأحداث (انظر قسم سجل أحداث الحدث) ، يمكن استخدامها لإنشاء قواعد في Prometheus.

grok_exporter


يتيح لك المصدر المتري grok_exporter قراءة البيانات غير المنظمة من المصدر ، وتحويلها إلى بيانات منظمة ، وفقًا للقواعد ، وإعطائها كمقاييس بتنسيق يفهمه بروميثيوس.

تم إنشاء المصدر في صورة مكون إضافي في ELK plugins-filters-grok ، والذي يسمح لك باستخدام مجموعة من قوالب plugins-filters-grok كما هي.

التركيب


التثبيت سهل وبسيط. للقيام بذلك ، ما عليك سوى اتباع الرابط وتنزيل الإصدار الذي يعجبك (ونعم أنها كلها قبل الإصدار ، ولا تزال أحدث الإصدارات في مرحلة مرشح الإصدار) وفك ضغط الأرشيف الناتج.

ونتيجة لذلك ، نحصل على المجموعة التالية:

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

أين:

  • grok_exporter - المصدر القابل للتنفيذ
  • الأنماط - تحتوي على مجموعة من الأنماط
  • مثال - يحتوي على مجموعة بيانات اختبار ومثال ملف التكوين

لبدء المصدر ، فقط قم بتشغيل الملف القابل للتنفيذ. يتم البحث في ملف التكوين config.yml في الدليل من حيث يتم تشغيل التطبيق أو يتم تحديد موقعه بواسطة الخيار -config



الإعداد والتحضير للعمل


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


بادئ ذي بدء ، سنقوم بتحرير نموذج الأنماط / postgresql وفقًا لتنسيق ملف السجل الخاص بنا وإضافة الإنشاءات الإضافية. أؤكد مرة أخرى أن بنية القوالب تتوافق تمامًا مع تلك المستخدمة في plugins-filters-grok ، وبالتالي ، بالنسبة لجميع المشكلات المتعلقة ببناء الجملة ، يمكنك ويجب عليك الذهاب إلى وثائقها. لذا ، دعنا نحضر قالب PostgreSQL إلى النموذج ( يحتوي ملف الأنماط / grok-pattern بالفعل على مجموعة كبيرة من القوالب الأساسية):

#     - 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

()?يسمح لك التصميم بالإشارة إلى أن القيمة اختيارية.


هنا ، بتفاصيل كافية ، مع أمثلة ، يتم وصف عملية إنشاء ملف التكوين. أدناه ، يتم إعطاء ما سيتم استخدامه فقط.


وصف موجز لملف التكوين (من الوثائق)
ملف التكوين هو ملف بتنسيق YAML ومقسّم إلى أقسام:

  1. العالمية الإعدادات العمومية -
    • 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.

    • typegrok_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
    



في صيغة الإصدار الثالث من ملف التكوين ، أصبح من الممكن استيراد المقاييس من الملفات الفردية ، وهذا سيسمح لك بتجميع المقاييس حسب الغرض.

بعد ذلك ، قم بإنشاء ملف التكوين config.yml الأساسي . في ذلك ، نحن: تعيين المسار إلى ملفات السجل PostgreSQL بواسطة القناع. استيراد قوالب من دليل الأنماط والمقاييس من دليل metrics.d ؛ نشير إلى أي بروتوكول وعلى أي منفذ من الضروري تطبيق المقاييس.

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, ;
  • إذا تم تعيين التراكمي على "صواب" ، فسيتم جمع قيم المقاييس التي لها نفس مجموعة التسميات ، وهو السلوك المتوقع. قد تنشأ حالة غير متوقعة عندما يمكنك ، عند الطلب الثاني ، الحصول على مجموع القيم في الطلب بالإضافة إلى القيمة السابقة.
  • إذا تم تعيين التراكمي على خطأ ، إذا كانت هناك مقاييس بنفس مجموعة التسميات ، فسيتم عرض القيمة الأخيرة فقط ؛

اتضح الكثير من الرسائل ، مربكة وغير مفهومة في الأماكن ، لكني سأحاول الكشف عن هذا في الأمثلة أدناه.

وهكذا ، لدينا ملف تهيئة يمكنه عرض أربعة مقاييس وثلاثة عدادات وقيمة اعتباطية واحدة. في الواقع ، أول ثلاثة ينظرون في عدد التطابقات في حقل قالب المطابقة مع السلاسل المستلمة من المصدر ، والرابع - يعرض مجموع القيم.

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'


ممارسة


pg_grok_error_count


يحسب المقياس عدد الأحداث الخطأ ، والتحذير ، والقاتل ، والذعر ، وفقًا للنمط. يمكن أن تكون مفيدة للرصد والتحذير في حالة الطوارئ. على سبيل المثال ، يمكنك تكوين تنبيه في الحالات التالية: محاولات التفويض غير الناجح ، أو تجاوز عتبة عدد الأخطاء لكل وحدة زمنية ، أو عندما تكون قاعدة البيانات في حالة استرداد بعد الفشل ، وأكثر من ذلك بكثير ( Log Event Categories ).

على سبيل المثال ، سنقوم بإعداد تنبيه حول محاولات التفويض الفاشلة. يبدو مثالاً لمحاولة تسجيل دخول فاشلة في ملف سجل PostgreSQL كما يلي:

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"

في إخراج grok_exporter ، يمكن تحديد محاولات المصادقة الفاشلة من خلال تسمية الرسالة التي فشلت في مصادقة كلمة مرور السلسلة الفرعية لـ ... :

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

ستساعد البيانات التي تم الحصول عليها في صياغة قاعدة لبروميثيوس. يمكن تعديل الحساسية بناءً على حقائقك الخاصة.

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


وبالمثل ، يمكنك تتبع تنفيذ الأمر pg_reload_conf. علاوة على ذلك ، يجدر الانتباه إلى قائمة التسميات ، أو بالأحرى حقيقة استخدام تسمية جلسة واحدة فقط. هذا يرجع إلى حقيقة أن الحدث يتم إنشاؤه كجزء من عملية الخادم ، وليس جلسة المستخدم.

في ملف سجل PostgreSQL ، يبدو هذا الحدث كما يلي:

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

أولئك. يمكن ملاحظة أن التسميات المستخدمة في المثال السابق فارغة. في هذه الحالة ، سوف نستخدم معرف الجلسة لتحديد الهوية ، ولن يتغير حتى يتم إيقاف أو إعادة تشغيل مثيل PostgreSQL.

سيكون موقف مماثل لحالات مماثلة أخرى ، على سبيل المثال ، إيقاف مثيل:

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

في إخراج grok_exporter نحصل على:

# 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

قاعدة الإخطار ، لا فائدة من طرحها ، ستكون مماثلة لتلك التي نوقشت أعلاه.

pg_grok_tpm_file_size_bytes


قم بالحجز على الفور بأن هذا المثال من فئة "حصان كروي في فراغ" ويتم إعطاؤه إلى حد أكبر من أجل إظهار كيف يمكنك تغيير سلوك المقاييس.

سلوك مقياس المقاييس يمكن أن يتأثر تغيير الاحتفاظ و التراكمية المعلمات . في الواقع ، على عكس العداد العادي ، الذي يأخذ في الاعتبار عدد الأسطر التي تتطابق مع نمط المطابقة ، يسمح لك المقياس بالعمل على البيانات من ملف السجل. اتضح أنه يمكننا تراكمها عن طريق زيادة أو تقليل القيمة التي تم الحصول عليها ، أو استخدامها كقيمة متغيرة بشكل تعسفي. وبالتالي ، في الحالة الأولى ، سنكون مهتمين بحجم الزيادة ، في الحالة الثانية - القيمة في حد ذاتها.

دعونا نلقي نظرة على بعض الأمثلة:

  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
    

    , . , .


مما لا شك فيه أن grok_exporter هو الأداة المناسبة لمراقبة التطبيقات. يسمح لك بالنظر في "صعوبة الوصول" لأنظمة المراقبة والأماكن وإثراء المراقبة بمقاييس (تحكم) إضافية ، مع الحفاظ على بساطتها ووظيفتها وخفة وزنها.

في الوقت نفسه ، سيكون مفيدًا للمطورين أيضًا ، نظرًا لأنه يمنح على الأقل وصولاً غير مباشر إلى سجلات التطبيق من خلال نظام مراقبة. حيث يمكنك ربط المقاييس من مصادر مختلفة.

نقطة إيجابية أخرى هي أن المشروع يتطور ويكتسب وظائف جديدة.

بدوره ، آمل أن تكون هذه الملاحظة القصيرة مفيدة ، بما في ذلك للمشروع نفسه. المزيد من النجوم والمزيد من العمل الممتع!

شكرا للجميع!

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


All Articles