StatsD 的使用小结

应用程序的监控是微服务中很重要的一环。监控主要包括四个方面的内容:指标(metrics)的采集、存储、展示以及相应的报警机制。目前相关的解决方案以及工具非常多。今天就介绍一款用于采集数据的工具——StatsD。
Statsd 最早是 2008 年 Flickr 公司用 Perl 写的针对 Graphite、datadog 等监控数据后端存储开发的前端网络应用,2011 年 Etsy 公司用 node.js 重构。
statsd狭义来讲,其实就是一个监听UDP(默认)或者TCP的守护程序,根据简单的协议收集statsd客户端发送来的数据,聚合之后,定时推送给后端,如graphite和influxdb等,再通过grafana等展示。
不过现在通常是指statsd系统。StatsD系统包括三部分:客户端(client)服务器(server)和后端(backend)。客户端植入于应用代码中,将相应的metrics上报给StatsD server。statsd server聚合这些metrics之后,定时发送给backends。backends则负责存储这些时间序列数据,并通过适当的图表工具展示。

基本原理与概念

statsd采用简单的行协议:

<bucket>:<value>|<type>[|@sample_rate]

bucket

bucket是一个metric的标识,可以看成一个metric的变量。

value

metric的值,通常是数字。

type

metric的类型,通常有timercountergaugeset四种。

sample_rate

如果数据上报量过大,很容易溢满statsd。所以适当的降低采样,减少server负载。
这个频率容易误解,需要解释一下。客户端减少数据上报的频率,然后在发送的数据中加入采样频率,如0.1。statsd server收到上报的数据之后,如cnt=10,得知此数据是采样的数据,然后flush的时候,按采样频率恢复数据来发送给backend,即flush的时候,数据为cnt=10/0.1=100,而不是容易误解的10*0.1=1。

UDP 和 TCP

statsd可配置相应的server为UDP和TCP。默认为UDP。UDP和TCP各有优劣。但
UDP确实是不错的方式。

  • UDP不需要建立连接,速度很快,不会影响应用程序的性能。
  • “fire-and-forget”机制,就算statsd server挂了,也不会造成应用程序crash。
    当然,UDP更适合于上报频率比较高的场景,就算丢几个包也无所谓,对于一些一天已上报的场景,任何一个丢包都影响很大。另外,对于网络环境比较差的场景,也更适合用TCP,会有相应的重发,确保数据可靠。

建议使用UDP。TCP还是有许多弊端的。

安装

statsd的安装非常简单。可选择两种方式:克隆源码和docker。

克隆源码

首先需要安装node环境。不清楚的可以参考这篇文章。然后到github克隆代码,修改相关配置启动即可。

1、 git clone git@github.com:etsy/statsd.git
2、 cd path/to/statsd
3、 根据exampleConfig文件定义自己的配置文件
4、 node stats.js path/to/config

这样statsd server就搭建成功了。

docker

用docker也是个好选择。

docker run -p 8125:8125 -p 8126:8126 --name statsd -d dockerana/statsd

statsd 默认监听8125来收集udp包。
可以通过nc指令测试数据收发。

echo "foo:1|c" | nc -w 1 -u 127.0.0.1 8125

配置

statsd提供默认的配置文件exampleConfig.js。可以参考相应的注释按需配置,接下来将简单介绍一些配置项。
端口
默认为8125端口。

port: 8125

后端
默认有console、greaphite等,也有influxdb等backend。console的后端通常加上prettyprint。可以同时配置多个backends。backends都要放在代码目录的backends目录下。

backends: ["./backends/console", "./backends/graphite"],
console: {
    prettyprint: true
}

flush interval
statsd 默认是10s执行一次flush。可通过flushInterval设置,单位ms。

flushInterval: 2000  // 设为2s

reload 配置
设置automaticConfigReload,watch配置文件,如果修改,即reload配置文件。默认为true。(然而reload配置之后,并没有生效。)

delete系列配置
metric上报时,每次flush之后,就会重置为0(gauge是保持原有值)。如果不上报这些空闲值,可以通过delete*来设置。

deleteGauges: true,
deleteTimers: true,
deleteSets: true,
deleteCounters: true

percentThreshold
对于timer数据,会计算一个百分比的数据(过滤掉峰值数据),默认是90%。可以通过percentThreshold修改这个值或配置多个值。

//分别计算50%和80%的相关值
percentThreshold: [50, 80]

只列举了部分配置项,具体请参考配置文件。

指标 metric

statsd 有四种指标类型:counter、timer、gauge和set。

计数器 counter

counter类型的指标,用来计数。在一个flush区间,把上报的值累加。值可以是正数或者负数。

user.logins:10|c        // user.logins + 10
user.logins:-1|c        // user.logins - 1 
user.logins:10|c|@0.1   // user.logins + 100
                        // users.logins = 10-1+100=109

计时器 timer

timers用来记录一个操作的耗时,单位ms。statsd会记录平均值(mean)、最大值(upper)、最小值(lower)、累加值(sum)、平方和(sum_squares)、个数(count)以及部分百分值。

rpt:100|g

如下是在一个flush期间,发送了一个rpt的timer值100。以下是记录的值。

count_80: 1,    
mean_80: 100,
upper_80: 100,
sum_80: 100,    
sum_squares_80: 10000, 
std: 0,     
upper: 100,
lower: 100,
count: 1,
count_ps: 0.1,
sum: 100,
sum_squares: 10000,
mean: 100,
median: 100 
 

对于百分数相关的数据需要解释一下。以90为例。statsd会把一个flush期间上报的数据,去掉10%的峰值,即按大小取cnt*90%(四舍五入)个值来计算百分值。
举例说明,假如10s内上报以下10个值。

1,3,5,7,13,9,11,2,4,8

则只取10*90%=9个值,则去掉13。百分值即按剩下的9个值来计算。

$KEY.mean_90   // (1+3+5+7+9+2+11+4+8)/9
$KEY.upper_90  // 11
$KEY.lower_90  // 1

标量 gauge

gauge是任意的一维标量值。gague值不会像其它类型会在flush的时候清零,而是保持原有值。statsd只会将flush区间内最后一个值发到后端。另外,如果数值前加符号,会与前一个值累加。

age:10|g    // age 为 10
age:+1|g    // age 为 10 + 1 = 11
age:-1|g    // age为 11 - 1 = 10
age:5|g     // age为5,替代前一个值

sets

记录flush期间,不重复的值。

request:1|s  // user 1
request:2|s  // user1 user2
request:1|s  // user1 user2

statsd 客户端

statsd的客户端已经支持多种语言的实现,参看列表。nodejs相关有几个推荐的:lynx、node-statsd和node-statsd-client,使用都差不多,星也差不多。以(node-statsd-client)[https://github.com/msiebuhr/node-statsd-client]为例:

const SDC = require('statsd-client'),
const sdc = new SDC({ host: 'localhost', port: 8125 });

//counter
sdc.counter('cnt', 10, 0.1); // 100/0.1=1000
sdc.increment('cnt', 10); // +10
sdc.decrement('cnt', 10); // -10

//gauge
sdc.gauge('rpt', 100);
sdc.gaugeDelta('rpt', -10);  // -10

//sets
sdc.set('ips', '1');

//timer
sdc.timing('rpt', 200);

//close
sdc.close()

总结

  • 基本原理:statsd是一个udp或tcp的守护进程。使用简单的行协议收集客户端的metic数据。statsd使用udp的好处。
  • 安装及配置
  • metric类型:counter、timer、gauge和sets。
  • statsd的node客户端。

参考

[1] StatsD Metric
[2] introduction-to-statsd
[3] Counting & Timing
[4] Measure Anything, Measure Everything
[5] 如果查看应用性能图表是一种信仰
[6] Collecting Metrics Using StatsD, a Standard for Real-Time Monitoring

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,865评论 6 13
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 5,941评论 1 13
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,051评论 0 8
  • 在互联网业务蒸蒸日上的今时今日,系统架构日渐复杂,随着软件产品和工程团队的变革,许多开源的监控工具应运而生,其中有...
    OneAPM_Official阅读 2,420评论 1 10