Telegraf+Influxdb+Grafana構建監控平臺

Magic_Duck發表於2019-03-04

本文章為本人在ops內容建設團隊第二期分享
歡迎關注微信公眾號:OPS無界工程師
本文章最後更新時間:2018-05-13
個人部落格地址:blog.sqdyy.cn

大家晚上好,今晚由我來分享基於telegraf+influxdb+grafana構建監控平臺的方案,首先我們先來了解InfluxDB。influxdb是一款專為時序資料編寫的高效能資料庫,採用GO語言開發,並且開源!它是TICK技術棧的一部分。它採用TSM引擎進行高速攝取和資料壓縮。並提供高效能的寫入/查詢 HTTP API,其表示式語句類似SQL查詢語句(但資料結構概念不太一樣,詳見InfluxDB design insights and tradeoffs

先對上面的一些名稱進行解釋,TICK技術棧指的是InfluxData公司研發的四款監控開源產品,包括Telegraf、InfluxDB、Chronograf、Kapacitor。其中InfluxDB使用最廣泛,是開源的時序資料庫,一個比較常見的應用場景為日誌儲存。Kapacitor提供了基於influxdb的監控報警方案,支援多種資料聚合,選擇,變換,預測方法。Chronograf用於對資料進行展示,可以使用功能更強大的Grafana替代。

TSM引擎這塊我也不太熟悉,屬於進階知識,網上資料也不多,感興趣的大佬可以自己去研究:

TSM

influxdb

時序資料庫主要用於儲存系統的監控資料,一般具有如下特徵:

  • 以時間為維度的高效查詢
  • 方便的down sampling
  • 高效的處理過期資料

對於influxdb的學習方式,我建議先參考Linux大學的InfluxDB系列教程對Influxdb有一個基本的瞭解(但不需要死摳,因為其中有些描述是過時的),然後再去influxdb官檔深入學習為佳。

下載並安裝influxdb

# 新增yum 源
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL $releasever
baseurl = https://repos.influxdata.com/rhel/$releasever/$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
sudo yum install influxdb
influx -version
複製程式碼

啟動服務、新增開機啟動:

sudo service influxdb start
sudo systemctl start influxdb
複製程式碼

主要概念

InfluxDB與傳統資料庫在概念上有一些不同,我介紹一些基本的概念,如果你想了解更多請參考官檔influxdb concepts

與傳統資料庫中的名詞做比較

influxDB中的名詞 傳統資料庫中的概念
database 資料表
measurement 資料庫中的表
points 表裡面的一行資料

InfluxDB的獨有概念

剛才說的是InfluxDB與傳統資料庫相同的概念,下面介紹它的特有概念。

Point

Point相當於傳統資料庫中表裡面的一行資料,由timestamp(時間戳),field(資料),tags(標籤)組成。

Point屬性 傳統資料庫中的概念
timestamp 每個資料都需要一個時間戳(主索引&自動生成),在TSM儲存引擎中會特殊對待,以為了優化後續的查詢操作
field (field key,field set,field value) 各種記錄值(沒有索引的屬性),例如溫度
tag (tag key,tag sets,tag value) 各種有索引的屬性,例如地區
series

series相當於是InfluxDB中一些資料的集合。所有在資料庫中的資料,都要通過圖表展示出來,而series則表示表裡面的資料,可以在圖表上畫成幾條線(通過tags排列組合算出來):

> show series from cpu
key
---
cpu,cpu=cpu-total,host=VM_42_233_centos
cpu,cpu=cpu0,host=VM_42_233_centos
cpu,cpu=cpu1,host=VM_42_233_centos
cpu,cpu=cpu2,host=VM_42_233_centos
cpu,cpu=cpu3,host=VM_42_233_centos
複製程式碼

其程式碼結構如下:

type Series struct {
    mu          sync.RWMutex
    Key         string              // series key
    Tags        map[string]string   // tags
    id          uint64              // id
    measurement *Measurement        // measurement
}
複製程式碼
shard

每個儲存策略下會存在許多shard,每個shard儲存一個指定時間段的資料,例如7點-8點的資料落入shard0中,8點-9點的資料落到shard1中,每個shard都對應一個底層的tsm儲存引擎,有獨立的cache,wal,tsm file。

資料保留策略

保留策略(RP)是用來定義資料在InfluxDB存放的時間,或者定義儲存某個期間的資料。當你建立資料庫時,InfluxDB會自動建立一個autogen(具有無限保留的保留策略):

> SHOW RETENTION POLICIES ON telegraf
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        true
複製程式碼

上面是查詢資料庫現有策略的語句,查詢結果各欄位含義如下:

欄位 含義
name 策略名稱
duration 持續時間,0代表無限保留
shardGroupDuration shardGroup是InfluxDB的一個基本儲存結構,168h0m0s表上單個shard所儲存的時間間隔為168小時,超過168小時後會被存放到下一個shard中
replicaN 全稱replication,副本個數(不太懂)
default 是否是預設策略
func shardGroupDuration(d time.Duration) time.Duration {
    if d >= 180*24*time.Hour || d == 0 { // 6 months or 0
        return 7 * 24 * time.Hour
    } else if d >= 2*24*time.Hour { // 2 days
        return 1 * 24 * time.Hour
    }
    return 1 * time.Hour
}
複製程式碼

我們可以建立一個新的保留策略,下面語句在telegraf庫中建立了一個2小時保留策略,名為2h0m0s並設定為預設策略:

> CREATE RETENTION POLICY "2h0m0s" ON "telegraf" DURATION 2h REPLICATION 1 DEFAULT
> SHOW RETENTION POLICIES ON telegraf
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        false
2h0m0s  2h0m0s   1h0m0s             1        true
複製程式碼

目前我們的autogen已經不再是預設策略,如果你需要查詢這個策略的資料,你需要在查詢時顯式的加上策略名:

> SELECT time,host,usage_system FROM "autogen".cpu limit 2
name: cpu
time                host             usage_system
----                ----             ------------
1526008670000000000 VM_42_233_centos 1.7262947210419817
1526008670000000000 VM_42_233_centos 1.30130130130254
複製程式碼

更多保留策略相關的內容,請參考官檔database_management

連續查詢

連續查詢(CQ)是在資料庫中自動定時啟動的一組語句,InfulxDB會將查詢結果儲存在指定的資料表中。

  • 使用連續查詢是最優降低取樣率的方式,連續查詢和儲存策略搭配使用將會大大降低InfulxDB的系統佔用量。
  • 使用連續查詢後,資料會存放到指定的資料表中,這樣就為以後統計不同精度的資料提供了方便。
  • 連續查詢一旦建立就無法更改。要更改連續查詢,您必須先DROP再重新使用CREATE建立新查詢。

下面是連續查詢的語法:

// 基本語法
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
RESAMPLE EVERY <interval> FOR <interval>
BEGIN
  SELECT <function[s]> INTO <destination_measurement> 
  FROM <measurement> [WHERE <stuff>] 
  GROUP BY time(<interval>)[,<tag_key[s]>]
END
複製程式碼

例如,下面語句在telegraf庫中新建了一個名為cq_30m的連續查詢,每30分鐘會取used欄位的平均值加入到mem_used_30m表中。使用的資料保留策略都是default:

CREATE CONTINUOUS QUERY cq_30m ON telegraf BEGIN SELECT mean(used) INTO mem_used_30m FROM mem GROUP BY time(30m) END
複製程式碼

下面是一些常用操作:

SQL 描述
SHOW CONTINUOUS QUERIES 查詢所有CQ
DROP CONTINUOUS QUERY <cq_name> ON <database_name> 刪除連續查詢

更多連續查詢相關的內容,請參考官檔continuous_queries

常用函式

InfluxDB提供了很多的有用的函式,其中分為三類:

  • 聚合類函式
函式 描述
count(field_key) 返回計數
DISTINCT(field_key) 返回唯一值
INTEGRAL(field_key) 計算欄位值覆蓋的曲面的面積值並得到面積之和
MEAN(field_key) 返回平均值
MEDIAN(field_key) 返回中間值
MODE(field_key) 返回欄位裡最頻繁的值
SPREAD(field_key) 返回最大差值
SUM(field_key) 返回總和
  • 選擇類函式
函式 描述
BOTTOM(field_key,N) 返回最小的N個值
FIRST(field_key) 返回一個欄位中最老的取值
LAST(field_key) 返回一個欄位中最新的取值
MAX(field_key) 返回一個欄位中的最大值
MIN(field_key) 返回一個欄位中的最小值
PERCENTILE(field_key,N) Returns the Nth percentile field value.
SAMPLE(field_key,N) 返回N個欄位的隨機樣本
TOP(field_key,N) 返回最大的N個值
  • 轉換類函式
函式 描述
CEILING() ~
CUMULATIVE_SUM() ~
DERIVATIVE() ~
DIFFERENCE() ~
ELAPSED() ~
FLOOR() ~
HISTOGRAM() ~
MOVING_AVERAGE() ~
NON_NEGATIVE_DERIVATIVE() ~
NON_NEGATIVE_DIFFERENCE() ~
  • 預測類
函式 描述
HOLT_WINTERS() 季節性預測演算法-對資料流量趨勢進行預測和預警

Telegraf

建立起了對時序庫的概念後,接下來我們就該往時序庫寫資料了,你可以通過你應用服務的metrics程式採集指標,然後通過influxdb提供的http api向influxdb寫入資料,但是本期我們並不介紹這樣的用法(如java的metrics還需介紹java的語法),下面為大家介紹一款與influxdb完美結合的採集資料的代理程式:Telegraf

Telegraf是用Go寫的代理程式,可以用於收集系統和服務的統計資料,是TICK技術棧的一部分。它具備輸入外掛,可以直接從系統獲取指標資料,從第三方API獲取指標資料,甚至可以通過statsd和Kafka獲取指標資料。它還具備輸出外掛,可以將採集的指標傳送到各種資料儲存,服務和訊息佇列。比如InfluxDB,Graphite,OpenTSDB,Datadog,Librato,Kafka,MQTT,NSQ等等。

下載並安裝Telegraf:

wget https://dl.influxdata.com/telegraf/releases/telegraf-1.6.2-1.x86_64.rpm
sudo yum install telegraf-1.6.2-1.x86_64.rpm
telegraf -version
複製程式碼

如果你的telegraf是安裝的,其配置檔案位置為:

/etc/telegraf/telegraf.conf
複製程式碼

編輯配置檔案,將我們配置好的influxdb資料庫指定為期望的輸出源:

[[outputs.influxdb]]
  urls=["http://localhost:8086"]
複製程式碼

啟動服務、新增開機啟動:

sudo systemctl start telegraf.service
sudo service telegraf status
sudo systemctl enable telegraf.service
複製程式碼

在InfluxDB上檢查預設配置下telegraf採集了哪些資料:

> show databases
> use telegraf
> show measurements
> SHOW FIELD KEYS
複製程式碼

如何進行配置

預設配置下,會啟用system分類下的INPUT外掛,即telegraf.conf有如下配置:

# Read metrics about cpu usage
# 讀取有關CPU使用情況的指標
[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics.
  collect_cpu_time = false
  ## If true, compute and report the sum of all non-idle CPU states.
  report_active = false

# Read metrics about disk usage by mount point
# 通過mount point讀取有關磁碟使用情況的指標
[[inputs.disk]]
  ## Ignore mount points by filesystem type.
  ignore_fs = ["tmpfs", "devtmpfs", "devfs"]

# Read metrics about disk IO by device
# 通過device讀取有關磁碟IO的指標
[[inputs.diskio]]

# Get kernel statistics from /proc/stat
# 通過/proc/stat獲取核心統計資訊
[[inputs.kernel]]
  # no configuration

# Read metrics about memory usage
# 讀取有關記憶體使用量的指標
[[inputs.mem]]
  # no configuration

# Get the number of processes and group them by status
# 獲取程式的數量並按狀態分組
[[inputs.processes]]
  # no configuration

# Read metrics about swap memory usage
# 讀取有關交換記憶體使用量的指標
[[inputs.swap]]
  # no configuration

# Read metrics about system load & uptime
# 讀取有關係統負載和執行時間的指標
[[inputs.system]]
  # no configuration
複製程式碼

其具體採集資料如下(其中第一級別為measurements,第二級別為欄位(省略了時間戳欄位)):

- cpu[units: percent (out of 100)]
    - usage_guest      float
    - usage_guest_nice float
    - usage_idle       float
    - usage_iowait     float
    - usage_irq        float
    - usage_nice       float
    - usage_softirq    float
    - usage_steal      float
    - usage_system     float
    - usage_user       float
- disk
    - free         integer
    - inodes_free  integer
    - inodes_total integer
    - inodes_used  integer
    - total        integer
    - used         integer
    - used_percent float
- diskio
    - io_time          integer
    - iops_in_progress integer
    - read_bytes       integer
    - read_time        integer
    - reads            integer
    - weighted_io_time integer
    - write_bytes      integer
    - write_time       integer
    - writes           integer
- kernel
    - boot_time        integer
    - context_switches integer
    - entropy_avail    integer
    - interrupts       integer
    - processes_forked integer
- mem
    - active            integer
    - available         integer
    - available_percent float
    - buffered          integer
    - cached            integer
    - free              integer
    - inactive          integer
    - slab              integer
    - total             integer
    - used              integer
    - used_percent      float
    - wired             integer
- processes
    - blocked       integer
    - dead          integer
    - idle          integer
    - paging        integer
    - running       integer
    - sleeping      integer
    - stopped       integer
    - total         integer
    - total_threads integer
    - unknown       integer
    - zombies       integer
- swap
    - free         integer
    - in           integer
    - out          integer
    - total        integer
    - used         integer
    - used_percent float
- system
    - load1         float
    - load15        float
    - load5         float
    - n_cpus        integer
    - n_users       integer
    - uptime        integer
    - uptime_format string
複製程式碼

如何查詢指標及其採集資料

telegraf主要分為輸入外掛和輸入外掛,其原始碼目錄分別對應plugins/inputsplugins/outputs,你只要參考telegraf官檔找到你所需要的外掛然後去到原始碼對應的目錄找到相應的.md檔案,按照提示獲取相關資訊進行配置即可。

啟用telegraf服務後,你會發現在influxdb中多了一個telegraf的庫,其中有多個measurement,這說明我們的資料採集已經成功了。有了資料以後,我們需要關心的是如何把資料聚合然後進行展示。下面將介紹一款視覺化套件grafana。


Grafana

Grafana是一個開源指標分析和視覺化套件,常用於視覺化基礎設施的效能資料和應用程式分析的時間序列資料。也可以應用於其他領域,包括工業感測器,家庭自動化,天氣和過程控制。但請注意,我們使用Grafana最關心的是如何把資料進行聚合後進行展示。

Grafana支援多種不同的時序資料庫資料來源,Grafana對每種資料來源提供不同的查詢方法,而且能很好的支援每種資料來源的特性。它支援下面幾種資料來源:Graphite、Elasticsearch、CloudWatch、InfluxDB、OpenTSDB、Prometheus、MySQL、Postgres、Microsoft SQL Server (MSSQL)。每種資料來源都有相應的文件,您可以將多個資料來源的資料合併到一個單獨的儀表板上,本文只舉例influxdb資料來源的應用。

下載並安裝Telegraf:

# 安裝grafana
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.1.2-1.x86_64.rpm 
# 啟動服務、新增開機啟動:
systemctl enable grafana-server
systemctl start grafana-server
# 配置
配置檔案 /etc/grafana/grafana.ini
systemd服務名 grafana-server.service
預設日誌檔案 /var/log/grafana/grafana.log
預設資料庫檔案 /var/lib/grafana/grafana.db
複製程式碼

簡單使用

啟動服務後訪問http://localhost:3000,預設埠為3000,可在配置檔案修改。預設使用者名稱和密碼為admin/admin。登入後按照提示配置資料來源:

配置資料來源1
配置資料來源2

接著建立一個dashboard:

建立皮膚1.png

我們先選擇匯入模板的方式來預覽效果,再來了解grafana/dashboard的相關配置,這裡選擇官方提供的一套Telegraf: system dashboard,地址https://grafana.com/dashboards/928。請你根據它的提示配置你的telegraf。然後在dashboards中選擇import->Upload.jsonFile,將下載的模板匯入:

匯入模板

檢視結果:

telegraf-system-dashboard

你還可以安裝一些外掛,例如安裝一款時間皮膚外掛

安裝方式是到你的/var/lib/grafana/plugins目錄下執行grafana-cli工具安裝外掛,下面安裝時間皮膚外掛:

> sudo grafana-cli plugins install grafana-clock-panel
 installing grafana-clock-panel @ 0.0.9
 from url: https://grafana.com/api/plugins/grafana-clock-panel/versions/0.0.9/download
 into: /var/lib/grafana/plugins
 
 ✔ Installed grafana-clock-panel successfully 
  
 Restart grafana after installing plugins . <service grafana-server restart>

# 重啟服務
> sudo systemctl restart grafana-server
複製程式碼

自己動手配置幾個

我們建立一個新的dashboard,Dashboard由多個Row組成,一行Row分為12列,我們可以自定義皮膚的Span寬度和高度。現在我們選擇新增一個Singlestat(如果是繪製線性表選Graph),然後點選Panel Title->Edit編輯我們的皮膚資訊,預設開啟Metrics檢視,我們修改後得到如下資訊:

upTime1

我們修改options中的單位和顏色:

upTime2

同樣的,你可以嘗試新增其他的皮膚實現下面效果:

最終效果

Grafana的功能非常豐富,在這裡不能詳細敘述,請您參考官檔瞭解更多:
http://docs.grafana.org/features/datasources/

相關文章