如何为CockroachDB指标自动生成警报和聚合规则

8,628 阅读6分钟

像所有的软件系统一样,指标对于了解一个系统的内部运作和掌握该系统的运作情况至关重要。任何监控和调试框架如果没有度量衡都是不完整的。

然而,要有效地使用指标,重要的是要了解两件事:一个特定的指标定义了系统的哪个方面,以及应该如何使用它来解释系统的健康状况。此外,为了建立有效的监控仪表盘和警报,还有必要确定多个指标之间的相关性。

在Cockroach公司,我们经常面临的问题是,由于缺乏关于如何汇总和使用指标作为系统健康和性能指标的文件和指导,导致指标的使用不足/滥用。我们的目标是解决这些问题!

这篇博文讨论了我们的解决方案:为CockroachDB的指标建立一个自动警报和聚合规则生成框架。

当前状态

CockroachDB输出多个指标,为系统的健康提供指示。这些指标可以通过内置的DB Console用户界面查看。这些指标也可以通过Prometheus的_status/varsHTTP端点进行编程整合和查看。所有这些指标都有一个帮助字段的注释,它提供了关于每个指标的确切测量信息。

然而,我们一直缺乏一个框架来提供关于这些指标应该如何被消费并用于监控和调试的额外信息。也没有办法提供关于单个指标如何相互关联的帮助,也没有办法将它们聚合在一起以提供DB系统健康状况的更全面的视图。

让我们看一个例子。考虑一下非常简单的指标 "容量"。帮助字段表明这个指标输出的是 "总存储容量"。虽然这些信息有助于了解这个指标的基本输出,但是关于如何解释这个指标以获得CockroachDB的存储信息的信息非常少。比如说。

  • 我如何使用这个指标来获得节点的总容量?
  • 我如何使用它来获得集群的总容量?
  • 我如何使用它来确定当前的可用容量?

这些问题并不容易回答,除非你知道这个度量是如何实现的。

当然,你可以把这些指标集成到Prometheus中,挖掘各种标签,并尝试逆向工程如何使用这个指标来获得这些答案,但这给我们的最终用户使用指标进行诊断和调试的能力带来了不必要的摩擦。而这一切都是为了一个相当基本的指标!当然,对于更复杂的指标来说,回答围绕指标使用的细微问题变得更加复杂。

理解一个指标的各种维度对于正确使用它是至关重要的。虽然从事CockroachDB内部工作的工程师完全了解如何实现和使用指标,但我们需要一个框架,使他们能够以网站可靠性工程师(SRE)、技术支持工程师(TSE)甚至是我们的客户都可以使用的方式来交流这些知识。即使是我们的数据库工程师也可能没有关于数据库输出的所有指标以及如何使用它们的全面知识。

为实施度量衡的工程师提供一个机制来分享更多关于如何使用度量衡的信息,对度量衡的所有消费者来说是非常有价值的。自动警报和聚合规则生成框架试图弥补的正是这种知识差距。

框架设计

这里的主要设计考虑是保持新的框架易于理解和使用--对于我们的终端用户来说,他们将消费这些关于度量使用的新信息,以及数据库工程师自己实施度量。

新的框架将使工程师能够使用PromQL语法为度量标准指定警报和聚合规则。我们将在内部使用一个注册表来跟踪所有定义的规则。这些规则通过HTTP端点以YAML格式导出,并与Prometheus警报聚合规则语法一致。通过使用PromQL语法来定义警报和聚合表达式,我们使这些规则很容易直接用于监测Prometheus/Grafana内的数据库健康状况。

虽然HTTP端点不能以编程方式使用,但YAML格式允许轻松导入规则,以便在警报/监控配置中使用。

接口和API

本节将涵盖。

  1. 用于指定警报和聚合规则的接口和结构设计。
  2. 以YAML格式公开这些警报和聚合规则的API。

接口。

 CockroachDB Metrics interface and API

AlertingRuleAggregationRule将分别用于构建警报和聚合。每个规则将包含一个expr字符串,它将捕获规则中涉及的指标以及它们应该如何被聚合。expr将使用PromQL语法,并将是一个完整的、有效的Prometheus表达式。表达式可以作为终端用户的指导方针,同时构建实际的警报和记录规则yaml文件,以监控集群。

AlertingRule包含一个字段,叫做recommendedHoldDuration。这可以用来在构建规则时为警报指定一个推荐的保持时间。这可以作为终端用户的建议,在指定警报的同时设置保持时间。

警报和聚集规则定义的一些例子。

 CockroachDB Metrics Alerting Rule

一旦定义,这些警报和聚集规则将使用RuleRegistry进行跟踪。RuleRegistry旨在成为一个单子,它将在CockroachDB服务器启动时被初始化一次,并用于跟踪所有定义的规则。规则可以通过AddRule/AddRulesAPI添加到RuleRegistry中。

 CockroachDB Metrics RuleRegistry

最后,为了公开这些信息,我们将添加一个自省API,通过HTTP端点(api/v2/metrics/rules)发布所有已声明的指标规则。这些规则可以被终端用户如SRE、TSE、DB运营商和客户用作指南,以定义他们的监控和警报配置。

为了以YAML格式管理规则,PrometheusRuleExporter将封装所有需要的逻辑,从RuleRegistry中抓取所有声明的规则并以YAML格式导出。

PrometheusRuleExporter结构将包含以下细节。

 CockroachDB Metrics PrometheusRuleExporter

此外,它将暴露两个方法ScrapeRegistryPrintAsYAML,这两个方法将从RuleRegistry中抓取所有已声明的规则,并分别将它们编入YAML。

HTTP端点将在api/v2/rules/的位置上公开这个经过处理的YAML。通过API暴露的数据的示例视图。

code showing the exposed rules API

未来的工作

我们计划扩展这个框架,包括支持为CockroachDB的指标生成自动化的Grafana仪表盘。