Админим с Буквой
5.35K subscribers
302 photos
8 videos
59 files
1.15K links
Канал о системном администрировании, DevOps и немного Инфобеза.

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
Grafana basic auth

В ролях:
- grafana stable chart
- nginx ingress controller
- terraform

Задача:
Сделать basic auth для графаны на уровне nginx, передавая username в grafana, так чтобы переданное имя использовалось как пользователь в grafana и запихнуть всё это в терраформ.

Решение: (выписка из values.yaml)

ingress:
enabled: true
annotations:
'kubernetes.io/ingress.class': ${var.controller_ingress_class}
'nginx.ingress.kubernetes.io/auth-type': ${var.auth-type}
'nginx.ingress.kubernetes.io/auth-secret': ${var.basic_auth_secret_name}
'nginx.ingress.kubernetes.io/auth-realm': ${var.auth-realm}
'nginx.ingress.kubernetes.io/configuration-snippet': |
proxy_set_header X-Remote-User $remote_user;
....
grafana.ini:
users:
allow_sign_up: false
allow_org_create: false
auth:
disable_login_form: true
auth.proxy:
enabled: true
header_name: X-Remote-User
header_property: username
auto_sign_up: true

где переменные в main.tf принимают такие значения:

auth-type         = "basic"
auth-secret = "nginx-ingress-auth"
auth-realm = "Authentication Required - OK"
basic_auth_secret = "${file("basic_auth.txt")}"


Содержимое файла basic_auth.txt заполняется так:

htpasswd -nb username long_long_password > basic_auth.txt


#grafana #kubernetes #nginx #ingress #terraform
Prometheus + kubernetes

Полезный набор дашбордов в графану по мониторингу ресурсов в кубе
https://github.com/camilb/prometheus-kubernetes

#grafana #prometheus #kubernetes #monitoring
Очень полезный пост про то как мониторить аномалии

https://about.gitlab.com/blog/2019/07/23/anomaly-detection-using-prometheus/

#grafana #prometheus
Promql, как возвращать 0, если нет данных

Допустим вы складываете значения разных метрик, и в какой-то момент некоторая метрика не имеет данных. Тогда выражение no data + int = no data и испортит вам всю картину. чтобы такого избежать можно в выражению добавлять такую конструкцию: OR on() vector(0). Тогда no data -> 0 и сумма не портит ваши графички в графане

источник: https://medium.com/@Nklya/promql-how-to-return-0-instead-of-no-data-9e49f7ccb80d

#grafana #prometheus
Часовые столбики

Появилась задача нарисовать график, который будет показывать по-часовую агрегацию количества событий и сравнивать результат с теми же часами до других дней. В моём примере это -1, -7, -28 т.е. вчера, неделю назад и месяц назад.

Пример событий, для одного из графиков - успешные создания документов. т.е. нужно построить график столбиков (точек), просуммировав события за час и то же самое за вчера и позавчера, а потом наложить результаты друг на друга:

часы - события
0 - 10
1 - 24
2 - 13
...

Данные в нашем случае хранятся в postgresql, имеют колонку с необходимым статусом и колонку с таймштампом, когда событие случилось. Оказалось, что не прибегая ни к какому прометеусу, sql-exporter'у можно всё это нарисовать.

Для этого подключаем в качестве datasource вашу постгрю, указав специально созданного пользователя, которому нужно выдать select на необходимую таблицу.

Создаём как обычно дашборд, новый график и выбираем наш датасорс. При написании запроса я переключился в "text edit mode" потому что так сильно удобнее - писать запрос по сути как в саму постгрю. и далее можно создать нужные запросы.

первый запрос вот такой:

SELECT
$__timeGroupAlias(created_at,1h,0),
count(*) AS "0 day"
FROM smtdp_applicant
WHERE
created_at BETWEEN $__timeFrom()::timestamptz and $__timeTo()::timestamptz
and xxxx (наши условия фильтрования событий)
GROUP BY 1
ORDER BY 1

где

$__timeGroupAlias - специальная переменная графаны, куда мы передаём имя колонки с таймштампами (created_at) и параметр как мы хотим объединять (1h) - чтобы указать графане как мы хотим сгруппировать получившиеся после запроса value.

count(*) AS "0 day" - высчитываем количество событий и именуем этот результат на графике как "0 day"

$__timeFrom() и $__timeTo() - специальные переменные графаны в которые подставится таймштамп от масштаба графика. т.е. last 24h разложится на from и to, куда подставится таймштамп времени сколько сейчас и было сутки назад и постгрю полетит запрос xxxx::timestamptz.

А вот 2 и последующие запросы будут чуть интереснее:

SELECT
$__timeGroupAlias(created_at + interval '24 hours',1h,0),
count(*) AS "-1 day"
FROM smtdp_applicant
WHERE
created_at BETWEEN $__timeFrom()::timestamptz - INTERVAL '1 DAY' and $__timeTo()::timestamptz - INTERVAL '1 DAY'
and xxx
GROUP BY 1
ORDER BY 1

где
created_at BETWEEN $__timeFrom()::timestamptz - INTERVAL '1 DAY' and $__timeTo()::timestamptz - INTERVAL '1 DAY' - первая мякотка - мы сделаем запрос от нашего окна наблюдения на сутки влево. timestamptz нужно для того чтобы из этого таймштампа вычесть на уровне постгри сутки, 7 и 28. преобразование типов и всё такое.
$__timeGroupAlias(created_at + interval '24 hours',1h,0), - вторая мякотка. позволяет шифтануть полученный результат на указанный интервал. в нашем случае - на сутки вправо.

Таким образом мы получаем 2 запроса которые получают события за окно наблюдения "сутки" и "прошедшие сутки" и накладывают результат один на другой. повторяем то же самое для -7 и -28 и получаем нужный результат. Все картинки приложу отдельно.

#grafana #postgresql