博客/工程

Metrictank元标签

2019年4月9日 6分钟

即将到来:Metrictank的无缝且具有成本效益的Meta标签

这是我们正在做的主要项目之一Metrictank-我们的大规模石墨解决方案-是元标签功能,我们去年开始,并计划在几个月内发布。

很多人都没有意识到这一点,但是石墨有标签支持一年多了。我们使用Metrictank的任务是提供一个更可扩展的石墨版本,所以引入元标签是合乎逻辑的下一步。

元标签功能是由彭博社赞助的是Metrictank最大的用户之一每个Metrictank实例中有成千上万的主机被监控,索引中有400万个系列。

这个问题

彭博团队希望能够在他们的指标上添加很多标签——比如数据中心、主机操作系统或单元——这样他们就可以通过这些标签进行查询。

正如Bloomberg遥测技术主管Stig Sorensen所说:“目标是在Grafana/Metrictank中提供更好的过滤和分组功能,通过能够使用额外的标签/元数据来增强核心标签,这些标签/元数据应该像Grafana中的任何一类标签一样工作。”

但是有很多很多指标都共享相同的标签值。如果每台主机有1000个指标,一个数据中心有1000台主机,这意味着您将有100万个指标都来自同一个数据中心。

如果您想将这些标签添加到所有单独的指标中——例如,将一个特定的数据中心值添加到这数百万个指标中——这将是很大的开销。

这些标签是如此的冗余,如果我们必须为所有单独的指标存储它们,就会增加索引的大小。我们会使用太多的RAM和磁盘空间。最终,它会让事情变慢。

解决方案

我们想到了利用冗余并通过某种更智能的关联单独存储这些标记的想法:基本上所有这些主机都自动假装它们有这个额外的标记,例如,它们在哪个数据中心。这样,您就可以向数千或数百万个指标添加一大堆不同的标签,而不必单独存储它们。

它还应该是一种无缝的体验:作为最终用户,当您按操作系统、单元或数据中心查询所有指标时,您甚至不必意识到所有这些后台杂务正在进行。当您的指标返回给您时,您将看到与它相关的所有标记,无论这些标记是与实际指标本身存储在一起还是作为元标记存储。用户体验是一样的。

外在与内在

考虑元标签的另一种方式是使用在指标2.0.度量单位有一些固有的标签:如果你改变了它们,你就引用了一个不同的度量。但是其他标签不是指标标识的一部分。如果你改变它们,你仍然可以看到相同的度量。它们被称为外在的。

Metrictank的常规标签是内在的,而元标签是外在的,因为它们与度量的标识不是紧密耦合的。您可以更改它们,但您仍然使用相同的度量标准。

相比普罗米修斯系列加入

元标签的功能可以与Prometheus中通过串联连接实现的功能相媲美。要在Prometheus中添加标签,必须有单独的系列来声明这些额外的标签。例如,您将有一个具有主机值的系列,然后它将有一个附加的系列,标记为特定主机的特定数据中心和操作系统。

在查询数据时,您必须这样写:“我想在只有主机标记的指标和具有相同主机标记的其他元数据系列之间进行连接”,然后通过进行系列连接引入这些额外的标记。

但是我们的特性提供了一个更透明的解决方案,允许使用类似于本机标签的东西进行过滤、分组、自动完成等。与《普罗米修斯》系列不同的是,用户不需要做任何明确的事情。此外,在《普罗米修斯》中,你不能回填外部标签;使用Metrictank元标签,您将能够添加新的标签到旧系列。

实现

我们当前的标签索引是相当标准的,使用张贴列表将标签键/值链接到度量元数据。查询计算是通过按成本(基数)对各个查询组件进行排序,并将它们作为具有某种并行程度的管道执行。

在元标记项目中,我们添加了发帖列表,将元标记键/值链接到“元记录”,其中一个元记录定义了应该为哪个查询表达式添加哪些标记(元标记)。这样,命中元标记的查询模式可以使用相同的查询执行系统,但使用额外的步骤。(在元标记发布列表上执行查询,然后在常规发布列表上执行其相应的标记查询——以及常规标记上的其余查询组件——以解析度量元数据。)

至于以无缝的方式返回数据,我们有一个“丰富”步骤,其中我们将元标记作为常规标记添加到返回的系列中,使其对用户透明。这一部分很可能与缓存一起提供,以加速频繁查询系列的丰富。

所有元标记操作都是基于API的,因此您将能够通过对任何集群节点的API调用来添加、删除、管理和更新所有关联(这反过来又传播到其他节点),并且规则也将被安全持久化。

设计文档涵盖了各种有趣的边缘情况和设计约束。我觉得有趣的一个方面是如何在Metrictank集群中对元标记规则进行更新。我们权衡了各种一致性权衡,但最终决定,至少对于v1,一个轻松的、最终一致的模型就足够了。这里有一个例子:如果您有一千台主机,每台主机有一千个系列,并且您添加了一条规则,说“对于所有这一千台主机,应该知道它们是这个数据中心的一部分”,这意味着当您查询该数据中心时应用了该规则,您将不会一次看到所有这数百万个系列。随着在整个集群中部署标记关联,您将逐渐得到越来越多的结果。如果需要,我们可以稍后重新审视这个模型。

欲了解更多详情,请查看Github上的对话或者是设计文档

结果

Meta标签将是Metrictank的一个无缝且强大的功能。它们是提供一种可扩展的方式来丰富大量带有冗余标记的系列的下一步,但与传统标记相比成本只有一小部分,并且使用方便的API来管理关联,而不必更新指标的源。它们将与常规标签无缝配合。我们已经有几个客户要求这样的功能,在Bloomberg朋友的帮助下,我们很高兴能够把它带到Metrictank。