Syntax highlighting of 6c13162 ~( devops/prometheus)

[TOC]

# Prometheus

[Prometheus](https://prometheus.io)

[Push Gateway](https://prometheus.io/docs/instrumenting/pushing/)

[Time series](https://en.wikipedia.org/wiki/Time_series) | [Временной ряд](https://ru.wikipedia.org/wiki/%D0%92%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D1%80%D1%8F%D0%B4)

[Полное руководство по Prometheus в 2019 году](https://habr.com/ru/company/southbridge/blog/455290/)

[Prometheus: запуск и исполнение](http://onreader.mdl.ru/PrometheusUpAndRunning/content/index.html#Preface)

[Знакомство с PromQL](https://habr.com/ru/company/timeweb/blog/562378/)

[statping](https://github.com/statping/statping) | https://github-wiki-see.page/m/statping/statping/wiki/Docker-Compose

## Run

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


## Data Model

![Prometheus Data Model](https://clck.ru/apPPF)


## Типы метрик

### Counter (счетчик)

Cчитает элементы за период времени. **Счетчик может только увеличивать или обнулять число**,

### Guage (измеритель)

Измерители имеют дело со значениями, которые **со временем могут уменьшаться**. Их можно сравнить с термометрами — если посмотреть на термометр, увидим текущую температуру. Измеритель не показывает развитие метрики за период времени.

### Histogram (гистограмма)

Гистограмма — это более сложный тип метрики. Она предоставляет дополнительную информацию. Например, сумму измерений и их количество.

### Summary (сводка)

Сводки —  **это расширенные гистограммы**. Они тоже показывают сумму и количество измерений, а еще  **квантили за скользящий период**.

  Квантили — это деление плотности вероятности на отрезки равной вероятности.

## PromQL

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

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

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

![message3130](https://clck.ru/apQ2i)


## JVM

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

## PromQL

[FUNCTIONS](https://prometheus.io/docs/prometheus/latest/querying/functions/)

Статьи:
https://timber.io/blog/promql-for-humans/

[SLAs, SLOs, SLIs Word Soup](https://engineering.bitnami.com/articles/implementing-slos-using-prometheus.html)

[My Prometheus is Overwhelmed! Help!](https://hackernoon.com/my-prometheus-is-overwhelmed-help-qi1937xj)

## Recipes

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

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



# Alerting

[My Alert Philosophy by Rob Ewaschuk](http://bit.ly/2MClS1W)

## Alert Manager

[github](https://github.com/prometheus/alertmanager)

[in docker](https://quay.io/repository/prometheus/alertmanager)


### Running

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

## Prometheus Bot

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

[github](https://github.com/inCaller/prometheus_bot)


Конфигурация
```yml
# config.yaml
telegram_token: "658598157:AAFEkOK4cB9cRN1yuF6ee0UYlU7Lb2XRZHA"
time_zone: "Europe/Moscow"
split_token: "|"    
```

Собираем образ
```bash
wget https://raw.githubusercontent.com/inCaller/prometheus_bot/master/Dockerfile
docker build -t prombot .
```

Запускаем контейнер
```bash
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 серверов, при попытке запуска бота выдается сообщение:
```bash
Post https://api.telegram.org/...: remote error: tls: access denied
```

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

Например [alpine-tor](https://github.com/zet4/alpine-tor)

```bash
# Лучше собирать образ ручками, т.к. на 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](https://prometheus.io/docs/instrumenting/exporters/)

## Node Exporter

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

[github](https://github.com/prometheus/node_exporter)

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

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

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

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

```bash
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

```ini
# /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

```bash
# перезагружаем системный демон
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

```yml
# /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](https://github.com/prometheus/node_exporter/releases)

```bash
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

```ini
# /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

[github](https://github.com/prometheus/client_ruby) 

[rubygems](https://rubygems.org/gems/prometheus-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

```bash
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'

```bash
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` - это ид-р другого контейнера, который создал искомый контейнер.

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

```bash
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
```

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

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

---