天天看點

使用 Kapacitor 對 InfluxDB 資料進行統計處理

      InfluxDB + Telegraf + Grafana 算是一套不錯的資料收集、視覺化工具,相比于更為常見的 ELK 架構,它有着自己的特點。查詢功能總得來說雖不如 ES 強大,但是優點是——已經夠用了,而且它的性能不錯,存儲的資料占用空間也相比 ES 小。

簡單介紹這三個工具:

  • InfluxDB 是 InfluxData 的一款時序資料庫,它是這套工具的核心;
  • Telegraf 則是 InfluxData 自己開發的一個資料收集工具,相比于 Logstash 或者 Mozilla 的 Heka,它有了更多的内置實用 input 插件,例如 sysstat, Mongodb, MySQL, 日志檔案 grok 和跟蹤 … 使用 Telegraf 可以非常容易的監控起系統和各種常見服務的各種參數,基本無需再安裝其它專用工具。
  • Grafana 則是一個資料視覺化工具(“畫圖”的),支援多種資料後端,包括 InfluxDB,Elasticsearch,Zabbix 等。

實際上,InfluxData 是有一個自己的 TICK 架構的(Telegraf + InfluxDB + Chronograf + Kapacitor),其中 Chronograf  是用來畫圖的,但是看起來似乎還不成熟,不如使用 Grafana 好。Kapacitor 則是一個專門處理 InfluxDB 裡面的資料的工具,用它可以對收集到的資料進行統計、觸發報警等。。。

好了,說了這麼多,其實是想借一個執行個體說下怎樣用 InfluxData 的 Kapacitor 來對 InfluxDB 的資料進行加工處理。

假設:已經搭建好了 InfluxDB + Telegraf + Grafana 這套工具,web 日志收集存儲在了 InfluxDB,我們想檢視一些統計數值,比如每日獨立通路 IP 這樣的有價值的資料,我們現在該怎麼做?

一般來說,有以下幾個選項:

  1. 在 Grafana 裡面,我們建立一個圖表,每次檢視時實時統計出所有的每日獨立 IP。但是這個方法實在不妥,web 日志量很大,如果每次一檢視那個圖表就把 InfluxDB 裡面的資料全部過一遍,還要計算、分組,實在太低效,性能太糟糕。對于每日獨立 IP 這種資料來說,我們其實并不需要它是實時的,隻要每天統計一次即可。
  2. 我們寫個 Shell 或者強大一點,Python 腳本去從 InfluxDB 查詢出獨立 IP 數,再把結果存回 InfluxDB,再把它放到 crontab 裡面每天運作,然後 Grafana 建立的圖表可以直接查這個新的 measurement。這種方法遠比第一種要好很多,但是仍然是需要寫腳本的。
  3. 我們可以利用專門的工具——Kapacitor 來做這件事。下面就詳細說下如何取每日獨立 IP 數。

按照官方的簡介,Kapacitor 是一款“Time-Series Data Processing, Alerting and Anomaly Detection”,也就是說——資料處理、報警、異常探測它都能做。

Kapacitor 的安裝、配置都很簡單,推薦從官網下載下傳 rpm/deb 包安裝,然後修改 /etc/kapacitor/kapacitor.conf 檔案,在 InfluxDB 連接配接配置裡面設定好賬号、密碼,就可以啟動 kapacitor 服務了。

Kapacitor 有一個背景服務,使用者需要做的事就是編寫 TICKscript 腳本,然後把這個腳本加載。

來看這個計算每日獨立 IP 的腳本,ip.tick:

batch
    |query('''
        SELECT count(distinct(clientip)) AS uip
        FROM "telegraf"."retentionPolicy"."log_measurement"
    ''')
        .period(1d)
        .cron('0 0 * * *')
    |influxDBOut()
        .database('logstats')
        .measurement('site_uip')
        .tag('kapacitor', 'true')      

其中,batch 指令表示這是一個對資料進行一次批量處理的任務; |query() 表示這是資料查詢的處理節點,我們在 query() 裡面直接寫入 InfluxDB 的類SQL 查詢語句即可,但并沒有加入 WHERE 條件對查詢時間進行限定,這是為何?因為後面的 .period() 指定了查詢範圍為一天;然後再利用 .cron() 這個屬性,我們可以告訴 Kapacitor 每天零點都執行一次這個查詢。|influxDBOut() 則是将查詢出來的資料存入 InfluxDB,它的幾個屬性也比較好了解,不再詳說。

儲存檔案後,執行以下指令:

$ kapacitor define log_uip -tick ip.tick -type batch \
   -dbrp telegraf.retentionPolicy
$ kapacitor enable log_uip      

就定義和啟用了這個 Kapacitor 任務。接下來還可以用 kapacitor show log_uip 或者 kapacitor list tasks 等指令檢視任務狀态。看到了吧,這樣比腳本加 crontab 還是要簡單不少的。(kapacitor 指令的參數含義可以用 help 子指令或者這個文檔連結檢視。)

在它運作過後,我們就可以在 Grafana 裡面取 logstats 資料庫裡面 site_uip 的 uip 出來進行畫圖了。

總結:這篇文章隻是用一執行個體展示了 Kapacitor 的功能之一,實際上 Kapacitor 的功能遠不止這些,(報警等功能,因為我的環境早有這種功能,沒有使用過。)tick 腳本的文法也比上面展示出來的部分強大很多,其資料處理節點也很豐富。總得來說,InfluxData 的這套 TICK 架構似乎還在快速發展的起步階段(尤其是除 InfluxDB 外的那三部分),但是其實用性已經有一定吸引力了。

轉自:

https://dislic.net/tag/kapacitor/

繼續閱讀