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