DoubleCloud 即将停止运营。立即迁移到 ClickHouse,享受限时免费迁移服务。立即联系我们。 ->->

博客 / 产品

使用 Prometheus 增强 ClickHouse Cloud 监控

author avatar
ClickHouse 团队
2024 年 7 月 16 日

立即开始使用 ClickHouse Cloud,并获得 300 美元的信用额度。要详细了解我们的按量付费折扣,请联系我们或访问我们的定价页面

今天,我们很高兴地宣布 ClickHouse Cloud 现在支持使用 Prometheus 进行增强监控。此功能现已全面发布,使云实例监控比以往更容易,它满足用户的实际需求,并允许他们使用他们喜欢的工具进行可观察性。

这一广受欢迎的功能需求满足了众多组织在采用云服务时遇到的一个关键需求,即能够独立于 ClickHouse 本身监控云服务的正常运行时间和性能。

希望尝试此功能的用户可以访问我们的文档。我们在文档中提供了简单的示例,供希望学习如何与 Datadog 和 Grafana 集成的用户使用。

如果您有兴趣详细了解使用 Prometheus API 相比现有方法的优势,以及在高效实现它时遇到的挑战,请继续阅读。

背景与挑战

能够集中监控他们依赖的云服务对于组织来说至关重要。历史上,希望监控 ClickHouse Cloud 的用户需要依赖查询系统表以获取所需的指标。这对许多基础架构工程师来说是一种阻碍,他们需要使用 SQL 从系统表中探索和提取指标。即使精通 SQL,在许多情况下,在 ClickHouse 中构建正确的查询并找到合适的系统表也可能非常耗时。这还需要考虑为代理配置适当的访问控制和权限。

虽然可以使用Datadog 等代理来监控 ClickHouse Cloud,但它们通常存在一些限制——特别是在 Datadog 的情况下,我们的云代理层进行的路由意味着相同实例在调用之间不会被查询,从而使后续指标难以解释。这可以通过一些仔细的配置和 clusterAllReplicas 函数的使用来克服,但这些集成也会遇到一个常见问题:它们通过 SELECT 查询持续轮询指标,这意味着实例永远不会处于空闲状态。

鉴于我们的用户依赖 ClickHouse Cloud 实例在不使用时处于空闲状态,从而最大限度地降低计算成本,因此这种行为(加上监控使用情况)非常不受欢迎,并对许多用户造成了阻碍。

最后,Prometheus 格式现在几乎成为这种形式数据的标准,并得到 Grafana 和 Datadog 等流行工具的开箱即用集成支持。

一个简单的端点,可以为实例提供 Prometheus 指标,而不会阻止未使用的实例进入空闲状态或唤醒它们,显然是首选解决方案。

简单优雅的设计

因此,任何端点都具有一些非常简单的要求

  • 以 Prometheus 格式提供指标——与现有常用的监控代理兼容。
  • 不唤醒空闲的实例——这些实例应该只返回一条简单消息,表示它们的状态。
  • 不阻止实例进入空闲状态——对该端点的请求不应在确定实例是否应该进入空闲状态时予以考虑。

虽然我们可能可以通过为每个 ClickHouse 实例配置来提供此功能,例如使用现有功能在 ClickHouse 中配置Prometheus 端点,但这对我们的用户来说并非完美解决方案。确保在实例处于空闲状态时不会转发这些请求在技术上实现起来并不优雅。此外,这意味着用户需要为每个实例创建一个具有适当角色和权限的用户,并将这些凭据分发到他们的代理。对于许多组织来说,这将带来安全风险,并且显得不必要地复杂。

此端点应该位于我们的现有云 API 中。此 API 已经允许用户创建和配置实例。此外,它提供了组织级别的访问控制,用户可以通过几个点击创建(并撤销!)API 密钥。通过在云 API 中公开此端点,我们可以最大限度地减少安全攻击面,并提供一个易于使用的端点,它不需要任何有关 ClickHouse 或 SQL 的知识!

因此,我们提供了一个简单的云 API 端点,用户可以在其中安全地为特定组织和实例请求 Prometheus 指标。

prometheus_01.png

API 密钥是组织级别的,可以定义为“开发人员”或“管理员”。开发人员访问权限足以用于 Prometheus 端点,确保被盗凭据不会允许创建或破坏服务。

实现

通过云 API 实现端点的决定意味着实现保持简单。云 API 已经了解每个实例的状态,使其能够不向空闲实例发出请求。假设实例正在运行,则使用具有有限权限范围的特定用户发出请求。数据平面在考虑是否使实例处于空闲状态时会忽略来自此用户的请求。

高效指标收集

这只是将用于系统表的适当查询公式化。鉴于我们期望用户感兴趣的指标分布在许多系统表中,因此生成的查询非常复杂,并且具有明显的开销。为了避免在每次向端点发出请求时发出此查询,我们利用了最近发布的ClickHouse 功能:可刷新物化视图

此视图定期(目前每分钟)执行查询,将结果发送到目标表 system.custom_metrics,并原子地更新其当前行。此目标表仅包含结果集,使用 Memory 引擎,并且可以由云 API 高效地查询。对于好奇的读者,我们在下面展示了该表和视图示例

CREATE TABLE system.custom_metrics
(
	`name` String,
	`value` Float64,
	`help` String,
	`labels` Map(String, String),
	`type` String
)
ENGINE = Memory
CREATE MATERIALIZED VIEW system.custom_metrics_refresher
REFRESH EVERY 1 MINUTE TO system.custom_metrics
(
	`name` String,
	`value` Nullable(Float64),
	`help` String,
	`labels` Map(String, String),
	`type` String
)
AS SELECT
	concat('ClickHouse_', event) AS name,
	toFloat64(value) AS value,
	description AS help,
	map('hostname', hostName(), 'table', 'system.events') AS labels,
	'counter' AS type
FROM system.events
UNION ALL
//other metrics

通过这种方法,物化视图的刷新率控制了执行查询的频率,确保它默认情况下最多每 60 秒运行一次。这也阻止了恶意或配置错误的代理(组)对服务施加查询压力并占用计算资源。

使用端点

要使用该端点,您首先需要在 ClickHouse Cloud 中创建一个 API 密钥。下面的过程展示了这一点

prometheus_02.gif

有了可用的端点,查询端点需要我们获取组织和实例 ID。

prometheus_03.gif

有了这些,您可以发出一个简单的 HTTP 请求

export KEY_SECRET=<key_secret>
export KEY_ID=<key_id>
export ORG_ID=<org id>
export INSTANCE_ID=<instance id>
curl --silent --user $KEY_ID:$KEY_SECRET https://api.control-plane.clickhouse-staging.com/v1/organizations/$ORG_ID/services/$INSTANCE_ID/prometheus 

…
# HELP ClickHouse_ServiceInfo Information about service, including cluster status and ClickHouse version
# TYPE ClickHouse_ServiceInfo untyped
ClickHouse_ServiceInfo{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",clickhouse_cluster_status="running",clickhouse_version="24.5",scrape="full"} 1

# HELP ClickHouseProfileEvents_Query Number of queries to be interpreted and potentially executed. Does not include queries that failed to parse or were rejected due to AST size limits, quota limits or limits on the number of simultaneously running queries. May include internal queries initiated by ClickHouse itself. Does not count subqueries.
# TYPE ClickHouseProfileEvents_Query counter
ClickHouseProfileEvents_Query{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 6

# HELP ClickHouseProfileEvents_QueriesWithSubqueries Count queries with all subqueries
# TYPE ClickHouseProfileEvents_QueriesWithSubqueries counter
ClickHouseProfileEvents_QueriesWithSubqueries{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 230

# HELP ClickHouseProfileEvents_SelectQueriesWithSubqueries Count SELECT queries with all subqueries
# TYPE ClickHouseProfileEvents_SelectQueriesWithSubqueries counter
ClickHouseProfileEvents_SelectQueriesWithSubqueries{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 224

# HELP ClickHouseProfileEvents_FileOpen Number of files opened.
# TYPE ClickHouseProfileEvents_FileOpen counter
ClickHouseProfileEvents_FileOpen{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 4157

# HELP ClickHouseProfileEvents_Seek Number of times the 'lseek' function was called.
# TYPE ClickHouseProfileEvents_Seek counter
ClickHouseProfileEvents_Seek{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 1840
…

ClickHouse Cloud Prometheus 端点暴露与 原生 ClickHouse Prometheus 端点 相同的指标集。以上只是一小部分收集的指标样本 - 目前我们暴露了超过 1000 个指标,这些指标被我们发现对监控 ClickHouse 很有用。您可以在 ClickHouse 文档中查看暴露的指标。

如果您需要监控 ClickHouse Cloud,但发现缺少了某个指标,请告诉我们!

如果实例处于空闲状态,则响应会显示相应信息。

# HELP ClickHouse_ServiceInfo Information about service, including cluster status and ClickHouse version
# TYPE ClickHouse_ServiceInfo untyped
ClickHouse_ServiceInfo{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",clickhouse_cluster_status="idle",clickhouse_version="24.5",scrape="full"}

Prometheus 示例

要安装 Prometheus,您可以参考官方 Prometheus 指南

以下是如何为 ClickHouse Cloud 配置 Prometheus 采集作业的简单示例。您需要从上述步骤中获取 <ORG_ID><INSTANCE_ID><KEY_ID><KEY_SECRET>。请注意 honor_labels 配置参数。它需要设置为 true,才能正确填充实例标签。

global:
  scrape_interval: 15s
scrape_configs:
  - job_name: "prometheus"
    static_configs:
    - targets: ["localhost:9090"]
  - job_name: "clickhouse"
    static_configs:
      - targets: ["api.clickhouse.cloud"]
    scheme: https
    metrics_path: "/v1/organizations/<ORG_ID>/services/<INSTANCE_ID>/prometheus"
    basic_auth:
      username: <KEY_ID>
      password: <KEY_SECRET>
    honor_labels: true

Datadog 示例

您可以使用 Datadog Agent 和 OpenMetrics 集成从 ClickHouse Cloud 端点收集指标。以下是此代理的简单示例配置。

init_config:

instances:
   - openmetrics_endpoint: 'https://api.control-plane.clickhouse.com/v1/organizations/97a33bdb-4db3-4067-b14f-ce40f621aae1/services/f7fefb6e-41a5-48fa-9f5f-deaaa442d5d8/prometheus'
     namespace: 'clickhouse'
     metrics:
         - '^ClickHouse_.*'
     username: username
     password: password

下面展示了使用此代理收集的指标监控 ClickHouse 的大型插入工作负载。

prometheus_04.png

您可以查阅 我们的文档,以获取关于与 Datadog 和 Grafana 集成的完整指南。

结论

Prometheus 集成的发布将允许用户使用他们最喜欢的可观测性工具监控 ClickHouse Cloud。指标集代表我们在监控 ClickHouse 中发现有用的指标。我们希望这个指标集会不断扩展,我们鼓励用户突出显示他们认为缺失的指标,或者如果他们有扩展和自定义这些指标的需求,可以提出其他集成方案!

立即开始使用 ClickHouse Cloud,并获得 300 美元的信用额度。在 30 天试用期结束后,您可以继续使用按需付费计划,或者 联系我们 了解更多关于我们的按量计费折扣信息。请访问我们的 定价页面 获取详情。

分享此文章

订阅我们的时事通讯

了解有关功能发布、产品路线图、支持和云服务的最新信息!
正在加载表单...
关注我们
Twitter imageSlack imageGitHub image
Telegram imageMeetup imageRss image
©2024ClickHouse, Inc. 总部位于加州湾区和荷兰阿姆斯特丹。