Docker監控方案(TIG)的研究與實踐之Telegraf

前言

Docker因爲使用了基於namespace和cgroup的技術,所以監控docker容器和監控宿主機在某些性能指標和方式上有一些區別,而傳統的監控方式可能沒法知足docker容器內部的指標監控,本篇系列文章主要分享使用telegraf+influxdb+grafana去監控docker容器內部資源使用狀況。目前主要關注的監控指標爲:每一個宿主機上的docker容器數量,每一個docker容器的內存使用狀況,CPU使用狀況,網絡使用狀況以及磁盤使用狀況。同時這套方案也可以監控到宿主機的一些基本資源使用狀況。node

Telegraf簡介與實踐

簡介:mysql

由influxdata公司開發的用於採集系統數據的服務,用純go編寫,經過插件化方式進行採集各類服務(system,docker,redis,nginx,kafka等)監控指標而且上報給相應的中間件,好比influxdb,opentsdb(商城docker監控使用這個)。Telegraf也是整個TICK(telegraf+influxdb+chronograf+kapacitor)生態棧的第一塊組件也是最重要的組件。linux

特色:nginx

純go編寫,不須要依賴其餘組件;消耗相關係統資源比較小;plugins支持多種輸入輸出插件(採集和上報); 
相關鏈接:git

github:https://github.com/influxdata/telegraf
官網文檔:https://docs.influxdata.com/telegraf/v1.0/
TICK生態棧:https://www.influxdata.com/downloads/#telegrafgithub

安裝:redis

全部的安裝以及部署都是在linux下的,因此不知道linux下安裝基礎軟件包的,請自覺繞路! 
Centos系列能夠配置yum源或者直接下載包,並安裝。我的建議直接下載包,因爲不須要其餘系統依賴,能夠直接在集羣環境進行共享。 
wgethttps://dl.influxdata.com/telegraf/releases/telegraf-1.0.0.x86_64.rpm && rpm -ivh telegraf-1.0.0.x86_64.rpm 
其餘環境安裝指南:sql

Ubuntu && Debin: 
ubuntu repo: 
curl -sLhttps://repos.influxdata.com/influxdb.key | sudo apt-key add - 
source /etc/lsb-release 
echo 「deb https://repos.influxdata.com/{DISTRIB_CODENAME} stable」 | sudo tee /etc/apt/sources.list.d/influxdb.list 
Debin repo: 
curl -sLhttps://repos.influxdata.com/influxdb.key | sudo apt-key add - 
source /etc/os-release 
test $VERSION_ID = 「7」 && echo 「debhttps://repos.influxdata.com/debianwheezy stable」 | sudo tee /etc/apt/sources.list.d/influxdb.list 
test $VERSION_ID = 「8」 && echo 「debhttps://repos.influxdata.com/debian jessie stable」 | sudo tee /etc/apt/sources.list.d/influxdb.list 
配置完ubuntu系列的repo以後,就能夠執行sudo apt-get update && sudo apt-get install telegraf進行安裝了 
直接下載deb包方式: 
wgethttps://dl.influxdata.com/telegraf/releases/telegraf_1.0.0_amd64.deb&& sudo dpkg -i telegraf_1.0.0_amd64.debdocker

啓動:ubuntu

telegraf能夠支持多種服務管理方式,安裝以後默承認用使用service和systemd進行管理,所以在centos6-7中均可以使用系統自帶的服務管理進行維護(init.d和systemctl)

/etc/init.d/telegraf start 或者systemctl restart telegraf

配置:

配置能夠說是telegraf運用中最核心的一個環節,由於配置的細節決定你採集數據的指標。telegraf的配置能夠說是比較變幻無窮,由於能夠支持多種輸出、輸入組件,而且每種組件的配置支持不通的過濾規則,可以讓配置管理和維護者正確的採集本身須要的信息。 
默認配置文件存放路徑:/etc/telegraf/telegraf.conf ,額外配置路徑/etc/telegraf/telegraf.d/。 
在生產環境中建議自定生成配置並存放在/etc/telegraf/telegraf.d/中。 
自定義生成配置文件:

#telegraf -sample-config > telegraf.conf 這樣生成的配置文件將包含每個插件,可是大部分會被註釋掉,能夠根據實際的業務場景進行定義

配置文件示例以及詳細講解:

#cat telegraf.conf
########################################全局配置############################################################
#全局tag配置,採用key = "values"方式,這樣在本機採集到的全部數據將都有這個標籤
[global_tags]
dc = "docker-test"
#agent配置
[agent]
#默認的數據(input)採集間隔時間
interval = "10s"
#採用輪詢時間間隔。默認是使用interval裏面的值進行輪詢,好比interval = "10s",那採集時間將是:00, :10, :20, 等
round_interval = true
#每次發送到output的度量大小不能超過metric_batch_size的值
metric_batch_size = 1000
#telegraf會爲每個output去緩存一份度量值,metric_buffer_limit爲緩存的限制,而且刷新buffer以肯定成功寫入。若是達到這個限制了,老的數據會被第一時間丟棄
#固然了,增長這個值可以容忍更多的數據鏈接,可是這也將會增長telegraf潛在的內存佔用。這個值能夠大於metric_batch_size可是必須小於它的兩倍
metric_buffer_limit = 10000
#經過隨機度量來對採集時間進行抖動。每一個插件在採集數據以前將會有一個隨機時間的休眠,可是這個時間應小於collection_jitter
#這個設置是爲了防止多個採集源數據同一時間都在隊列
collection_jitter = "0s"
#默認全部數據flush到outputs的時間(在數據被flush到output以前,最大能到flush_interval + flush_jitter)。不能低於interval
flush_interval = "10s"
# 經過隨機數來對flush間隔進行抖動。這個主要是爲了不當運行一個大的telegraf實例的時候有比較大的寫入。(jitter=5s,flush_interval=10s意味着每10-15s會發生一次flush操做)
flush_jitter = "0s"
#默認這個值被設置相同的時間戳經過採集間隔排序。最大值爲1s。這個指標通常不會用在service input(好比logparser和statsd)。單位(ns,us,ms,s)
precision = ""
#以debug模式運行
debug = false
#以安靜模式運行
quiet = false
#這個將會覆蓋默認的hostname,若是爲空的話,將會採用os.Hostname()
hostname = ""
#若是設置爲true,就不容許在telegraf agent裏面設置"host"標籤了 
omit_hostname = false
##############################################度量值過濾#######################################################
#過濾能夠被配置在每個輸入和輸出值
namepass:一個數組字符串能夠被用來過濾由當前input生成的度量值,在數組中的每個字符串和全局匹配到的測量值名字進行對比,若是匹配了,值被採用
namedrop:pass的反向含義,若是匹配,則不使用
fieldpass:在namepass知足的條件下,output的fieldpass不可用
fielddrop:pass的反向含義,若是field名字匹配,將不被採用。output的fielddrop不可用
tagpass:tag names和數組中的字符串都被用來過濾當前input的值,數組中的每個每個字符串和tag name對比,匹配則則採用
tagdrop:tagpass的反向含義,若是tag匹配,該度量值不被採用
tagexclude:被用來從度量值(measurements)中執行一個tag。做爲tagdrop的對立面,它將丟棄全部依賴於tag的相關度量值,tagexclude只是單純的從度量值中給tag一個key
這個能夠被用做input和output中,可是強烈建議用在input中,他會在同一個採集時間點更加有效的過濾out tags
taginclude:tagexclude的反向含義。在最終的度量值中,也將包含tag keys
注意:tagpass和tagdrop參數必須等一在plugin函數的底部,否則對應的子plugin配置可能被tagpass/tagdrop映射中的內容截斷
#################################################(OUTPUT)輸出配置##############################################
#輸出插件,咱們使用的是influxdb,得先進行安裝配置
[[outputs.influxdb]]
## The full HTTP or UDP endpoint URL for your InfluxDB instance.
#若是有多個urls,能夠指定爲相同集羣的一部分。意味着urls中的一個將被寫到每個間隔
# urls = ["udp://localhost:8089"] # UDP endpoint example
urls = ["http://172.25.46.7:8086"] # required
#默認須要鏈接的telegraf庫,沒有則本身建立
database = "telegraf" # required
precision = "s"
#修改保留策略
retention_policy = ""
#持續寫入,僅支持集羣模式, can be: "any", "one", "quorum", "all"
write_consistency = "any"
#做爲influxdb客戶端,設置寫超時時間,若是爲空默認爲5s超時,0s表示不設置超時時間(不建議)
timeout = "5s"
#設置telegraf的庫的用戶名和密碼
# username = "telegraf"
# password = "metricsmetricsmetricsmetrics"
###############################################(INPUT)輸入配置###################################################
inputs插件全局參數:
#每個input均可以配置的全局配置項
#name_override:覆蓋默認的度量值名字(默認是input的名字)
#name_prefix:指定一個前綴並附加到度量值的名字(measuerments name)
#name_suffix:指定後綴
#tags:一個標籤映射到指定的input度量值
#interval:多久採集一次數據,默承認用使用全局配置中的參數
配置示例:
[[inputs.cpu]]
#採集每一個cpu的指標
percpu = true
#採集總的cpu指標
totalcpu = true
#會丟棄掉time開頭的。若是想要採集原始的cpu相關指標,請註釋
fielddrop = ["time_*"]
[[inputs.disk]]
#默認的telegraf將手機全部掛載點的信息
#下面這個參數能夠指定掛載點
mount_points = ["/"]
#僅存儲磁盤inode相關的度量值
fieldpass = ["inodes*"]
#經過文件系統類型來忽略一些掛載點,好比tmpfs
ignore_fs = ["tmpfs", "devtmpfs"]
#僅存儲tagpass相關的信息
[inputs.disk.tagpass]
fstype = [ "ext4", "xfs" ]
path = [ "/export", "/home*" ]
#默認telegraf將採集全部存儲設備的信息,devices參數能夠指定
# devices = ["sda", "sdb"]
#若是須要磁盤的串行號能夠將下面註釋打開
# skip_serial_number = false
[[inputs.mem]]
#採集docker和redis的插件
[[inputs.docker]]
#指定docker啓動的api接口,並指定須要採集那些容器指標
endpoint = "tcp://10.0.0.2:5256"
container_names = []
[[inputs.redis]]
#指定redis的相關接口
servers = ["tcp://10.0.0.1:6379"]

測試插件是否正常工做:

使用如下命令會將telegraf採集的數據默認輸出到終端,依次來檢驗配置的監控項是不是本身所指望的指標。

#telegraf -config /etc/telegraf/telegraf.conf -input-filter docker -test           會輸出docker相關的監控信息說明配置正確(固然也能夠去測試其餘inputs plugins)

注意:上面的配置文件中使用的output plugins是influxdb,所以在沒有成功配置influxdb的前提下,此配置文件是不能正常讓telegraf正常啓動的!下一節將會講到influxdb的相關知識influxdb相關:

重啓服務:

centos6.x:
#/etc/init.d/telegraf restart (service telegraf restart )
centos7.x:
#systemctl restart telegraf

此時,能夠查看相關日誌,確保telegraf正常啓動,啓動以後去influxdb就能夠查詢相關採集到的數據。

附:

telegraf經常使用的input plugins:

收集docker相關的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/docker主要是經過docker API調用相關監控 
收集相關redis的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/redis
收集相關mesos的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/mesos
收集相關nginx的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/nginx
收集相關mysql的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/mysql
收集ping相關信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/ping
收集influxdb相關信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/influxdb
收集系統相關的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/system
收集haproxy相關信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/haproxy
收集cgroup相關信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cgroup

核心plugins 監控指標的採集原理(system,docker)

  • system plugin:主要監控項包含CPU,DISK,KERNEL,KERNEL_VMSTAT,NETSTAT,PROCESS,SYSTEM

    CPU中有兩個參數,分別爲totalcpu和percpu,若是爲true經分別採集相關cpu的指標。主要指標有:user,nice,system,idle,iowait,cpu_usage等 
    DISK:主要指標有free,total;used(單位字節);uesd_percent;inode_free;inode_total;inode_used.須要注意的是,used_percent指標經過使用used/(used+free)計算得出。 
    MEM:主要指標total;available(/proc/meminfo原生值);available_percent(available / total * 100);used_percent(used / total * 100) 
    NET:經過lsof採集tcp鏈接狀態和udp相關信息。指標:established syn_sent syn_recv fin_wait1 time_wait close listen closing 
    PROCESS:收集進程總數個狀態組(zombie,sleeping,running),也是經過採集/proc中的數據 
    SYSTEM:系統負載,load1;load15;load5

  • docker plugin:主要監控項包括ocker_container_mem,docker_container_cpu,docker_container_net,docker_container_nlkio,docker_,docker_data,docker_metadata。基本上是經過docker api進行採集docker容器相關的監控指標的(https://docs.docker.com/engine/reference/api/docker_remote_api_v1.25/#/inspect-a-container) 
    具體的監控項能夠在源碼中進行查看:(https://github.com/influxdata/telegraf/blob/master/plugins/inputs/docker/docker.go)

  • 幾個主要關心的指標:

docker_memory:


docker_cpu:


docker_net:


docker相關:

注意:原創著做,轉載請聯繫做者!

相關文章
相關標籤/搜索