介绍
应用程序的监控是微服务中很重要的一环。监控主要包括四个方面的内容:指标(metrics)的采集、存储、展示以及相应的报警机制。目前相关的解决方案以及工具非常多。今天就介绍一款用于采集数据的工具——StatsD。
Statsd 最早是 2008 年 Flickr 公司用 Perl 写的针对 Graphite、datadog 等监控数据后端存储开发的前端网络应用,2011 年 Etsy 公司用 node.js 重构,有时间可以查看这边文章 Measure Anything, Measure Everything 。
github:https://github.com/statsd/statsd
statsD狭义来讲,包含一个监听UDP(默认)或者TCP的守护程序,以及一套简单的协议。任何udp/tcp客户端都可以根据其协议发送数据到守护进程,守护进程聚合之后定时推送给后端,如graphite和influxdb等。
StatsD系统包括三部分:客户端(client)、服务器(server)和后端(backend)。客户端植入于应用代码中,将相应的metrics上报给StatsD server。statsd server聚合这些metrics之后,定时发送给backends。backends则负责存储这些时间序列数据,并通过适当的图表工具展示。
基本概念
1、statsd协议:
statsd采用简单的行协议,例如:
<bucket>:<value>|<type>[|@sample_rate]
bucket:是一个metric的标识,可以看成一个metric的变量。
value:metrics值,通常是数字。
type:metric的类型,通常有timer、counter、gauge和set四种。
sample_rate:采样率,降低客户端到statsd服务器的带宽。客户端减少数据上报的频率,然后在发送的数据中加入采样频率,如0.1。statsd server收到上报的数据之后,如cnt=10,得知此数据是采样的数据,然后flush的时候,按采样频率恢复数据来发送给backend,即flush的时候,数据为cnt=10/0.1=100,而不是容易误解的10*0.1=1。
2、UDP 和 TCP:
statsd可配置相应的server为UDP和TCP(默认为UDP)。UDP和TCP各有优劣,但UDP确实是不错的方式。
UDP不需要建立连接,速度很快,不会影响应用程序的性能。
“fire-and-forget”机制,就算statsd server挂了,也不会造成应用程序crash。
当然,UDP更适合于上报频率比较高的场景,就算丢几个包也无所谓,对于一些一天已上报的场景,任何一个丢包都影响很大。另外,对于网络环境比较差的场景,也更适合用TCP,会有相应的重发,确保数据可靠。
3、metric类型:
3.1)counter:
用来累加计数,值可以是正数或者负数。在一个flush区间,把上报的值累加,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
3.2)timer:
timers用来记录一个操作的耗时,单位ms。
1)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
2)percentThreshold
对于timer数据,除了正常的统计之外还会计算一个百分比的数据(过滤掉峰值数据),默认是90%。可以通过percentThreshold修改这个值或配置多个值。例如在config.js中配置:
//分别计算50%和80%的相关值
percentThreshold: [50, 80]
对于百分数相关的数据需要解释一下。以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
3)直方图
有时仅记录操作的耗时并不能让我们很好的知道当前系统的情况,通常,timing都是跟histogram一起来使用的。在config.js配置文件中设置:
histogram: [ { metric: '', bins: [10, 100, 1000, 'inf']} ]
这样就开启了histogram,这个histogram的bin的间隔是[0, 10ms),[10ms - 100ms), [100ms - 1000ms), 以及[1000ms, +inf),如果一个timing落在了某个bin里面,相应的bin的计数就加1,譬如:
foo:1|ms
foo:100|ms
foo:1|ms
foo:1000|ms
那么最终statsd最终flush输出时:
histogram: { bin_10: 2, bin_100: 0, bin_1000: 1, bin_inf: 1 } } },
注:没有p99等指标。
3.3)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,替代前一个值
注:gauge通常是在client进行统计好在发给StatsD的,如capacity:100|g 这样的gauge,即使我们发送多次,在StatsD里面,也只会保存100 。
3.4)sets:
记录flush期间,不重复的值。可以用来计算某个metric unique事件的个数,譬如对于一个接口,可能我们想知道有多少个user访问了,我们可以这样:
StatsD就会展示这个request metric只有1,2两个用户访问了。
request:1|s // user 1
request:2|s // user1 user2
request:1|s // user1 user2
安装&使用
1、安装
在centos6上通过源码安装statsd(也可以根据github上的说明,使用docker安装)。
1.1)nodejs环境:
参考:https://blog.csdn.net/liuxiao723846/article/details/48519593
注意:最新的statsd使用了ES6的语法,所以需要至少node6.0以上的版本。(https://nodejs.org/download/release/v6.17.1/)
1.2)下载、配置、启动:
#下载
cd /usr/local
git clone https://github.com/statsd/statsd.git
cd statsd
cp exampleConfig.js config.js
#修改config.js
#...
#启动
node /usr/local/statsd/stats.js /usr/local/statsd/config.js
2、配置:
statsd提供默认的配置文件exampleConfig.js。可以参考相应的注释按需配置,接下来将简单介绍一些配置项。
{
port:8125,//statsd 服务端口
backends:["./backends/console"],
console:{
prettyprint:true
},
flushInterval:30000,//statsd flush时间
percentThreshold: [80,90]
}
{
port: 8125,
graphitePort: 2003,
graphiteHost: "graphite.example.com",
backends: [ "./backends/graphite" ]
}
注:在statsd目录下,backends中包含了默认的后端:graphite和console。
3、使用:
配置statsd的backends问console进行调试,启动statsd。然后使用netcat发送数据进行测试:
echo "test:9|ms" | nc -w 1 -u 127.0.0.1 8125
注意:netcat -w参数表示超时时间,单位是秒。
根据配置的flushinterval,statsd服务端会定时的将聚合好的数据发送到backends,如果配置的后端是console,则会输出:
Flushing stats at Mon Oct 12 2020 22:53:11 GMT+0800 (CST)
{ counters:
{ 'statsd.bad_lines_seen': 0,
'statsd.packets_received': 0,
'statsd.metrics_received': 0 },
timers: { 'statsd_test.test.cost': [] },
gauges: { 'statsd.timestamp_lag': 0 },
timer_data: { 'statsd_test.test.cost': { count_ps: 0, count: 0 } },
counter_rates:
{ 'statsd.bad_lines_seen': 0,
'statsd.packets_received': 0,
'statsd.metrics_received': 0 },
sets: {},
pctThreshold: [ 80, 90 ] }
其他
1、Backends:
StatsD支持可插拔backends,安装包中默认带有graphite后端。可以将其他后端作为简单的npm软件包进行分发和安装:
amqp-backend
ganglia-backend
librato-backend
socket.io-backend
statsd-backend
mongo-backend
mysql-backend
datadog-backend
monitis backend
instrumental backend
hosted graphite backend
statsd aggregation backend
zabbix-backend
opentsdb backend
influxdb backend
stackdriver backend
couchdb-backend
elasticsearch backend
Google BigQuery backend
2、服务端实现:
StatsD最初由Etsy的Erik Kastner编写,它基于Flickr的想法以及Cal Henderson的这篇文章:Counting and Timing。2011年该服务器用Nodejs编写重写,但是从那时起已经有其他语言的实现:
brubeck - Server in C
clj-statsd-svr — Clojure server
gographite — Server in Go
gostatsd — Server in Go
netdata - Embedded statsd server in the netdata server, in C, with visualization
Net::Statsd::Server — Perl server, also available on CPAN
Py-Statsd — Server and Client
Ruby-Statsdserver — Ruby server
statsd-c — Server in C
statsdaemon (bitly) — Server in Go
statsdaemon (vimeo) — Server in Go
statsdcc - Server in C++
statsdpy — Python/eventlet Server
Statsify - Server in C#
statsite — Server in C
bioyino — High performance multithreaded server written in Rust
3、客户端实现:
客户端主要是根据statsd协议,通过UDP/TCP向守护进程通信。常见的实现有:
Node
lynx — Node.js client used by Mozilla, Nodejitsu, etc.
Node-Statsd — Node.js client
node-statsd-client — Node.js client
node-statsd-instrument — Node.js client
statistik - Node.js client with timers & CLI
statsy - clean idiomatic statsd client
Java
java-statsd-client — Lightweight (zero deps) Java client
Statsd over SLF4J — Java client with SLF4J logging tie-in
play-statsd — Play Framework 2.0 client for Java and Scala
statsd-netty — Netty-based Java 8 client
Python
Py-Statsd — Server and Client
Python-Statsd — Python client
pystatsd — Python client
Django-Statsd — Django client
Ruby
statsd-instrument — Ruby client
statsd — Ruby client (needs new maintainer)
Statsd-Client — Ruby client (not maintained)
Perl
Net::Statsd — Perl client, also available on CPAN
Net::StatsD::Client — Perl client, not available on CPAN
Etsy::StatsD - Perl client, also available on [CPAN] (https://metacpan.org/module/Etsy::StatsD)
PHP
Metrics
PHP client
php-statsd and Spark
php-statsd-client - supports SplClassLoader
statsd-php-client - Minimalist performant client
phpLeague-statsd-client - Php League StatsD client
statsd-php-client - optimized client with monolog and symfony2 integrations available
statsd-php - PSR-4 compatible client
Clojure
Clojure client
Io
io-statsd — StatsD Client for Io
C
C client — A trivial C client
CPP
statsd-client-cpp — StatsD Client in CPP
cpp-statsd-client — A header-only StatsD client implemented in C++
.NET
NStatsD.Client — .NET 4.0 client
C# client — C# client
graphite-client — .NET client library for StatsD and Graphite
StatsC — An asynchronous client with built-in support for batching
JustEat.StatsD — A .NET library for publishing metrics to statsd. Targets both .NET full framework and .NET Standard 2.0.
Statsify - .NET client
Go
go-statsd - Go statsd client library with zero allocation overhead, great performance and reconnects
GoE — Minimal & Performant
go-statsd-client — Simple Go client
g2s
StatsD
statsd — A simple and very fast StatsD client
Apache
mod_statsd - StatsD client to send stats straight from Apache
Varnish
libvmod-statsd - StatsD client to send stats straight from Varnish
PowerShell
powershell-statsd - PowerShell client
Browser
StatsC - Push stats to StatsD from the browser!
StatsD HTTP Proxy - HTTP proxy to StatsD with REST interface for using in browsers
StatsD HTTP Client - StatsD client over http for using in browsers
Objective-C
MCStatsd - Cocoa client
ActionScript
flash-statsd - Flash client
WordPress
wordpress-statsd - WordPress Plugin
Drupal
StatsD - Drupal module
Haskell
statsd-client
R
rstatsd
Lua
lua-statsd
Nim
statsd_client
nim-metrics - supports StatsD, Carbon and Prometheus
参考:
https://github.com/statsd/statsd/wiki
https://www.jianshu.com/p/b10d6661e6be
https://www.jianshu.com/p/f6f18cc268a4
————————————————
版权声明:本文为CSDN博主「赶路人儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuxiao723846/article/details/109036280