Syntax highlighting of 6c13162 ~( devops/prometheus)
<<TableOfContents()>> = Prometheus = [[https://prometheus.io|Prometheus|class=" moin-https"]] [[https://prometheus.io/docs/instrumenting/pushing/|Push Gateway|class=" moin-https"]] [[https://en.wikipedia.org/wiki/Time_series|Time series|class=" moin-https"]] | [[https://ru.wikipedia.org/wiki/Временной_ряд|Временной ряд|class=" moin-https"]] [[https://habr.com/ru/company/southbridge/blog/455290/|Полное руководство по Prometheus в 2019 году|class=" moin-https"]] [[http://onreader.mdl.ru/PrometheusUpAndRunning/content/index.html#Preface|Prometheus: запуск и исполнение|class=" moin-http"]] [[https://habr.com/ru/company/timeweb/blog/562378/|Знакомство с PromQL|class=" moin-https"]] [[https://github.com/statping/statping|statping|class=" moin-https"]] | 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 == . Вектор — это такой способ записывать, хранить и обрабатывать не одно число, а какое-то организованное множество чисел. Благодаря векторам мы можем представить это множество как единый объект и изучать его взаимодействие с другими объектами. '''Instant Vector''' (моментальный вектор) - представляет все метрики по последней метке времени. '''Range Vector''' (вектор с диапазоном времени) - если вам нужно посмотреть развитие метрики со временем, вы можете указать диапазон времени в запросе к Prometheus. В итоге получите вектор, объединяющий все значения, записанные за выбранный период. {{https://clck.ru/apQ2i|message3130}} == JVM == https://sematext.com/blog/jvm-metrics/ == PromQL == [[https://prometheus.io/docs/prometheus/latest/querying/functions/|FUNCTIONS|class=" moin-https"]] Статьи: https://timber.io/blog/promql-for-humans/ [[https://engineering.bitnami.com/articles/implementing-slos-using-prometheus.html|SLAs, SLOs, SLIs Word Soup|class=" moin-https"]] [[https://hackernoon.com/my-prometheus-is-overwhelmed-help-qi1937xj|My Prometheus is Overwhelmed! Help!|class=" moin-https"]] == Recipes == {{{ # количество запросов в минуту sum(increase(traefik_service_requests_total[1m])) # количество запросов в секунду (усреднено за минуту) sum(rate(traefik_service_requests_total[1m])) }}} = Alerting = [[http://bit.ly/2MClS1W|My Alert Philosophy by Rob Ewaschuk|class=" moin-http"]] == Alert Manager == [[https://github.com/prometheus/alertmanager|github|class=" moin-https"]] [[https://quay.io/repository/prometheus/alertmanager|in docker|class=" moin-https"]] === Running === {{{ docker run \ --name alertmanager \ --rm \ -p 9093:9093 \ quay.io/prometheus/alertmanager }}} == Prometheus Bot == Телеграм-бот для Alert Manager [[https://github.com/inCaller/prometheus_bot|github|class=" moin-https"]] Конфигурация {{{ # 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 }}} Нам может потребоваться прокси-сервер, который сможет обойти блокировку. Например [[https://github.com/zet4/alpine-tor|alpine-tor|class=" moin-https"]] {{{ # Лучше собирать образ ручками, т.к. на 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 = [[https://prometheus.io/docs/instrumenting/exporters/|EXPORTERS AND INTEGRATIONS|class=" moin-https"]] == Node Exporter == Коллектор метрик ОС [[https://github.com/prometheus/node_exporter|github|class=" moin-https"]] 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 [[https://github.com/prometheus/node_exporter/releases|cadv releases|class=" moin-https"]] {{{ 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://github.com/prometheus/client_ruby|github|class=" moin-https"]] [[https://rubygems.org/gems/prometheus-client|rubygems|class=" moin-https"]] 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 }}} Найден исходный контейнер. ИТОГО: в процессе "ночной сборки" селеноид создал контейнер виртуального для браузера, на котором прогонял все тесты. Контейнер браузера по какой-то причине (например, запись видео хода тестирования) занял значительную часть ОЗУ. После завершения тестирования память была освобождения, а контейнер удален. ------
