Всем привет! Меня зовут Александр, я руковожу backend-разработкой в КТS. Сегодня расскажу об экспортере, который мы написали для selectel.

Что будет в статье:

Интро: зачем мы написали собственный экспортер

Мы на многих проектах пользуемся услугами selectel. Например, managed kubernetes  и базами данных. За этими компонентами и услугами нужно следить, и хорошо бы делать это из одной точки. Этой точкой у нас является prometheus, alertmanager и grafana.

При этом мы часто запускаем новые проекты, за которыми тоже нужно следить, но тратить минимум времени на настройку метрик и мониторинга. При запуске нового проекта он автоматически попадает в grafana:

Кроме метрик самого проекта, рядом удобно иметь информацию о кластере и самой базе проекта. В selectel есть внутренние графики и мониторинг, но использовать их затруднительно по нескольким причинам:

  1. доступ к админке selectel есть только у суперадминов компании. Дать доступ разрабам/админам нельзя

  2. метрики находятся в разных местах

  3. не хватает возможности настроек правил для алертинга 

  4. уведомления от мониторинга идут через разные каналы

На тех проектах, в которых применяется 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. Обратите внимание:

  1. все метрики selectel exporter повторяют доступные метрики в интерфейсе selectel, ни больше ни меньше  

  2. в selectel разные балансы: primary, storage, vmware, vpc. Про устройство балансов подробнее можно почитать тут: https://kb.selectel.ru/docs/control-panel-actions/billing/balance/

  3. в метриках 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!

Комментарии (2)


  1. Andypuh
    03.09.2021 00:58
    +2

    А мы тем временем выкатываем эту функциональность на следующей неделе для всех) да, пока тоже с метриками из панели, но далее будем давать все больше и больше метрик)


    1. alexopryshko Автор
      03.09.2021 10:17
      +1

      Спасибо! Как выразился мой коллега: «perfect timing». Будем ждать релиза, пока пользуемся тем, что есть)