Statsd+Graphite+Grafana:搭建web監控系統


 

 

簡單介紹

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM