TimeSeries 表实现 Prometheus HTTP API。一个处理程序可处理 远程写入、远程读取、即时 PromQL 查询和范围 PromQL 查询。
若要暴露 ClickHouse 自身的指标以供 Prometheus 服务器 抓取,请参阅 Prometheus 指标端点。
前置条件
ClickHouse Cloud 与自管理 ClickHouse 的设置步骤有所不同。请参照与你的部署方式相对应的章节进行操作。ClickHouse Cloud
ClickHouse Cloud 中的 PromQL 支持目前处于私有预览阶段。参与私有预览的服务已配置好
enable_time_series_table 设置以及 Prometheus API 端点。其他 ClickHouse Cloud 服务不具备该配置,你也无法自行在这类服务上启用该功能。后续章节中的 SET enable_time_series_table 语句和 http_handlers 配置仅适用于自管理部署。自管理:启用 TimeSeries 设置
为创建和访问该表的用户启用enable_time_series_table 设置:
enable_time_series_table。
自管理:配置 Prometheus API 端点
在主 ClickHouse HTTP 端口上配置一个按前缀路由的处理程序:<defaults/> 会保留 /ping 等端点和 SQL 请求的内置处理程序。上述前缀通过一个处理程序公开这些端点:
该示例未在处理程序中指定
database 和 table。每个请求都必须提供 table 查询参数 (/format_query 除外,它只解析给定的 PromQL 表达式,不需要表) 。还可以提供 database、使用如 prometheus.metrics 这样的限定表名,或者省略数据库以使用 default。这样,一个处理程序即可为多个 TimeSeries 表提供服务。
若要让所有请求使用同一个固定表,请在处理程序中进行配置:
创建 TimeSeries 表
创建数据库和TimeSeries 表:
通过 远程写入 摄取指标
ClickHouse 支持 Prometheus 远程写入 协议。配置 Prometheus 以向该处理程序写入数据:prometheus.metrics 表。
要将多个并发远程写入请求中的数据合并为更少的 parts,请在 URL 中添加 async_insert 设置 (或在 user profile 中启用该设置) ,以启用异步插入:
TimeSeries 表的所有内部表后,才会确认异步远程写入请求,不受 wait_for_async_insert 设置影响:远程写入协议将已确认的写入视为持久化写入。如果刷新失败,请求会返回错误,Prometheus 将重试。
使用 PromQL 查询
使用即时查询端点,在某一时间点评估 PromQL 表达式:--get,curl 会通过 POST 以 application/x-www-form-urlencoded 发送这些参数:
sum by (job) (http_requests_total{code="200"}) / 2。该端点不会对表达式求值,因此不需要 database 和 table 参数。
有关 HTTP API、promql 方言及表函数支持的函数和聚合运算符列表,请参阅支持的 PromQL 功能。
Grafana
配置 Prometheus 数据源时,基础 URL 应以/api/v1 之前的部分结尾:
/api/v1/query 或 /api/v1/query_range 追加到此基础 URL,并在每个请求中添加 customQueryParameters。
在 httpMethod: POST 下,Grafana 会将查询参数放在请求正文中发送。ClickHouse 会同时读取请求正文和 URL 查询字符串,因此 customQueryParameters 仍然生效。对于较长的 PromQL 表达式,请使用 POST,因为 URL 存在长度限制。
目前仅实现了查询端点
/api/v1/query、/api/v1/query_range 和 /api/v1/format_query 以及元数据端点 /api/v1/series、/api/v1/labels、/api/v1/label/<name>/values 和 /api/v1/metadata。/api/v1/series 至少需要一个 match[] 序列选择器,支持可选的 start、end 和 limit 参数,并返回每个选择器匹配的序列的并集。/api/v1/labels 接受相同的参数,其中 match[] 为可选项,并返回匹配的序列的已排序标记名称 (未提供选择器时则返回所有序列的标记名称) 。/api/v1/label/<name>/values 接受与 /api/v1/labels 相同的参数,并返回某个标记的已排序值,其中 <name> 可选地使用 Prometheus 的 U__... 转义方式来表示包含 [a-zA-Z0-9_] 之外字符的标记名称。这些端点涵盖了 Grafana Prometheus 数据源用于浏览标记、模板变量和查询构建器自动补全的功能。SQL 入口
ClickHouse 的 HTTP API、promql 方言以及 prometheusQuery 和 prometheusQueryRange 表函数均使用同一个 PromQL 转换器。
使用 clickhouse-client 直接执行 PromQL:
查询指标元数据
/prometheus/api/v1/metadata 端点返回存储在 TimeSeries 表的 Metrics 目标表中的指标元数据,包括每个指标族的类型、帮助文本和单位。它支持 URL 查询字符串中的以下 Prometheus 参数:
默认的
Metrics 目标表是按指标族名称排序的 ReplacingMergeTree:它会保留每个指标族最近写入的元数据条目。只有在目标表仍保留这些条目时,才会返回每个指标族的多个条目——例如在其 parts 合并之前,或该表使用会保留这些条目的引擎时。
通过远程读取读取指标
ClickHouse 在/prometheus/api/v1/read 提供对 Prometheus 远程读取协议的支持。
配置 Prometheus 服务器从同一个 TimeSeries 表中读取数据: