Установка
Ссылка на публичный репозиторий: 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-юнит:
[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
- Перед запуском необходимо открыть порт 9093
- Отредактировать файл
alertmanager.yml
Ниже представлены примеры заполнения файла /etc/alertmanager/alertmanager.yml:
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']
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
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информацию о правилах алертов
rule_files:
- /etc/alertmanager/rules.yml
Файлы конфигурации
rules.yml
Пример файла /etc/alertmanager/rules.yml
После добавления файла rules.yml в директорию /etc/alertmanager/ на мониторинговом хосте добавить информацию о правилах алертов в файл prometheus.yml.
rule_files:
- /etc/alertmanager/rules.yml
Перезапустить сервисы
sudo systemctl restart prometheus
sudo systemctl restart alertmanager
sudo systemctl status prometheus
sudo systemctl status alertmanager
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.
# Collectors (referenced by name) to execute on the target.
collectors: [gp_collector,gp_collector_slow,alert_collector]
После внесения изменений перезапустить сервис sql_exporter и убедитесь в его работоспособности.
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 состоит из следующих шагов:
- Установка Prometheus server
- Установка Prometheus Node Exporter
- Установка Prometheus SQL Exporter
- Установка 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 для возможности сбора метрик
- На хосте мониторинга добавить в файл
prometheus.ymlв разделscrape_configsадреса хостов для сбора метрик
- job_name: 'node'
static_configs:
- targets: ['ip:9100'] # IP адреса машин с установленным node_exporter
- Перезапустить Prometheus
Установка SQL Exporter
На master-хосте Greenplum выполнить следующие действия:
- Скачать и распаковать дистрибутив SQL Exporter 0.5
- Перенести исполняемые файлы в системные каталоги ОС и создать пользователя 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 для возможности сбора метрик
- На хосте мониторинга добавить в файл
prometheus.ymlв разделscrape_configsадреса хостов для сбора метрик
- Перезапустить Prometheus
Установка JMX Exporter
На мастер-хосте Greenplum выполнить следующие действия:
- Склонировать репозиторий JMX Exporter 0.16.2
- Установить maven и скомпилируйте исполняемый файл экспортера:
# Для CentOS/RHEL
sudo yum install maven
# Для Ubuntu/Debian
sudo apt install maven
cd jmx_exporter
mvn package
- Создать файл конфигурации
~/jmx_exporter/config.yml:
- В файле
$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
- На хосте мониторинга добавить информацию о собираемых метриках в файл
/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
- Запустить Grafana: