使用 StatsD 的好处
StatsD 做为你的代码和指标平台之间的中间件,多年来,它已成为广泛使用。 所以你会得到利用的一个巨大的开放源生态系统和享受StatsD的简单性和灵活性。
StatsD 概念和议定都是相当简单,并有现在的库用于每种编程语言,这提供一个薄包装和使用各自语言的模式。 数据协议本身是基于文本的,易于读与,很方便地可以命令行与编程语言的交互测试。
发送数据到 StatsD 是使用 UDP 协议,因此它是开火和忘记模式,没有错误检查或在等待确认. 对于大多数使用的情况下,这种方法是可以接受的,因为完美是不必要的,并且可以正确应对监控层的错误和崩溃。
StatsD 守护程序与你的应用程序分离,所以您应用程序可以写是不同的编程语言并可能位于另个服务器上。 如果 StatsD 守护程序的崩溃,你的应用将继续运行很好。 最后,StatsD 监控程序增加了可以忽略不计的开销应用程序。
StatsD 中的指标分类
Gauges 仪表盘
Gauges 仪表盘能把你想发送到 StatsD 指标数据库的数据直接通过值显示出来。
Counters 计数器
计数器,为你跟踪统计运行过程的总和,而你只指明有多少增加。时间间隔限定于 StatsD flushInterval config
选项,经过这个时间间隔,StatsD 发送最终累计值为指标的后端,并重置计数为零。 StatsD 创建两个指标,每个指标定义,通过使用 .count 和 .rate 的后缀。 'Count'的总值,而'率'是每秒平均水平。
Timers 计时器
最初开始作为一个计时器的实现,这类指标可以让你发送每个时间间隔的许多抽样用于度量,并且 StatsD 将计算的一些统计数据。 这些统计数据具有下列后缀:
.count
.count_ps
.lower
.upper
.upper_90
.std
.sum
.sum_90
.mean
.mean_90
.median
_90
代表的值在百分90的分位数。
Sets 集
通过使用 Sets 集指标的类型,你会得到的唯一值的计数,而不是数值本身。 例如,如果在一个时间间隔,你用给定的指标名发送值 7, 13, 7和 5 到 StatsD,则该指标将会记录的数值 3 ,因为这个集合 里包含三个唯一的数值。
值得注意的概念
Relationship between Flush Intervals in StatsD and the Time Resolution of Metrics in the Database
StatsD刷新时间间隔与指标在数据库时间分辨率之间的关系
默认的刷新时间间隔在StatsD是10秒的,这意味着每十秒钟,StatsD发其最新的数据定义的后台,诸如InfluxDB 或 Graphite (石墨)应用系统。 对于给定的指标名称,最后一个值期间收到的给定的时间间隔将复盖的任何先前的数值期间收到的时间间隔。 考虑 StatsD 将它的计数器定时刷新,这可能会成为问题,所以如果对刷新间隔设置得不仔细,可能会丢失数据。
举个例子将有助于澄清这个概念。 如:
你有一个度量命名为 website.analytics.page_views 的指标用来度量网站流量,
该量度的时间分辨率后端定义为1分钟,
且 flushInterval 在 StatsD 设置为10秒钟,
经过两分钟,StatsD发生的输出以下计数: 17, 23, 11, 87, 59, 43, 47, 19, 29, 83, 73, 和61。
首先,请记住,每10秒钟 StatsD 重新计数,因此,所有这些计数仅仅用于它们各自的10秒的时间间隔。
你的后端数据库(InfluxDB, Graphite,等等。) 将会收到值17,然后收到23,覆盖17,接收11、覆盖前面的23,等等。 它将保存值43作为第一个一分钟的时间间隔,而它将储存的值61的第二个一分钟的时间间隔。 正如你可以看到,度量结束了严重歪曲页面浏览数!
为了避免这个问题,你所要做的就是保证你的StatsD flushInterval 刷新间隔至少与后㾄分辨率一致。 如果他们是相同的,那么每个块从 StatsD将收到一个单一的值,这是理想的。 如果 flushInterval 大于指标分辨率,然后一些块是空的和一些块中将包含的值跨越最后一个非空块。 虽然不理想,这很好和可以工作。
在 Grafana 模板中定义 $BinSize 块大小变量,可以简化配置
在你的仪表板定义块大小,可以助力你的仪表板可控和并加快查询。
说你想要缩小,并期待在最近30天内而不是在过去的2天里,正如你通常做的。 你的仪表板,将会有更多的数据点比往常一样,他们将很难区分和查询将是缓慢的。 一旦你有一个变量的定义需要块的尺寸,你可以查询问的数据库汇总的指标,块的尺寸,然后才提供的他们给你,在Grafana. 得到的图表将负载的要快得多,并且不会包含大量的数据点。
一种方法,是在每个仪表板要确定一个模板变量(这可以被命名形如 $BinSize)。 一个合理的选择值可以是 5min, 10min, 15min, 20min, 30min, 1h, 2h, 3h, 4h, 6h, 12h, 1d, 2d, 7d.
一旦定义好模板变量,你可以用它来聚合数据查询。 在 Graphite,你可以聚集你的指标值,使用的 summarize
的功能。 例如:
summarize(*.*.*.task_run_duration.upper, "$BinSize", "max")
summarize(some.task_run_duration.mean, "$BinSize", "avg")
summarize(*.*.task_runs.count, "$BinSize", "sum")
在 InfluxDB,你可以聚合指标值,使用的 GROUP BY time($BinSize)
结构。 例如:
SELECT max(duration_upper) FROM task_performance
GROUP BY time($BinSize)
SELECT mean(duration_mean) FROM task_performance
GROUP BY time($BinSize)
SELECT sum(runs_count) FROM task_performance
GROUP BY time($BinSize)
在这样一步一步的指导中定义的模板变量,一旦你的仪表板上的页面点击设置【齿轮】图标中心,在该页标题,然后点击【模板】,获得配置面板的模板变量。 你的变量命名,例如 $BinSize,给它一个更加人性化的标签, 正如你所愿,并且改变 【类型】,以【自定义】。 在本'定义的选项'部分,输入值,你想要你的变量来让你选择,例如,5min, 10min, 15min, 20min, 30min, 1h, 2h, 3h, 4h, 6h, 12h, 1d, 2d, 7d. 最后,请点击"添加"按钮。 现在你将看到一个行在我们的仪表板含有的变量和一个下拉框从可用的值从中可以选择。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。