Skip to content

Установка

Ссылка на публичный репозиторий: https://git.angara.cloud/gbgreenplum/greenplum.monitoring

Установка через плейбук

Для установки модуля greenplum.monitoring необходимо запустить плейбук GP_mntr согласно инструкции на соответствующей странице.

Ручная установка

Установка Alertmanager

Информация об установке alertmanager представлена на основе страницы https://wiki.glowbyteconsulting.com/pages/viewpage.action?pageId=224267529 и актуальна на 07.02.2024.

  • Скачать и распаковать последнюю версию дистрибутива
Пример
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
mkdir alertmanager-0.26.0
tar xvzf alertmanager-0.26.0.linux-amd64.tar.gz -C alertmanager-0.26.0
  • Установить файлы в системные каталоги и создать пользователя
Пример
cd alertmanager-0.26.0
sudo cp alertmanager /usr/local/bin
sudo cp amtool /usr/local/bin/
sudo mkdir /etc/alertmanager /var/lib/alertmanager
sudo cp alertmanager.yml /etc/alertmanager
sudo useradd --no-create-home --home-dir / --shell /bin/false alertmanager
sudo chown -R alertmanager:alertmanager /var/lib/alertmanager
sudo chown -R alertmanager:alertmanager /etc/alertmanager
  • Создать systemd-юнит:
sudo vim /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target


[Service]
EnvironmentFile=-/etc/default/alertmanager
User=alertmanager
Group=alertmanager
Type=simple
WorkingDirectory=/etc/alertmanager/
ExecStart=/usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager --web.external-url http://0.0.0.0:9093 $ALERTMANAGER_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
Restart=always


[Install]
WantedBy=multi-user.target
  • Запустить сервис
sudo systemctl daemon-reload
sudo systemctl start alertmanager
sudo systemctl status alertmanager
sudo systemctl enable alertmanager
  • Добавить в файл prometheus.yml в раздел alerting адрес alertmanager
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - localhost:9093
  • Перед запуском необходимо открыть порт 9093
sudo firewall-cmd --zone=public --add-port=9093/tcp --permanent
sudo firewall-cmd --reload
  • Отредактировать файл alertmanager.yml

Ниже представлены примеры заполнения файла /etc/alertmanager/alertmanager.yml:

Пример 1
global:
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'your_mail@glowbyteconsulting.com'
  smtp_require_tls: false
  smtp_hello: 'alertmanager'
  smtp_auth_username: 'your_mail@glowbyteconsulting.com'
  smtp_auth_password: 'your_password'

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'email'

receivers:
  - name: 'email'
    email_configs:
    - to: 'mark.lebedev@glowbyteconsulting.com,grigoriy.zhukov@glowbyteconsulting.com'
      send_resolved: true

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
Пример 2
global:
  smtp_smarthost: 'gw.alfaintra.net:25'
  smtp_from: 'gpalert@alfa-bank.info'
  smtp_require_tls: false
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 60m
  receiver: 'email'
receivers:
  - name: 'email'
    email_configs:
    - to: 'skozub@alfabank.ru,mbolaev@alfabank.ru,edolotov@alfabank.ru,ossg_gp@alfabank.ru'
      send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
  • Создать файл /etc/alertmanager/rules.yml
Пример файла /etc/alertmanager/rules.yml

groups:
   - name: node_exporter
     rules:
       - alert: PrometheusTargetMissing
         expr: up == 0
         for: 0m
         labels:
           severity: critical
         annotations:
           summary: "Сервис node_exporter на сервере {{ $labels.instance }} недоступен"
           description: "Возможно сервис node_exporter упал или сервер недоступен\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
  • Добавить в файл prometheus.yml информацию о правилах алертов
Пример файла /etc/prometheus/prometheus.yml

rule_files:
   - /etc/alertmanager/rules.yml

Файлы конфигурации

rules.yml

Пример файла /etc/alertmanager/rules.yml

После добавления файла rules.yml в директорию /etc/alertmanager/ на мониторинговом хосте добавить информацию о правилах алертов в файл prometheus.yml.

/etc/prometheus/prometheus.yml

rule_files:
   - /etc/alertmanager/rules.yml

Перезапустить сервисы

sudo systemctl restart prometheus
sudo systemctl restart alertmanager
sudo systemctl status prometheus
sudo systemctl status alertmanager
/etc/alertmanager/rules.yml

groups:
- name: node_exporter
  rules:
  - alert: HighCPUUtilization
    expr: (avg by(instance) (rate(node_cpu_seconds_total{job="node",mode="idle"}[1m]))) < 0.25
    for: 30m
    labels:
      severity: warning
    annotations:
      summary: "Высокая утилизация CPU на {{ $labels.instance }}"
      description: "Утилизация CPU на инстансе {{ $labels.instance }} выше 75% в течение 30 минут"

  - alert: DiskSpaceUtilization
    expr: (100 * (node_filesystem_size_bytes{fstype=~"ext4|xfs", mountpoint=~".*"} - node_filesystem_free_bytes{fstype=~"ext4|xfs", mountpoint=~".*"}) / node_filesystem_size_bytes{fstype=~"ext4|xfs", mountpoint=~".*"}) > 80
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "Файловая система {{ $labels.mountpoint }} почти полная на хосте {{ $labels.instance }})"
      description: "Файловая система {{ $labels.mountpoint }} использует место более 80%"

  - alert: HighIOUsage
    expr: (avg by(device,instance) (rate(node_disk_io_time_seconds_total{device=~"sd[a-z]"}[1m]))) > 0.5    
    for: 20m
    labels:
      severity: warning
    annotations:
      summary: "Высокая утилизация I/O на разделе {{ $labels.device }} инстанса {{ $labels.instance }}"
      description: "Утилизация I/O раздела {{ $labels.device }}  на инстансе {{ $labels.instance }} превысила 50% на протяжении последних 20 минут"

  - alert: DiskQueueLengthHigh
    expr: (avg by(instance, device) (rate(node_disk_io_time_weighted_seconds_total{device=~"sd[a-z]"}[10m]))) > 90
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "Высокий размер очереди на диске {{ $labels.device }} инстанса {{ $labels.instance }}"
      description: "Средний размер очереди на диске {{ $labels.device }} больше 90 в течение последних 10 минут" 

  - alert: SwapSpaceLow
    expr: (((node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / (node_memory_SwapTotal_bytes)) * 100) > 85
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Мало свободного места на swap {{ $labels.instance }}"
      description: "Свободного места на swap разделе {{ $labels.instance }} меньше 15 %"


- name: sql_exporter
  rules:
  - alert: LargeNumberConnections
    expr: gp_sess_info{cluster_conn="all_sess"} > 650
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Большое количество соединений к базе на мастер-инстансе {{ $labels.instance }}"
      description: "Количество соединений Greenplum на мастере {{ $labels.instance }} больше 650"

  - alert: HighSpillUsage
    expr: gp_spill_files_all_size > 600
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Большой размер spill файлов {{ $labels.instance }}"
      description: "Создано спиллов более чем на 600 GB {{ $labels.instance }} "

  - alert: ManyLockedSessions
    expr: percentage_blocked_sessions > 30
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Много сессий в ожидании {{ $labels.instance }}"
      description: "Заблокированных сессий более чем 30% от общего числа {{ $labels.instance }} "

  - alert: WaitingReasonResgroup
    expr: waiting_reason_resgroup_counter > 1
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Есть сессии с причиной ожидания resgroup {{ $labels.instance }}"
      description: "Наличие сессий в состоянии ожидания resgroup {{ $labels.instance }} более 5ти минут "

  - alert: ManyPartitions
    expr: gp_partitions_many > 1000
    for: 2h
    labels:
      severity: warning
    annotations:
      summary: "{{ $value }} партиций в таблице {{ $labels.schemaname }}.{{ $labels.tablename }} на хосте {{ $labels.instance }}"
      description: "Партиций больше тысячи в таблице {{ $labels.schemaname }}.{{ $labels.tablename }}"

- name: status_services
  rules:
  - alert: ClusterStatus
    expr: gp_master_up < 1
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Мастер недоступен : {{ $labels.instance }}"
      description: "Мастер {{ $labels.instance }} находится в недоступном состоянии в течении 5 минут"

  - alert: PrometheusScrapeDown
    expr: up == 0
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Скрейп {{ $labels.job }} недоступен"
      description: "Прометеус не может скрейпить {{ $labels.job }} в течении 5 минут"

  - alert: PXFStatusDown
    expr: gp_pxf_status < 1
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "PXF {{ $labels.instance }} недоступен"
      description: "Служба PXF недоступна {{ $labels.job }} в течении 10 минут"
   
gp-alert.coolector.yml

Пример файла /opt/sql_exporter/gp-alert.coolector.yml

После добавления файла gp-alert.collector.yml в директорию /opt/sql_exporter/ на мастере добавить connector_name в файл конфигурации sql_exporter.yml.

/opt/sql_exporter/sql_exporter.yml

# Collectors (referenced by name) to execute on the target.
collectors: [gp_collector,gp_collector_slow,alert_collector]

После внесения изменений перезапустить сервис sql_exporter и убедитесь в его работоспособности.

sudo systemctl restart sql_exporter
sudo systemctl status sql_exporter
/opt/sql_exporter/gp-alert.coolector.yml

collector_name: alert_collector
#Similar to global.min_interval, but applies to the queries defined by this collector only.
min_interval: 5m
metrics:
  #
  # All spill files size
  #
  - metric_name: gp_spill_files_all_size
    type: gauge
    help: 'All spill files size'
    values: [all_spill]
    query_ref: spill_size
  #
  # Percentage of blocked sessions
  #
  - metric_name: percentage_blocked_sessions
    type: gauge
    help: 'Percentage of blocked sessions'
    values: [percent_blocked]
    query_ref: blocked_sessions
  #
  # Session waiting reason is resgroup
  #
  - metric_name: waiting_reason_resgroup_counter
    type: gauge
    help: 'Waiting reason is resgroup'
    values: [count_waiting_resgroup]
    query_ref: waiting_resgroup

  - metric_name: gp_partitions_many
    type: gauge
    help: 'Partitions in the table > 1000'
    key_labels:
      - schemaname
      - tablename
    values: [partitions]
    query_ref: many_partitions

  - metric_name: gp_audit_tables_skew
    type: gauge
    help: 'Skew tables'
    key_labels:
      - table
      - total_size_mb
    values: [skew_percent]
    query_ref: skew_tables

  - metric_name: gp_audit_schema_sizes
    type: gauge
    help: 'Schema sizes'
    key_labels:
      - nspname
      - schsize_gb
    values: [val]
    query_ref: relation_sizes

  - metric_name: gp_session_idle_transaction
    type: gauge
    help: 'Idle in transaction  1 hour'
    key_labels:
      - sess_id
      - pid
      - usename
      - state
      - gp_sess_start_time
      - gp_sess_application_name
      - query
    values: [val]
    query_ref: idle_transaction


queries:


  - query_name: idle_transaction
    query: |
      select
        sess_id,
        pid,
        usename,
        state,
        to_char(backend_start, 'DD-MM-YYYY HH24:MI:SS') as gp_sess_start_time,
        application_name as gp_sess_application_name,
        query,
        1 as val
      from pg_stat_activity
      where usename <> 'gpmon'
        and state like '%in%'
        and age(now(),state_change) > interval '1 hour'
      order by gp_sess_start_time


  - query_name: spill_size
    query: |
      select
        sum(size_spill_files_gb) as all_spill
      from
       (select
          query,
          sum(size) /1024 /1024 /1024 :: float size_spill_files_gb,
          sum(numfiles) count_spill_files
        from gp_toolkit.gp_workfile_usage_per_query gwupq
        group by query) sf 


  - query_name: blocked_sessions
    query: |
      select
        round(100 * sum(case when waiting is true then 1 else 0 end) / count(*), 2) as percent_blocked
      from pg_catalog.pg_stat_activity psa      


  - query_name: waiting_resgroup
    query: |
      select
        sum(case when waiting_reason = 'resgroup' then 1 else 0 end) as count_waiting_resgroup
      from pg_catalog.pg_stat_activity psa

  - query_name: many_partitions
    query: |
      select schemaname,tablename, count(4) as partitions from pg_partitions group by 1,2 order by partitions desc limit 20

  - query_name: skew_tables
    query: |
        select
          nspname||'.'||relname as table,
          total_sz_mb as total_size_mb,
          sgm_dstr_std_dev as skew_percent,
          poll_ts  
        from gbc_toolkit.v_usr_tables_audit
        where 1=1
          and total_sz_mb > 100
          and sgm_dstr_std_dev > 10
        order by poll_ts desc nulls last

  - query_name: relation_sizes
    query: |
        select
          nspname,
          pg_size_pretty(trunc(sum(total_sz_mb * 1024 * 1024))) schsize_gb,
          1 as val
        from gbc_toolkit.v_usr_tables_audit
        group by 1

Установка Prometheus

Установка Prometheus состоит из следующих шагов:

  1. Установка Prometheus server
  2. Установка Prometheus Node Exporter
  3. Установка Prometheus SQL Exporter
  4. Установка Prometheus JMX Exporter

Установка Prometheus Server

  • Скачать дистрибутив Prometheus с официального сайта, разместить на хост мониторинга и распаковать

  • Перенести исполняемые файлы в системные каталоги ОС и создать пользователя под Prometheus

cd prometheus-*
sudo cp prometheus promtool /usr/local/bin
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo cp prometheus.yml /etc/prometheus
sudo useradd --no-create-home --home-dir / --shell /bin/false prometheus
sudo chown -R prometheus:prometheus /var/lib/prometheus
  • Создать systemd-юнит /etc/systemd/system/prometheus.service со следующим содержанием
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/usr/local/bin/prometheus \
  --config.file /etc/prometheus/prometheus.yml \
  --storage.tsdb.path /var/lib/prometheus/ \
  --storage.tsdb.retention.time=7d
ExecReload=/bin/kill -HUP $MAINPID
ProtectHome=true
ProtectSystem=full

[Install]
WantedBy=default.target
  • Запустить Prometheus
sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl status prometheus
sudo systemctl enable prometheus

Установка Node Exporter

На каждом хосте целевой системы выполнить следующие действия:

  • Скачать и распаковать дистрибутив Node Exporter 1.Х.Х
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar xf node_exporter-*.tar.gz
  • Перенести исполняемые файлы в системные каталоги ОС и создать пользователя node_exporter:
cd node_exporter-*
sudo cp node_exporter /usr/local/bin
sudo useradd --no-create-home --home-dir / --shell /bin/false node_exporter
  • Создать systemd-юнит /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target

[Service]
Type=simple
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter
SyslogIdentifier=node_exporter
Restart=always
PrivateTmp=yes
ProtectHome=yes
NoNewPrivileges=yes
ProtectSystem=strict
ProtectControlGroups=true
ProtectKernelModules=true
ProtectKernelTunables=yes

[Install]
WantedBy=multi-user.target
  • Запустить сервисы node_exporter:
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl status node_exporter
sudo systemctl enable node_exporter
  • Открыть порт 9100 для возможности сбора метрик
sudo firewall-cmd --zone=public --add-port=9100/tcp --permanent
sudo firewall-cmd --reload
  • На хосте мониторинга добавить в файл prometheus.yml в раздел scrape_configs адреса хостов для сбора метрик
- job_name: 'node'
  static_configs:
  - targets: ['ip:9100'] # IP адреса машин с установленным node_exporter
  • Перезапустить Prometheus

Установка SQL Exporter

На master-хосте Greenplum выполнить следующие действия:

  • Скачать и распаковать дистрибутив SQL Exporter 0.5
tar xf sql_exporter-*.tar
  • Перенести исполняемые файлы в системные каталоги ОС и создать пользователя sql_exporter
cd sql_exporter-*
sudo cp sql_exporter /usr/local/bin
sudo mkdir /opt/sql_exporter
sudo cp * /opt/sql_exporter
sudo useradd --no-create-home --home-dir / --shell /bin/false sql_exporter
sudo chown -R sql_exporter:sql_exporter /opt/sql_exporter
  • Создать systemd-юнит /etc/systemd/system/sql_exporter.service:
[Unit]
Description=Prometheus SQL Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=sql_exporter
Group=sql_exporter
WorkingDirectory=/opt/sql_exporter
ExecStart=/usr/local/bin/sql_exporter
Restart=always

[Install]
WantedBy=multi-user.target
  • Создать файл /opt/sql_exporter/gp.collector.yml, в котором прописываются запросы для получения необходимых метрик.
    Пример содержимого файла:
collector_name: test_collector
metrics:
- metric_name: database_cnt_active_processes
  type: gauge
  help: 'Total stall time in seconds per database'
  key_labels:
  - datname
  values: [cnt_active]
  query: |
    select distinct datname, count(*) over(partition by datname order by datname) as cnt_active 
    from pg_stat_activity where state like '%active%'
  • Отредактировать файл /opt/sql_exporter/sql_exporter.yml и укажите реквизиты для подключения к СУБД Greenplum
global:
  scrape_timeout_offset: 500ms
  min_interval: 30s
  max_connections: 3
  max_idle_connections: 3

target:
  data_source_name: 'postgres://user:password@localhost:5432/dbname?sslmode=disable'
  collectors: [test_collector]

collector_files:
- "*.collector.yml"
  • Запустить сервисы sql_exporter:
sudo systemctl daemon-reload
sudo systemctl start sql_exporter
sudo systemctl status sql_exporter
sudo systemctl enable sql_exporter
  • Открыть порт 9399 для возможности сбора метрик
sudo firewall-cmd --zone=public --add-port=9399/tcp --permanent
sudo firewall-cmd --reload
  • На хосте мониторинга добавить в файл prometheus.yml в раздел scrape_configs адреса хостов для сбора метрик
- job_name: 'sql_exporter'
  static_configs:
  - targets: ['master_ip:9399']
  • Перезапустить Prometheus

Установка JMX Exporter

На мастер-хосте Greenplum выполнить следующие действия:

  • Склонировать репозиторий JMX Exporter 0.16.2
git clone https://github.com/prometheus/jmx_exporter.git
  • Установить maven и скомпилируйте исполняемый файл экспортера:
# Для CentOS/RHEL
sudo yum install maven

# Для Ubuntu/Debian  
sudo apt install maven

cd jmx_exporter
mvn package
  • Создать файл конфигурации ~/jmx_exporter/config.yml:
startDelaySeconds: 0
ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false
  • В файле $PXF_CONF/pxf-env.sh добавить следующую строку:
export PXF_JVM_OPTS="-Xmx2g -Xms1g -javaagent:/home/gpadmin/jmx_exporter/jmx_prometheus_javaagent/target/jmx_prometheus_javaagent-0.16.2-SNAPSHOT.jar=8080:/home/gpadmin/jmx_exporter/config.yml"
  • Перенести файлы экспортера на все хосты Greenplum
zip -r jmx_exporter.zip ~/jmx_exporter
# Повторите для каждого хоста
scp jmx_exporter.zip gpadmin@<host_ip>:/home/gpadmin/
# Выполнить на каждом хосте
ssh gpadmin@<host_ip> "cd /home/gpadmin && unzip jmx_exporter.zip"
  • Синхронизировать и перезапустить PXF
pxf cluster sync
pxf cluster stop
pxf cluster start
  • На хосте мониторинга добавить информацию о собираемых метриках в файл /etc/prometheus/prometheus.yml:
- job_name: 'jmx'
  static_configs:
  - targets: ['host1_ip:8080', 'host2_ip:8080'] # Добавить IP всех хостов GP
  • Перезапустить Prometheus

Установка Grafana

  • Установить Grafana на хост мониторинга при помощи пакетного менеджера yum или apt
wget https://dl.grafana.com/oss/release/grafana-7.4.3-1.x86_64.rpm #centos
sudo yum install grafana-7.4.3-1.x86_64.rpm #centos

sudo apt-get install -y adduser libfontconfig1 #ubuntu
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_8.5.3_amd64.deb #ubuntu
sudo dpkg -i grafana-enterprise_8.5.3_amd64.deb #ubuntu 
  • Открыть порт 3000
sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent
sudo firewall-cmd --reload
  • Запустить Grafana:
sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server
sudo systemctl enable grafana-server