statsd也是一款數據採集工具。html
statsd狹義來說,其實就是一個監聽UDP(默認)或者TCP的守護程序,根據簡單的協議收集statsd客戶端發送來的數據,聚合以後,定時推送給後端,如graphite和influxdb等,再經過grafana等展現。git
statsd 其實也有不少第三方包用來收集數據,可是statsd支持的類型較少,度量只有四種,因此我只用statsd做爲傳輸協議進行數據傳輸。因此沒有直接使用下面介紹的這4個第三方包github
git 官方介紹了4種,地址:https://github.com/statsd/statsd/wiki#client-implementationsgolang
statsd後端
<bucket>:<value>|<type>[|@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 。post
實際上,在客戶端每次調用發送接口會計算其發送機率。性能
statsd可配置相應的server爲UDP和TCP。默認爲UDPui
UDP更適合於上報頻率比較高的場景,就算丟幾個包也無所謂,對於一些一天已上報的場景,任何一個丟包都影響很大。
網絡環境比較差的場景,適合用TCP,會有相應的重發,確保數據可靠
建議使用UDP。TCP仍是有許多弊端的。
statsd 默認監聽8125來收集udp包。
port: 8125
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
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
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
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,替代前一個值
記錄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