理解转置函数 t()

概述

转置功能是博森功能更强大的功能之一,但它也需要付出努力才能理解。它功能强大,因为它让我们在不同级别上发出警报,而不是基础数据的标记结构。

转置会更改警报的范围。这可让你范围的事情到更大的集合。因此,例如,如果你的查询返回 host,cluster 的范围并且想要基于群集运行状况而不是单个主机进行警报,则可以使用转置来执行此操作。

什么是范围
范围是构成最终结果的标记键列表。例如:

  • 如果范围是 host,则会在警报中获得每个主机结果。
  • 如果你的范围是空的(没有标记键),那么你只能获得一个警报。
  • 如果你的范围是 host,iface,你可以获得结果中每个主机上每个接口的警报。

因此,我们得到的警报与数据的标签相关联。转置功能允许我们在公制标签结构以外的不同范围内发出警报。因此,我们可以查询导致 host,cluster 但在 cluster 范围内发出警报的事情。

打破功能

转置函数的签名是:

t(numberSet, group string) seriesSet

因此,它需要一个 numberSet ,一个范围又称为结果的组,并返回一个 seriesSet

这些东西是什么?

Set,numberSets 和 seriesSets

bosun 中的许多函数的结果都是集合,通常是数字 SetseriesSet 。结果中的整个集合共享相同的标记。并且集合中的每个项目对于每个对应密钥的值是唯一的。如果集合中每个项目的值是一个系列(timestamp:value,timestamp:value),那么我们有一个 seriesSet 。如果每个项的值只是一个数字,那么我们有一个数字 Set

它的肉

Transpose 使用 numberSet 并返回一个具有更大范围(更少标记键) 的 seriesSet 。产生的 seriesSet 有点奇怪,因为索引不是时间,就像通常情况下的 seriesSet 一样,因此 timevalue 不再是时间而只是一个索引号。因此应该忽略它。

因此,我们最终设置项转换为结果集的值,其中生成的集类型(seriesSet)可以包含多个值:

http://i.stack.imgur.com/4xMNL.jpg

让我们来看一个例子:

# This returns a seriesSet of a scope of host,cluster
$connByHostCluster = q("sum:rate{counter,,1}:elastic.http.total_opened{cluster=StackExchangeNetwork|LogStash,host=ny-*}", "1h", "")

http://i.stack.imgur.com/ExUnZ.jpg

# Turn each item in the set into a numberSet by reducing it via average
$avgConnByHostCluster = avg($connByHostCluster)

http://i.stack.imgur.com/rhAer.jpg

# Transpose to new scope 
$clusterScope = t($avgConnByHostCluster, "cluster")

http://i.stack.imgur.com/Wm7lD.jpg

你现在可以使用代表群集的每个项目做整洁的事情。例如,你可以执行 sum($clusterScope > 5)(请注意,$clusterScope 是一个 seriesSet )来获取群集中每个项目的速率高于 5 的项目数。然后,你可以在计数大于某个值时发出警报。例如,你还可以使用 len($clusterScope) 获取每个群集中的主机数,并提醒相对于群集中主机数量超过阈值的主机数。