go監控方案(3) -- statsd
statsd
statsd也是一款資料採集工具。
statsd狹義來講,其實就是一個監聽UDP(預設)或者TCP的守護程式,根據簡單的協議收集statsd客戶端傳送來的資料,聚合之後,定時推送給後端,如graphite和influxdb等,再通過grafana等展示。
statsd 其實也有很多第三方包用來收集資料,但是statsd支援的型別較少,度量只有四種,所以我只用statsd作為傳輸協議進行資料傳輸。所以沒有直接使用下面介紹的這4個第三方包
git 官方介紹了4種,地址:https://github.com/statsd/statsd/wiki#client-implementations
- statsd: https://github.com/alexcesaro/statsd
- statsd: https://github.com/quipo/statsd
- g2s : https://github.com/peterbourgon/g2s
- go-statsd-client: https://github.com/cactus/go-statsd-client (直接使用推薦這個)
協議
<bucket>:<value>|<type>[|@sample_rate]
- bucket是一個metric的標識,可以看成一個metric的變數。
- value: metric的值,通常是數字。
- metric的型別,通常有timer、counter、gauge和set四種。
- sample_rate
sample_rate
如果資料上報量過大,很容易溢滿statsd。所以適當的降低取樣,減少server負載。
客戶端減少資料上報的頻率,然後在傳送的資料中加入取樣頻率,如0.1。statsd server收到上報的資料之後,如cnt=10,得知此資料是取樣的資料, 然後flush的時候,按取樣頻率恢復資料來發送給backend,即flush的時候,資料為cnt=10/0.1=100,而不是容易誤解的10*0.1=1。
這個引數的主要作用是降低網路的傳輸頻寬,例如 0.5 表示 UDP 包減少一半,其代價是降低了精確度。對於客戶端,如果設定了 0.5 ,也就意味著只有原先 50% 的時間傳送統計值;在服務端,會根據取樣值進行一些修正,簡單來說就是乘以 2 。
實際上,在客戶端每次呼叫傳送介面會計算其傳送概率。
UDP 和 TCP
statsd可配置相應的server為UDP和TCP。預設為UDP
- UDP不需要建立連線,速度很快,不會影響應用程式的效能。
- “fire-and-forget”機制,就算statsd server掛了,也不會造成應用程式crash。
UDP更適合於上報頻率比較高的場景,就算丟幾個包也無所謂,對於一些一天已上報的場景,任何一個丟包都影響很大。
網路環境比較差的場景,適合用TCP,會有相應的重發,確保資料可靠
建議使用UDP。TCP還是有許多弊端的。
預設埠
statsd 預設監聽8125來收集udp包。
port: 8125
指標 metric
statsd 支援的資料型別:
Counting: gorets:1|c
Sampling: gorets:1|c|@0.1
Timing: glork:320|ms|@0.1
Gauges: gaugor:333|g
Sets: uniques:765|s
Multi-Metric Packets
gorets:1|c\nglork:320|ms\ngaugor:333|g\nuniques:765|s
Counting
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
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
Gauges
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
參考
Telegraf Service Plugin: statsd
Getting Started with Sending StatsD Metrics to Telegraf & InfluxDB