簡單介紹
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