Prometheus

Prometheus

Push Gateway

Time series | Временной ряд

Полное руководство по Prometheus в 2019 году

Prometheus: запуск и исполнение

Знакомство с PromQL

statping | https://github-wiki-see.page/m/statping/statping/wiki/Docker-Compose

Run

# --- localhost:9090 - web-interface
#     localhost:9090/metrics - metrics
docker run --rm -p 9090:9090 prom/prometheus

Типы метрик

Counter (счетчик)
Cчитает элементы за период времени. Счетчик может только увеличивать или обнулять число,
Guage (измеритель)
Измерители имеют дело со значениями, которые со временем могут уменьшаться. Их можно сравнить с термометрами — если посмотреть на термометр, увидим текущую температуру. Измеритель не показывает развитие метрики за период времени.
Histogram (гистограмма)
Гистограмма — это более сложный тип метрики. Она предоставляет дополнительную информацию. Например, сумму измерений и их количество.
Summary (сводка)
Сводки — это расширенные гистограммы. Они тоже показывают сумму и количество измерений, а еще квантили за скользящий период.
Квантили
Квантили - это деление плотности вероятности на отрезки равной вероятности.

PromQL

FUNCTIONS

https://timber.io/blog/promql-for-humans/

SLAs, SLOs, SLIs Word Soup

My Prometheus is Overwhelmed! Help!

Вектор — это такой способ записывать, хранить и обрабатывать не одно число, а какое-то организованное множество чисел. Благодаря векторам мы можем представить это множество как единый объект и изучать его взаимодействие с другими объектами.

Instant Vector (моментальный вектор) - представляет все метрики по последней метке времени.

Range Vector (вектор с диапазоном времени) - если вам нужно посмотреть развитие метрики со временем, вы можете указать диапазон времени в запросе к Prometheus. В итоге получите вектор, объединяющий все значения, записанные за выбранный период.

# количество запросов в минуту
sum(increase(traefik_service_requests_total[1m]))

# количество запросов в секунду (усреднено за минуту)
sum(rate(traefik_service_requests_total[1m]))

JVM

https://sematext.com/blog/jvm-metrics/

Alerting

My Alert Philosophy by Rob Ewaschuk

Alert Manager

github

in docker

Running

docker run \
  --name alertmanager \
  --rm \
  -p 9093:9093 \
  quay.io/prometheus/alertmanager

Prometheus Bot

Телеграм-бот для Alert Manager

github

Конфигурация

# config.yaml
telegram_token: "658598157:AAFEkOK4cB9cRN1yuF6ee0UYlU7Lb2XRZHA"
time_zone: "Europe/Moscow"
split_token: "|"    

Собираем образ

wget https://raw.githubusercontent.com/inCaller/prometheus_bot/master/Dockerfile
docker build -t prombot .

Запускаем контейнер

docker run \
  --rm \
  --name=prometheus_bot \
  -v /tmp/config.yaml:/config.yaml \
  -p 9087:9087 \
  prombot

Done! Congratulations on your new bot. You will find it at t.me/ds4dev_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

  • Use this token to access the HTTP API:

658598157:AAFEkOK4cB9cRN1yuF6ee0UYlU7Lb2XRZHA Keep your token secure and store it safely, it can be used by anyone to control your bot.

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

В условиях блокировок Telegram серверов, при попытке запуска бота выдается сообщение:

Post https://api.telegram.org/...: remote error: tls: access denied

Нам может потребоваться прокси-сервер, который сможет обойти блокировку.

Например alpine-tor

# Лучше собирать образ ручками, т.к. на hub.docker.com лежит очень древний
git clone git@github.com:zet4/alpine-tor.git
cd alpine-tor
docker build -t alpine-tor .
docker run -d --rm --name=alpine-tor -p 5566:5566 -p 2090:2090 -e tors=25 alpine-tor
curl --socks5 localhost:5566 http://httpbin.org/ip
curl http://httpbin.org/ip

Exporters

EXPORTERS AND INTEGRATIONS

Node Exporter

Коллектор метрик ОС

github

https://inuits.eu/blog/prometheus-tls/

Собираем из исходников

go get github.com/prometheus/node_exporter
cd ${GOPATH-$HOME/go}/src/github.com/prometheus/node_exporter
# Если при сборке выдается ошибка, можно попробовать обновить версию go
make
./node_exporter <flags>

Загружаем бинарник

cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz
tar -xvf node_exporter-0.17.0.linux-amd64.tar.gz
sudo mv node_exporter-0.17.0.linux-amd64/node_exporter /usr/local/bin/

Образец конфигурации systemctl

# /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

Запуск systemd

# перезагружаем системный демон
sudo systemctl daemon-reload
# запускаем программу как сервис
sudo systemctl start node_exporter
# проверяем статус
sudo systemctl status node_exporter
# добавляем в автозапуск
sudo systemctl enable node_exporter

# удаляем из автозапуска
sudo systemctl disable node_exporter
# останавливаем сервис
sudo systemctl stop node_exporter

Проверяем работу node_exporter по URL: http://target_ip:9100/metrics

Образец конфигурации prometheus

# /tmp/prometheus.yml
global:
  scrape_interval: 10s
  scrape_configs:
    - job_name: prometheus
      static_configs:
        - targets:
          - localhost:9090
    - job_name: node
      static_configs:
        - targets:
          - localhost:9100

Docker

https://docs.docker.com/config/thirdparty/prometheus/

CAdvisor

https://prometheus.io/docs/guides/cadvisor/

Нативный запуск cadvisor cadv releases

cd /tmp
curl -LO https://github.com/google/cadvisor/releases/download/v0.33.0/cadvisor
chmod +x cadvisor
sudo mv cadvisor /usr/local/bin/

Образец конфигурации systemd

# /etc/systemd/system/cadvisor.service
[Unit]
Description=CAdvisor
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/cadvisor -port 9180

[Install]
WantedBy=multi-user.target

Проверяем работу cadvisor по URL: http://target_ip:9180/metrics

Если не отображается количество используемой памяти контейнерами, то можно попробовать следующее: https://github.com/google/cadvisor/issues/1039#issuecomment-170730496

Postgres

https://github.com/wrouesnel/postgres_exporter

https://habr.com/ru/post/345370/

Troubleshooting

Какой-то контейнер "съел" всю память

Выявлено, что некий контейнер на CI сервере во время прохождения ночной сборки занял 6 из 8 ГБ. Данный контейнер существовал ограниченное время и был удален после завершения тестирования. Задача - определить роль этого контейнера.

Учитывая, что docker не хранит историю создания и удаления контейнеров, решение задачи не является тривиальным.

Порядок действий:

1) Определение ид-ра контейнера. Копируем запрос соответствующей панельки в раздел Explore и определяем поле id в формате {id="/docker/ee4617f5b...",name="CONTAINER_NAME"}

2) На сервере CI ищем по данному ид-ру что-нибудь в директории `/var/lib/docker/containers'

sudo grep -r 'ee461' /var/lib/docker/containers
...
/var/lib/docker/containers/38e1846...-json.log
7 01:19:35 [204054] [STARTING_CONTAINER] [selenoid/vnc_firefox:63.0] [ee4617f5b836307de5bf44aadadd20875077148f83099151fbf9c3fa834d51ea]\n","stream":"stderr","time":"2019-03-27T01:19:35.554475326Z"}
...

Указанный ид-р проходит с формулировкой [STARTING_CONTAINER] [selenoid/vnc_firefox:63.0] [ee4617...]. Это означает, "некий контейнер" является виртуальным браузером, который прогоняет UI-тесты. Имя файла, в котором найдена указанная строка называется /var/lib/docker/containers/38e1846...-json.log, где 38e1846 - это ид-р другого контейнера, который создал искомый контейнер.

Можно определить имя этого контейнера, если он запущен

docker ps -a | grep 38e1846
38e184671962        aerokube/selenoid:1.7.2                  "/usr/bin/selenoid -…"   3 months ago        Up 10 days                 0.0.0.0:4444->4444/tcp         selenoid

Найден исходный контейнер.

ИТОГО: в процессе "ночной сборки" селеноид создал контейнер виртуального для браузера, на котором прогонял все тесты. Контейнер браузера по какой-то причине (например, запись видео хода тестирования) занял значительную часть ОЗУ. После завершения тестирования память была освобождения, а контейнер удален.

Prometheus in Kubernetes

Install

https://github.com/prometheus-community/helm-charts

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install test prometheus-community/kube-prometheus-stack -n monitoring

Troubleshooting

https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/troubleshooting.md#troubleshooting-servicemonitor-changes

https://github.com/prometheus-operator/kube-prometheus/issues/483#issuecomment-610427646

Prometheus cant see ServiceMonitor

В разделе labels ресурса ServiceMonitor должна быть метка release=<prometheus-release-name> https://github.com/prometheus-operator/prometheus-operator/issues/2119#issuecomment-439620190