1. 程式人生 > 其它 >Docker監控方案(TIG)的研究與實踐之Telegraf

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

前言

Docker由於使用了基於namespace和cgroup的技術,因此監控docker容器和監控宿主機在某些效能指標和方式上有一些區別,而傳統的監控方式可能無法滿足docker容器內部的指標監控,本篇系列文章主要分享使用telegraf+influxdb+grafana去監控docker容器內部資源使用情況。目前主要關注的監控指標為:每個宿主機上的docker容器數量,每個docker容器的記憶體使用情況,CPU使用情況,網路使用情況以及磁碟使用情況。同時這套方案也能夠監控到宿主機的一些基本資源使用情況。

Telegraf簡介與實踐

簡介:

由influxdata公司開發的用於採集系統資料的服務,用純go編寫,通過外掛化方式進行採集各種服務(system,docker,redis,nginx,kafka等)監控指標並且上報給相應的中介軟體,比如influxdb,opentsdb(商城docker監控使用這個)。Telegraf也是整個TICK(telegraf+influxdb+chronograf+kapacitor)生態棧的第一塊元件也是最重要的元件。

特點:

純go編寫,不需要依賴其他元件;消耗相關係統資源比較小;plugins支援多種輸入輸出外掛(採集和上報);  相關連線:

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

安裝:

所有的安裝以及部署都是在linux下的,所以不知道linux下安裝基礎軟體包的,請自覺繞路! Centos系列可以配置yum源或者直接下載包,並安裝。個人建議直接下載包,由於不需要其他系統依賴,可以直接在叢集環境進行共享。  wget

https://dl.influxdata.com/telegraf/releases/telegraf-1.0.0.x86_64.rpm && rpm -ivh telegraf-1.0.0.x86_64.rpm  其他環境安裝指南:

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 -sL

https://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.deb

啟動:

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相關: