Используйте Prometheus+Grafana для быстрого создания высококачественной платформы мониторинга

Java

Знакомство с Прометеем

PrometheusЭто система мониторинга с открытым исходным кодом, разработанная на языке Go и аналогичная реализации системы мониторинга Google BorgMon.

Основной принцип Prometheus заключается в периодическом захвате состояния отслеживаемых компонентов через HTTP-протокол.Любой компонент может получить доступ к мониторингу, если он предоставляет соответствующий HTTP-интерфейс.Это одна из систем мониторинга, которая больше подходит для Docker, Kubernetes и другие среды. HTTP-интерфейс для вывода информации мониторинга называетсяexporter.

Архитектура Прометея

Прометей используетPullМодель Prometheus Server извлекает данные мониторинга из каждой цели через запрос HTTP.

Prometheus 架构图

  • Retrieval: определяет, откуда Prometheus Server должен извлекать данные.
    • Jobs / Exporters: Prometheus может извлекать данные мониторинга из Jobs или Exporters. Экспортер предоставляет интерфейс сбора данных в виде веб-API.
    • Prometheus Server: Prometheus также может получать данные с других серверов Prometheus.
    • Pushgateway: Для некоторых компонентов, работающих как временные задания, Prometheus может не успеть извлечь из них данные мониторинга, эти задания завершились, среда выполнения задания может передать данные мониторинга на Pushgateway во время выполнения, а Prometheus извлечет данные мониторинга из Pushgateway. Данные извлекаются для предотвращения потери данных мониторинга.
    • Service: Это означает, что Prometheus может динамически обнаруживать некоторые сервисы и извлекать данные для мониторинга, такие как обнаружение из DNS, Kubernetes и Consul.
  • Storage: Хранилище Prometheus, использующее локальное хранилище Prometheus Server.
  • PromQL: это оператор запроса Prometheus, который можно интегрировать с некоторыми WEBUI (такими как Grafana) с помощью PromQL.
  • AlertManager: это внешний компонент, независимый от Prometheus, который используется для мониторинга системных аварийных сигналов.Некоторые правила аварийных сигналов можно настроить с помощью файлов конфигурации, и Prometheus будет отправлять аварийные сигналы в AlertManager.

Особенности Прометея

  • Многомерная модель данных, временной ряд определяется метрикой и несколькими парами ключ-значение тега;
  • Гибкий язык запросов для реорганизации собранных данных временных рядов;
  • Мощная функция визуализации данных, помимо встроенного браузера, также поддерживает интеграцию с Grafana;
  • Эффективное хранилище, память плюс локальный диск, масштабируемая производительность за счет функционального сегментирования и объединения;
  • Простая эксплуатация и обслуживание, полагайтесь только на локальный диск, бинарный установочный пакет Go не имеет других зависимостей от пакетов библиотек;
  • точное предупреждение;
  • Очень много клиентских библиотек;
  • Для сбора общих системных показателей предоставляется ряд экспортеров;
  • Данные временных рядов могут передаваться через промежуточный шлюз;
  • Обнаружение целевых объектов службы с помощью обнаружения службы или статической конфигурации.

основная концепция

модель данных

По сути, все данные, хранящиеся в Prometheus,时间序列数据(Данные временного ряда, называемые данными временного ряда). Данные временного ряда — это поток данных с отметками времени, и поток данных принадлежит определенной метрике (метрике) и нескольким меткам (меткам) под метрикой.

  • Метрика: описывает отслеживаемую характеристику измерения. Имя метрики состоит из букв ASCII, цифр, знаков подчеркивания и двоеточий и должно соответствовать регулярному выражению.[a-zA-Z_:][a-zA-Z0-9_:]*.
  • Метка (Tag): метрика по отношению к различным комбинациям значений будет формировать временную метку для определенного измерения. Открытая многомерная модель данных Prometheus. Язык запросов Prometheus и может быть отфильтрован с помощью метрик и меток данных временных рядов полимеризации. Имя ярлыка может содержать буквы ASCII, цифры и символы подчеркивания, должно соответствовать регулярному выражению.[a-zA-Z_][a-zA-Z0-9_]*, имена меток с подчеркиванием _ зарезервированы для внутреннего использования. Значение тега может содержать любой символ Юникода, в том числе китайский.
  • Образец: данные временного ряда на самом деле представляют собой ряд выборочных значений. Каждое значение образца включает:
    • 64-битные данные с плавающей запятой
    • Отметка времени с точностью до миллисекунд
  • Аннотация: аннотация состоит из метрики и набора пар "ключ-значение" тега.

показатели

Метрики в Prometheus бывают следующих типов:

  • прилавок(Счетчик): совокупная метрика, которая представляет собой значение, которое можно только увеличить. Счетчики в основном используются для подсчета данных, таких как запросы к серверу, выполнение задач и ошибки.
  • Измерять(Датчик): представляет показатель, который можно как увеличивать, так и уменьшать. Измерители в основном используются для измерения мгновенных данных, таких как температура и использование памяти.
  • Гистограмма(Гистограмма): Выборка наблюдений (обычно таких данных, как продолжительность запроса или размер ответа) и их подсчет в настраиваемых сегментах. Существует несколько способов создания гистограммы (при условии, что метрика<basename>):
    • Подсчет по ведру, что эквивалентно<basename>_bucket{le="<upper inclusive bound>"}
    • Сумма выборочных значений, эквивалентная<basename>_sum
    • Общее количество выборочных значений, эквивалентное<basename>_count, что также эквивалентно помещению всех выборочных значений в ведро для подсчета<basename>_bucket{le="+Inf"}
  • Резюме(Резюме): выборочные наблюдения. Помимо подсчета суммы и общего количества выборочных значений, он также может подсчитывать по квантилям. Существует несколько способов создания сводок (при условии, что метрика<basename>):
    • Квантиль, то есть отношение числа выборочных значений меньше квантиля к сумме меньше чемφ, эквивалентно<basename>{quantile="<φ>"}
    • Сумма выборочных значений, эквивалентная<basename>_sum
    • Общее количество выборочных значений, эквивалентное<basename>_count

Задачи и примеры

В Prometheus конечные точки, из которых можно получить образцы, называются экземплярами, и несколько таких экземпляров реплицируются для масштабирования производительности для формирования задачи.

  • Задача(Работа): Возьмите задачу, которой она принадлежит.
  • примерПоймал исходный экземпляр.

Мониторинг Prometheus в действии

Установка и развертывание Prometheus

# 1. 下载
wget https://github.com/prometheus/prometheus/releases/download/v2.10.0/prometheus-2.10.0.linux-amd64.tar.gz

# 2. 解压
tar zxvf prometheus-2.10.0.linux-amd64.tar.gz

# 3. 启动
cd prometheus-2.10.0.linux-amd64
./prometheus --config.file=prometheus.yml

установка и развертывание экспортера

node_exporter

# 1. 下载
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.darwin-amd64.tar.gz

# 2. 解压
tar zxvf node_exporter-0.18.1.darwin-amd64.tar.gz

# 3. 启动
cd node_exporter-0.18.1.darwin-amd64
./node_exporter

nginx-vts-exporter

Здесь я использую openresty, то же самое верно, если я использую nginx

Скачать зависимые пакеты

cd /usr/local/src/openresty-1.15.8.1/bundle

# openssl
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz

# ngx_cache_purge
wget http://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.zip -O ngx_cache_purge.zip

# nginx-module-vts
wget http://github.com/vozlt/nginx-module-vts/archive/v0.1.18.zip -O nginx-module-vts.zip

# upstream 健康检查
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip -O nginx_upstream_check_module.zip
unzip nginx_upstream_check_module.zip
cd nginx-1.15.8
patch -p1 < ../nginx_upstream_check_module-master/check_1.14.0+.patch

компилируем и устанавливаем nginx

./configure --prefix=/opt/openresty \
--with-http_auth_request_module \
--with-http_realip_module \
--with-http_v2_module \
--with-debug \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module  \
--with-http_gunzip_module \
--with-http_random_index_module \
--with-threads \
--with-pcre \
--with-luajit \
--with-mail \
--with-file-aio \
--with-http_v2_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_dav_module \
--with-http_sub_module \
--with-http_addition_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-http_secure_link_module \
--with-stream_ssl_preread_module \
--with-openssl=./bundle/openssl-1.1.1c \
--add-module=./bundle/ngx_cache_purge-2.3 \
--add-module=./bundle/nginx-module-vts-0.1.18 \
--add-module=./bundle/nginx_upstream_check_module-master \
-j2  

gmake && gmake install

конфигурация nginx

http {
    vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_host on;   #开启此功能,会根据不同的server_name进行流量的统计,否则默认会把流量全部计算到第一个上。
    ...
    server {
        ...
		location /status {
    		vhost_traffic_status_display;
    		vhost_traffic_status_display_format html;
		}
        # vhost_traffic_status off;
    }
}

Если вы не хотите контролировать этот домен, это нужно сделать вserverконфигурация в модулеvhost_traffic_status off;

установка nginx-vts-exporter

# 1. 下载
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.0/nginx-vts-exporter-0.10.0.linux-amd64.tar.gz
# 2. 解压
tar zxvf nginx-vts-exporter-0.10.0.linux-amd64.tar.gz
# 3. 启动
cd nginx-vts-exporter-0.10.0.linux-amd64

redis_exporter

# 1. 下载
wget https://github.com/oliver006/redis_exporter/releases/download/v1.0.3/redis_exporter-v1.0.3.linux-amd64.tar.gz
# 2. 解压
tar zxvf redis_exporter-v1.0.3.linux-amd64.tar.gz
# 3. 启动
cd redis_exporter-v1.0.3.linux-amd64
./redis_exporter -redis.addr 192.168.102.55:7000 -redis.password test --web.listen-address 0.0.0.0:9121

Prometheus добавляет конфигурацию Exporter

После установки экспортера необходимо добавить экспортер в конфигурацию prometheus.Простая конфигурация выглядит следующим образом:

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']
    
  - job_name: "node"
    static_configs:
    - targets: 
      - '192.168.26.18:9100'
      - '192.168.102.51:9100'
      - '192.168.102.58:9100'
      - '192.168.102.59:9100'
      #labels:
      #  instance: "192.168.26.18:9100"
      #  env: "pro"
      #  name: "192.168.26.18"
    
  - job_name: 'nginx'
    static_configs:
    - targets: 
      - '192.168.102.51:9913'
      - '192.168.102.58:9913'
      - '192.168.102.59:9913'
    
  - job_name: 'redis-exporter'
    file_sd_configs:
    - files: ['./redis.json']

Файл конфигурации redis.json выглядит следующим образом:

[{
        "targets": [
            "192.168.102.53:9121",
            "192.168.102.53:9122",
            "192.168.102.54:9121",
            "192.168.102.54:9122",
            "192.168.102.55:9121",
            "192.168.102.55:9122",
            "192.168.102.70:9121",
            "192.168.102.70:9122",
            "192.168.102.71:9121",
            "192.168.102.71:9122",
            "192.168.102.72:9121",
            "192.168.102.72:9122"
        ],
        "labels": {
            "service": "redis"
        }
    }
]

Просто перезапустите прометей. Последний шаг — настроить визуализацию Grafana.

Конфигурация установки Grafana

Grafana — это кроссплатформенный инструмент для анализа и визуализации метрик с открытым исходным кодом, который может запрашивать собранные данные, а затем визуализировать их и своевременно уведомлять об этом.

  1. Руководство по установке Графаны

  2. Grafana добавляет источник данных Prometheus

  3. Импортировать информационную панель

Изображение эффекта:

  • Мониторинг Nginx

Nginx 监控

  • Мониторинг Redis

Redis 监控

  • Мониторинг узлов

Node 监控

-- END -- Добро пожаловать, нажмите и удерживайте изображение, чтобы подписаться на общедоступный номер DigNew

欢迎长按下图关注公众号 DigNew


Рекомендуемое чтение: