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