Prometheus
Полное руководство по Prometheus в 2019 году
Prometheus: запуск и исполнение
statping | https://github-wiki-see.page/m/statping/statping/wiki/Docker-Compose
Run
Quickstart
# --- localhost:9090 - web-interface
# localhost:9090/metrics - metrics
docker run --rm -p 9090:9090 prom/prometheus
Data Model
Типы метрик
Counter (счетчик)
Cчитает элементы за период времени. Счетчик может только увеличивать или обнулять число,
Guage (измеритель)
Измерители имеют дело со значениями, которые со временем могут уменьшаться. Их можно сравнить с термометрами — если посмотреть на термометр, увидим текущую температуру. Измеритель не показывает развитие метрики за период времени.
Histogram (гистограмма)
Гистограмма — это более сложный тип метрики. Она предоставляет дополнительную информацию. Например, сумму измерений и их количество.
Summary (сводка)
Сводки — это расширенные гистограммы. Они тоже показывают сумму и количество измерений, а еще квантили за скользящий период.
Квантили — это деление плотности вероятности на отрезки равной вероятности.
PromQL
Вектор — это такой способ записывать, хранить и обрабатывать не одно число, а какое-то организованное множество чисел. Благодаря векторам мы можем представить это множество как единый объект и изучать его взаимодействие с другими объектами.
Instant Vector (моментальный вектор) - представляет все метрики по последней метке времени.
Range Vector (вектор с диапазоном времени) - если вам нужно посмотреть развитие метрики со временем, вы можете указать диапазон времени в запросе к Prometheus. В итоге получите вектор, объединяющий все значения, записанные за выбранный период.
JVM
https://sematext.com/blog/jvm-metrics/
PromQL
Статьи: https://timber.io/blog/promql-for-humans/
My Prometheus is Overwhelmed! Help!
Recipes
# количество запросов в минуту
sum(increase(traefik_service_requests_total[1m]))
# количество запросов в секунду (усреднено за минуту)
sum(rate(traefik_service_requests_total[1m]))
Alerting
My Alert Philosophy by Rob Ewaschuk
Alert Manager
Running
docker run \
--name alertmanager \
--rm \
-p 9093:9093 \
quay.io/prometheus/alertmanager
Prometheus Bot
Телеграм-бот для Alert Manager
Конфигурация
# 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
Node Exporter
Коллектор метрик ОС
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
Ruby Client
https://povilasv.me/prometheus-tracking-request-duration/
Postgres
https://github.com/wrouesnel/postgres_exporter
https://habr.com/ru/post/345370/
Passenger
https://github.com/stuartnelson3/passenger_exporter
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
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
Найден исходный контейнер.
ИТОГО: в процессе "ночной сборки" селеноид создал контейнер виртуального для браузера, на котором прогонял все тесты. Контейнер браузера по какой-то причине (например, запись видео хода тестирования) занял значительную часть ОЗУ. После завершения тестирования память была освобождения, а контейнер удален.