Потребовалось тут положить в Prometheus информацию о наличии таблиц на репликах, плюс о движке этих таблиц, чтобы иметь возможность отлавливать ситуации, когда создается таблица без репликации, либо она создается не на всех репликах.
Стандартными метриками эта информация не собирается. Но для решения этой проблемы в ClickHouse есть механизм
predefined_query_handler
, который позволяет отдавать по заданному URL результаты запроса в необходимом формате.
Как это выглядит в конфигах. В первую очередь, нам надо определиться с запросом. Для нашего кейса он будет выглядеть просто:
SELECT database,name,engine FROM system.tables
Теперь этот запрос надо обернуть в корректное форматирование. Для этого используются параметры запроса FORMAT Template
и SETTINGS format_template_*
(format_template_row
, format_template_resultset
, format_template_rows_between_delimiter
). Эти параметры описаны в документации.
Нам надо задать format_template_row
для форматирования каждой строки результата запроса под требования Prometheus. Для этого создаем файл /var/lib/clickhouse/format_schemas/prometheus_table_engine.format
:
# TYPE clickhouse_db_engines gauge
# HELP show table engines
clickhouse_db_engines{db_name="${database:Raw}", table="${name:Raw}",engine="${engine:Raw}"} 1
Также нам надо переопределить дефолтное значение format_template_rows_between_delimiter
на пустую строку (по дефолту стоит \n
и это будет приводить к пустым строкам в списке метрик, что для Prometheus не подойдет).
Теперь нам надо прикрутить этот запрос к какому-нибудь URL в ClickHouse. Это делается через конфиг, через секцию <http_handlers>
:
<http_handlers>
<rule>
<url>/table_engines</url>
<methods>GET</methods>
<handler>
<type>predefined_query_handler</type>
<query>SELECT database,name,engine FROM system.tables FORMAT Template SETTINGS format_template_row = 'prometheus_table_engine.format', format_template_rows_between_delimiter = '' </query>
</handler>
</rule>
<defaults/>
</http_handlers>
Важно: внутри секции обязательно должно быть поле <defaults/>
, иначе отломаются все стандартные эндпойнты.
Итого, при запросе на /table_engines
нам вывалится набор метрик по таблицам и их движкам:
curl http://localhost:8123/table_engines
# TYPE clickhouse_db_engines gauge
# HELP show table engines
clickhouse_db_engines{db_name="system", table="replication_queue",engine="SystemReplicationQueue"} 1
# TYPE clickhouse_db_engines gauge
# HELP show table engines
clickhouse_db_engines{db_name="system", table="role_grants",engine="SystemRoleGrants"} 1
# TYPE clickhouse_db_engines gauge
# HELP show table engines
clickhouse_db_engines{db_name="system", table="roles",engine="SystemRoles"} 1
...