将这篇文档命名为exporters,是因为其内容主要对github.com上的常用”***_exporters“做简单介绍。
依赖这些exporters可以监控运维工作中的方方面面。exporters产生监控数据,然后时序数据库比如Prometheus来存储数据,Grafana来展示数据。这一套系统已非常成熟,应用越来越广泛。exporters高度可定制,Prometheus可对数据做展示前的预处理,这些灵活的操作使得搭建一套适合自己的监控系统变得非常容易。
-
script_exporter
如果有若干的脚本要执行,这些脚本非常的重要,当发现执行失败时,要第一时间通知,那么这个exporter可以帮到你。它会收集所要监控脚本的执行结果和执行花费的时间。
创建配置文件:
scripts:
- name: success
script: sleep 5
- name: failure
script: sleep 2 && exit 1
- name: timeout
script: sleep 5
timeout: 1
配置文件定义了三个脚本,关键字name和script是必需的,timeout为可选参数,如果没有指定,默认是15s。
运行程序如果从源码直接编译而来,配置文件可以通过选项“--config.file”传入。运行程序后,浏览器访问http://localhost:9172/probe?name=success , 显示如下:
script_duration_seconds{script="success"} 5.012201
script_success{script="success"} 1
这里有两个metric,以脚本名做label,方便区分。第一个为脚本执行花费的时间(单位为秒),第二个是脚本执行的返回结果:1表示执行成功,0表示执行失败。这里需要注意的是,默认脚本是在/bin/sh中执行的,如果要使用/bin/bash,请使用选项“--config.shell”将其传入。
-
snmp_exporter
工作中经常要对服务器或交换机的端口流量进行监控,snmp_exporter利用snmp采集目标设备的监控数据,它能采集的数据有很多,在这里只关注对交换机端口流量数据的采集。
操作之前,首先要确定需walk的OID,可以查询OID数据库。和端口流量相关的OID一个为1.3.6.1.2.1.2.2.1.10,代表下行字节数(理解是否正确?),一个为1.3.6.1.2.1.2.2.1.16,代表上行字节数。端口流量表示的是一秒内通过的bit数,查看这两个OID的解释:Total number of octets received/transmitted on the interface, including framing characters。好像并不能直接拿来使用,先不用管它。
下载二进制程序,创建配置文件snmp.yml,这个文件官方建议使用generator来生成它,这里使用现成的,内容如下:
switch:
walk:
- 1.3.6.1.2.1.2.2.1.10
- 1.3.6.1.2.1.2.2.1.16
metrics:
- name: ifInOctets
oid: 1.3.6.1.2.1.2.2.1.10
type: counter
indexes:
- labelname: ifIndex
type: gauge
- name: ifOutOctets
oid: 1.3.6.1.2.1.2.2.1.16
type: counter
indexes:
- labelname: ifIndex
type: gauge
auth:
community: public
启动程序:./snmp_exporter,现在访问采集到的数据http://主机IP:/snmp?target=192.168.1.1&module=switch,显示如下:
# HELP ifInOctets
# TYPE ifInOctets counter
ifInOctets{ifIndex="1"} 0
ifInOctets{ifIndex="10"} 2.816132638e+09
ifInOctets{ifIndex="11"} 1.612220009e+09
ifInOctets{ifIndex="12"} 2.875516929e+09
...
这里有相当多的Metric,Label为ifIndex,后面的数字表示到目前为止统计到的字节数。有了这些数据计算指定端口实时流量就很容易,可参考Prometheus的配置。
生产环境中使用的查询表达式:
rate(ifInOctets{ifIndex="25",instance="10.1.16.1",job="switch"}[3m])*8 //乘以8是将单位化为bit/s
-
blackbox_exporter
依赖这个exporter可以实时监控Web服务的状态,支持http和https,它还可以采集TCP、DNS、ICMP、SMTP相关的数据。
下面是一个配置文件的样例(仅针对http prober)
blackbox.yml:
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2"]
valid_status_codes: [] # Defaults to 2xx
method: GET
headers:
Host: www.baidu.com
Accept-Language: zh-CN
no_follow_redirects: false
fail_if_not_ssl: true
fail_if_not_matches_regexp:
- "Copyright" #这里的内容是和Response的内容匹配的
tls_config:
insecure_skip_verify: false
preferred_ip_protocol: "ip4" # defaults to "ip6"
因为要测试的target使用的协议是https,所以这里加了"fail_if_not_ssl: true"。配置文件的路径通过参数“--config.file”传入。
启动程序后,访问链接http://主机IP:9115/probe?target=https://www.baidu.com&module=http_2xx,输出如下:
# HELP probe_dns_lookup_time_seconds Returns the time taken for probe dns lookup in seconds
# TYPE probe_dns_lookup_time_seconds gauge
probe_dns_lookup_time_seconds 0.079595676
# HELP probe_duration_seconds Returns how long the probe took to complete in seconds
# TYPE probe_duration_seconds gauge
probe_duration_seconds 0.128873101
# HELP probe_failed_due_to_regex Indicates if probe failed due to regex
# TYPE probe_failed_due_to_regex gauge
probe_failed_due_to_regex 0
# HELP probe_http_content_length Length of http content response
# TYPE probe_http_content_length gauge
probe_http_content_length -1
# HELP probe_http_duration_seconds Duration of http request by phase, summed over all redirects
# TYPE probe_http_duration_seconds gauge
probe_http_duration_seconds{phase="connect"} 0.002813787
probe_http_duration_seconds{phase="processing"} 0.008696127
probe_http_duration_seconds{phase="resolve"} 0.079595676
probe_http_duration_seconds{phase="tls"} 0.015958782
probe_http_duration_seconds{phase="transfer"} 0.024328814
# HELP probe_http_redirects The number of redirects
# TYPE probe_http_redirects gauge
probe_http_redirects 0
# HELP probe_http_ssl Indicates if SSL was used for the final redirect
# TYPE probe_http_ssl gauge
probe_http_ssl 1
# HELP probe_http_status_code Response HTTP status code
# TYPE probe_http_status_code gauge
probe_http_status_code 200
# HELP probe_http_version Returns the version of HTTP of the probe response
# TYPE probe_http_version gauge
probe_http_version 1.1
# HELP probe_ip_protocol Specifies whether probe ip protocol is IP4 or IP6
# TYPE probe_ip_protocol gauge
probe_ip_protocol 4
# HELP probe_ssl_earliest_cert_expiry Returns earliest SSL cert expiry in unixtime
# TYPE probe_ssl_earliest_cert_expiry gauge
probe_ssl_earliest_cert_expiry 1.554275906e+09
# HELP probe_success Displays whether or not the probe was a success
# TYPE probe_success gauge
probe_success 1
输出的内容非常丰富,响应内容是否符合预期告诉你,而且将HTTP连接的各个阶段耗时清晰的显示出来,TLS的话,将证书的过期时间也一并返回给你。
probe_ssl_earliest_cert_expiry 1.554275906e+09,这是unix timestamp转换成可读时间是: 2019年4月3日星期三下午3点18分。
这里注意URL参数部分如果target的值没有写协议的话,默认是http。
-
node_exporter
它是github上得星最多的exporter,确实实至名归。node_exporter可以采集的服务器信息非常多,你能想到的,差不多它都给你准备好了。
因为要收集主机系统的信息,官方建议采用非容器的方式部署。实验测试,为方便起见,使用了容器部署的方式,生产环境灵活变动。
采用容器方式部署时,可以参考下面的docker-compose.yml:
version: '3'
services:
blackbox_exporter:
image: prom/node-exporter:latest
command: ["--path.rootfs","/host","--no-collector.bcache","--no-collector.edac","--no-collector.entropy","--no-collector.infiniband","--no-collector.ipvs","--no-collector.hwmon","--no-collector.mdadm","--no-collector.textfile","--no-collector.timex","--no-collector.xfs","--no-collector.zfs"]
volumes:
- '/:/host:ro,rslave'
ports:
- '9100:9100/tcp'
network_mode: "host"
pid: "host"
根据运行主机的实际情况,禁用或使能相应的Collector(Collector具体功能介绍参看官方文档)。
启动容器后,访问链接http://主机IP:9100/metrics,可以看到非常多的Metric。这里对比较常用的Collector做简要分析。
- conntrack:重要的metric为“node_nf_conntrack_entries”,值为“/proc/sys/net/netfilter/nf_conntrack_count”
- cpu:数据来源为“/proc/stat”
- diskstats:数据来源为“/proc/diskstats”
- filesystem:通过“/proc/1/mounts”得到系统已挂载文件系统的详情,然后依赖包syscall中的函数Statfs得到文件系统的使用情况
- meminfo:数据来源为“/proc/meminfo”
- netdev:数据来源为“/proc/net/dev”
网友评论