Всем привет! Меня зовут Александр, я руковожу backend-разработкой в КТS. Сегодня расскажу об экспортере, который мы написали для selectel.
Что будет в статье:
Интро: зачем мы написали собственный экспортер
Мы на многих проектах пользуемся услугами selectel. Например, managed kubernetes и базами данных. За этими компонентами и услугами нужно следить, и хорошо бы делать это из одной точки. Этой точкой у нас является prometheus, alertmanager и grafana.
При этом мы часто запускаем новые проекты, за которыми тоже нужно следить, но тратить минимум времени на настройку метрик и мониторинга. При запуске нового проекта он автоматически попадает в grafana:
Кроме метрик самого проекта, рядом удобно иметь информацию о кластере и самой базе проекта. В selectel есть внутренние графики и мониторинг, но использовать их затруднительно по нескольким причинам:
доступ к админке selectel есть только у суперадминов компании. Дать доступ разрабам/админам нельзя
метрики находятся в разных местах
не хватает возможности настроек правил для алертинга
уведомления от мониторинга идут через разные каналы
На тех проектах, в которых применяется self-hosted кластер patroni, для решения задачи можно поставить node_exporter и postgres_exporter. Но на managed-кластерах selectel так сделать нельзя. Доступа к внутренним метрикам selectel нет, пользователя БД с root правами тоже создать нельзя.
Этот функционал планируется к реализации, но только к концу 2021 года:
Ждать не хотелось, а в Гугле нашлись только экспортеры баланса. Поэтому мы решили написать собственный — https://github.com/ktsstudio/selectel-exporter.
Что умеет selectel exporter и как его установить
selectel exporter умеет получать:
метрики узлов кластера: cpu, память и диск
метрики баз данных: postgres и mysql
метрики баланса
Подробнее можно посмотреть в readme. Для установки можно использовать helm chart. Если вы используете prometheus operator, достаточно указать serviceMonitor.enabled=true и serviceMonitor.additionalLabels. По ним prometheus оператор получает ServiceMonitor, и метрики начнут собираться автоматически.
Как он работает
Exporter принимает 2 параметра на вход:
SELECTEL_REGION — регион, в котором расположены ресурсы. Допустимые значения: {"ru-1", "ru-2", "ru-7", "ru-3", "ru-9", "ru-8"}. Экспортер получает ресурсы только из указанного региона. Если ресурсы нужны из 2 регионов, следует запустить 2 инстанса экспортера. На баланс это не распространяется, так как к региону он не привязан.
SELECTEL_TOKEN — токен из кабинета selectel https://my.selectel.ru/profile/apikeys
После старта экспортер пытается получить openstack-токен. Он используется для получения метрик БД и выдается на selectel-проект.
Поэтому сначала exporter получает все проекты аккаунта, выбирает проект и выписывает openstack-токен для этого проекта. Если проектов больше одного, выбирает первый. Если в будущем понадобится сделать выбор проекта, мы добавим возможность указывать id необходимого проекта.
Openstack-токен протухает через 24 часа после создания, поэтому exporter обновляет его каждые 20 часов. Подробнее про авторизацию в selectel можно почитать тут:
https://developers.selectel.ru/docs/control-panel/authorization/
После успешного получения openstack-токена запускается 3 горутины, которые раз в минуту получают:
баланс — методом /api/v3/billing/balance
метрики datastore — методом /v1/datastores/<datastore_id>/metrics
метрики database — методом /v1/datastores/<datastore_id>/database-metrics
Описание используемых методов selectel можно посмотреть здесь:
https://developers.selectel.ru/docs/selectel-cloud-platform/dbaas_api/
Доступные метрики
Все доступные метрики можно посмотреть в readme exporter. Обратите внимание:
все метрики selectel exporter повторяют доступные метрики в интерфейсе selectel, ни больше ни меньше
в selectel разные балансы: primary, storage, vmware, vpc. Про устройство балансов подробнее можно почитать тут: https://kb.selectel.ru/docs/control-panel-actions/billing/balance/
в метриках selectel_database_* есть label “database”, но доступен он только для базы данных postgres, а для mysql там будет пустая строка
В результате получается такой dashboard:
Что в планах
selectel-exporter написан на Go и распространяется под Open Source-лицензией Apache 2.0. Будем благодарны любой помощи по развитию проекта на GitHub: и звездочкам, и issues, и pull requests. В ближайшее время добавим дашборды для grafana и готовые PrometheusRule для алертинга.
Мы планируем и дальше рассказывать о решениях, которые мы написали для своих проектов. Например:
модуль для managed-кластера kubernetes в selectel, который позволяет получить ip клиента.
оператор копирования secret для динамической инфраструктуры: когда делаешь раскладку по веткам в проекте, на каждую выписывается let's encrypt сертификат. Можно упереться в rate limit обращений к let's encrypt. В этом случае нужно выпускать wildcard-сертификат и копировать его между namespace проекта... Но это темы для отдельных историй.
Stay tuned!
Andypuh
А мы тем временем выкатываем эту функциональность на следующей неделе для всех) да, пока тоже с метриками из панели, но далее будем давать все больше и больше метрик)
alexopryshko Автор
Спасибо! Как выразился мой коллега: «perfect timing». Будем ждать релиза, пока пользуемся тем, что есть)