statsD介绍、安装和使用

介绍
应用程序的监控是微服务中很重要的一环。监控主要包括四个方面的内容:指标(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值