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相关:
注意:原创著做,转载请联系做者!