简单介绍
Statsd:一个nodejs的客户端,用于向graphite的收集器发送数据,使用各类编程语言的客户端响起发送timer,counter等统计数据后,其通过udp定时向graphite发送数据。
- Statsd 最早是 2008 年 Flickr 公司用 Perl 写的针对 Graphite、datadog 等监控数据后端存储开发的前端网络应用,2011 年 Etsy 公司用 node.js 重构。
- statsd狭义来讲,其实就是一个监听UDP(默认)或者TCP的守护程序,根据简单的协议收集statsd客户端发送来的数据,聚合之后,定时推送给后端,如graphite和influxdb等,再通过grafana等展示。
Graphite:Graphite 是用 Python 模仿 RRDtools 写的时间序列数据库套件。包括三个部分:
- carbon: 是一个Twisted守护进程,监听处理数据;
- whisper: 存储时间序列的数据库;
- webapp: 一个用 Django 框架实现的网页应用。
- 我们这里使用其接收Statsd收集上来的的数据,并存储监控数据;
Grafana:是一个开源的强有力的数据展示、量化分析工具,数据源包括 graphite、prometheus、mysql、influxdb 等等,可以直接在页面上组装语句,另外还可以对资源实现可用性和性能监控报警,同时还支持集成OpenLDAP;
Statsd
容器启动
docker run -d -p 8125:8125/udp -p 8126:8126 -v /home/statsd/config.js:/usr/src/app/config.js statsd
注意配置
statsd提供默认的配置文件Config.js。可以参考相应的注释按需配置,接下来将简单介绍一些配置项。
statsd 默认监听8125来收集udp包,这里将收集的数据发送到graphite。
{ graphitePort: 2003, graphiteHost: "10.10.10.124", port: 8125, backends: [ "./backends/graphite" ] }
快速测试:通过nc向statsd发送数据
statsd接收的数据格式如下:
<metricname>:<value>|<type>
nc发送
echo "foo:1|c" | nc -u -w0 127.0.0.1 8125
StatsD 支持汇总的数据类型:counter、timer、gauge和set。
Metirc Type: Counting
最简单的metric应该就是counter,也就是通常的计数功能,StatsD会将收到的counter value累加,然后在flush的时候输出,并且重新清零。所以我们用counter就能非常方便的查看一段时间某个操作的频率,譬如对于一个HTTP服务来说,我们可以使用counter来统计request的次数,finish这个request的次数以及fail的次数。
echo "foo:1|c" | nc -u -w0 127.0.0.1 8125
Metirc Type: Gauges
不同于Counter,Gauge在下次flush的时候是不会清零的,另外,gauge通常是在client进行统计好在发给StatsD的,譬如, capacity:100|g 这样的gauge,即使我们发送多次,在StatsD里面,也只会保存100,不会学counter那样进行累加。
Metirc Type: Set
Set用来计算某个metric unique事件的个数,譬如对于一个接口,可能我们想知道有多少个user访问了,我们可以这样:
StatsD就会展示这个request metric只有1,2两个用户访问了。
request:1|s request:2|s request:1|s
Metirc Type: Timing
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
Graphite
容器运行
docker run -d --name ops-graphite --restart=always -p 8880:80 -p 2003-2004:2003-2004 -p 2023-2024:2023-2024 -p 8125:8125/udp -p 8126:8126 -v /home/graphite/whisper:/opt/graphite/storage/whisper:rw -v /home/graphite/redis:/var/lib/redis:rw -v /home/graphite/log:/var/log:rw graphiteapp/graphite-statsd
可通过浏览器访问 graphite 页面,http://公网ip:8880
,默认用户名:root,密码:root。
grafana
容器运行
docker run -d --name grafana -p 3000:3000 grafana/grafana:master
grafana配置graphtte数据源
添加 graphite
数据源,配置用户名密码,测试连接状态
Name:Graphite
URL:http://公网ip:8880
Auth:勾选
Basic Auth Details:
-user:root
-Password:root