Ping Exporter

在使用 Prometheus 的过程中,我们经常有需要 Ping 某个地址或者域名,并且监控 Ping 结果的来确定稳定性和延迟,这个时候我们可以使用 Ping Exporter 来实现,官方网址 https://github.com/czerwonk/ping_exporterPing Exporter 的发行遵循 MIT License。

安装

下载二进制部署包

wget https://github.com/czerwonk/ping_exporter/releases/download/0.4.7/ping_exporter_0.4.7_linux_amd64.tar.gz

解压后执行 Ping Exporter 的二进制文件我们可以得到帮助信息

usage: ping_exporter [<flags>] [<targets>...]

Flags:
  --help                         Show context-sensitive help (also try --help-long and --help-man).
  --version                      Print version information
  --web.listen-address=":9427"   Address on which to expose metrics and web interface
  --web.telemetry-path="/metrics"
                                 Path under which to expose metrics
  --config.path=""               Path to config file
  --ping.interval=5s             Interval for ICMP echo requests
  --ping.timeout=4s              Timeout for ICMP echo request
  --ping.size=56                 Payload size for ICMP echo requests
  --ping.history-size=10         Number of results to remember per target
  --dns.refresh=1m               Interval for refreshing DNS records and updating targets accordingly (0 if
                                 disabled)
  --dns.nameserver=""            DNS server used to resolve hostname of targets
  --log.level="info"             Only log messages with the given severity or above. Valid levels: [debug, info,
                                 warn, error, fatal]
  --metrics.deprecated="enable"  Enable or disable deprecated metrics
                                 (`ping_rtt_ms{type=best|worst|mean|std_dev}`). Valid choices: [enable, disable]
  --metrics.rttunit="ms"         Export ping results as either millis (default), or seconds (best practice), or
                                 both (for migrations). Valid choices: [ms, s, both]

Args:
  [<targets>]  A list of targets to ping

从帮助信息来看,我们需要一个配置文件来指定要 Ping 的列表。另外常规的监听端口、 Metric 数据导出路径、日志输出级别都可以自定义。与 Ping 相关的时间间隔、超时时间、Ping 包大小、DNS 刷新时间等也可以自行设置,这些参数既可以在启动的时候 通过参数来设置,也可以在配置文件中进行设置。

我们来先准备一个配置文件:ping.yml 。其中 targets 下是我们要 Ping 的 IP 地址,V4 或者 V6 协议,也可以是域名。

targets:
  - 8.8.8.8
  - 8.8.4.4
  - 2001:4860:4860::8888
  - 2001:4860:4860::8844
  - baidu.com

dns:
  refresh: 2m15s
  nameserver: 1.1.1.1

ping:
  interval: 2s
  timeout: 3s
  history-size: 42
  payload-size: 120

官方提供了一个 ping-exporter.service 文件来控制 Ping Exporter 的启停。

[Unit]
Description=Ping Exporter
After=network.target

[Service]
User=ping_exporter
ExecStart=/usr/local/bin/ping_exporter --config.path=/etc/ping_exporter/config.yml --web.listen-address=":9427"
NoNewPrivileges=yes
CapabilityBoundingSet=CAP_NET_RAW
AmbientCapabilities=CAP_NET_RAW
PrivateDevices=true
PrivateTmp=yes
ProtectControlGroups=true
ProtectKernelModules=yes
ProtectKernelTunables=true
ProtectSystem=strict
ProtectClock=true
ProtectHostname=true
ProtectHome=true
DevicePolicy=closed
RestrictNamespaces=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
MemoryDenyWriteExecute=yes
LockPersonality=yes

[Install]
WantedBy=default.target

如果我们使用 Docker 镜像来启动 Ping Exporter 的话,启动命令如下:

docker run -p 9427:9427 -v /path/to/config/directory:/config:ro --name ping_exporter czerwonk/ping_exporter

指标

Ping Exporter 运行后输出的结果如下:

# HELP ping_loss_percent Packet loss in percent
# TYPE ping_loss_percent gauge
ping_loss_percent{ip="2001:4860:4860::8844",ip_version="6",target="2001:4860:4860::8844"} 1
ping_loss_percent{ip="2001:4860:4860::8888",ip_version="6",target="2001:4860:4860::8888"} 1
ping_loss_percent{ip="220.181.38.148",ip_version="4",target="baidu.com"} 0
ping_loss_percent{ip="39.156.69.79",ip_version="4",target="baidu.com"} 0
ping_loss_percent{ip="8.8.4.4",ip_version="4",target="8.8.4.4"} 0
ping_loss_percent{ip="8.8.8.8",ip_version="4",target="8.8.8.8"} 0.1
# HELP ping_rtt_best_seconds_ms Best round trip time in millis (deprecated)
# TYPE ping_rtt_best_seconds_ms gauge
ping_rtt_best_seconds_ms{ip="220.181.38.148",ip_version="4",target="baidu.com"} 1.9935760498046875
ping_rtt_best_seconds_ms{ip="39.156.69.79",ip_version="4",target="baidu.com"} 4.307188034057617
ping_rtt_best_seconds_ms{ip="8.8.4.4",ip_version="4",target="8.8.4.4"} 40.30187225341797
ping_rtt_best_seconds_ms{ip="8.8.8.8",ip_version="4",target="8.8.8.8"} 44.01082229614258
# HELP ping_rtt_mean_seconds_ms Mean round trip time in millis (deprecated)
# TYPE ping_rtt_mean_seconds_ms gauge
ping_rtt_mean_seconds_ms{ip="220.181.38.148",ip_version="4",target="baidu.com"} 2.045837640762329
ping_rtt_mean_seconds_ms{ip="39.156.69.79",ip_version="4",target="baidu.com"} 4.4511942863464355
ping_rtt_mean_seconds_ms{ip="8.8.4.4",ip_version="4",target="8.8.4.4"} 40.4238166809082
ping_rtt_mean_seconds_ms{ip="8.8.8.8",ip_version="4",target="8.8.8.8"} 44.22184753417969
# HELP ping_rtt_seconds_ms Round trip time in millis (deprecated)
# TYPE ping_rtt_seconds_ms gauge
ping_rtt_seconds_ms{ip="220.181.38.148",ip_version="4",target="baidu.com",type="best"} 1.9935760498046875
ping_rtt_seconds_ms{ip="220.181.38.148",ip_version="4",target="baidu.com",type="mean"} 2.045837640762329
ping_rtt_seconds_ms{ip="220.181.38.148",ip_version="4",target="baidu.com",type="std_dev"} 0.04358862712979317
ping_rtt_seconds_ms{ip="220.181.38.148",ip_version="4",target="baidu.com",type="worst"} 2.149885892868042
ping_rtt_seconds_ms{ip="39.156.69.79",ip_version="4",target="baidu.com",type="best"} 4.307188034057617
ping_rtt_seconds_ms{ip="39.156.69.79",ip_version="4",target="baidu.com",type="mean"} 4.4511942863464355
ping_rtt_seconds_ms{ip="39.156.69.79",ip_version="4",target="baidu.com",type="std_dev"} 0.24366436898708344
ping_rtt_seconds_ms{ip="39.156.69.79",ip_version="4",target="baidu.com",type="worst"} 5.212696075439453
ping_rtt_seconds_ms{ip="8.8.4.4",ip_version="4",target="8.8.4.4",type="best"} 40.30187225341797
ping_rtt_seconds_ms{ip="8.8.4.4",ip_version="4",target="8.8.4.4",type="mean"} 40.4238166809082
ping_rtt_seconds_ms{ip="8.8.4.4",ip_version="4",target="8.8.4.4",type="std_dev"} 0.12417548894882202
ping_rtt_seconds_ms{ip="8.8.4.4",ip_version="4",target="8.8.4.4",type="worst"} 40.71577835083008
ping_rtt_seconds_ms{ip="8.8.8.8",ip_version="4",target="8.8.8.8",type="best"} 44.01082229614258
ping_rtt_seconds_ms{ip="8.8.8.8",ip_version="4",target="8.8.8.8",type="mean"} 44.22184753417969
ping_rtt_seconds_ms{ip="8.8.8.8",ip_version="4",target="8.8.8.8",type="std_dev"} 0.14494535326957703
ping_rtt_seconds_ms{ip="8.8.8.8",ip_version="4",target="8.8.8.8",type="worst"} 44.4484977722168
# HELP ping_rtt_std_deviation_seconds_ms Standard deviation in millis (deprecated)
# TYPE ping_rtt_std_deviation_seconds_ms gauge
ping_rtt_std_deviation_seconds_ms{ip="220.181.38.148",ip_version="4",target="baidu.com"} 0.04358862712979317
ping_rtt_std_deviation_seconds_ms{ip="39.156.69.79",ip_version="4",target="baidu.com"} 0.24366436898708344
ping_rtt_std_deviation_seconds_ms{ip="8.8.4.4",ip_version="4",target="8.8.4.4"} 0.12417548894882202
ping_rtt_std_deviation_seconds_ms{ip="8.8.8.8",ip_version="4",target="8.8.8.8"} 0.14494535326957703
# HELP ping_rtt_worst_seconds_ms Worst round trip time in millis (deprecated)
# TYPE ping_rtt_worst_seconds_ms gauge
ping_rtt_worst_seconds_ms{ip="220.181.38.148",ip_version="4",target="baidu.com"} 2.149885892868042
ping_rtt_worst_seconds_ms{ip="39.156.69.79",ip_version="4",target="baidu.com"} 5.212696075439453
ping_rtt_worst_seconds_ms{ip="8.8.4.4",ip_version="4",target="8.8.4.4"} 40.71577835083008
ping_rtt_worst_seconds_ms{ip="8.8.8.8",ip_version="4",target="8.8.8.8"} 44.4484977722168
# HELP ping_up ping_exporter version
# TYPE ping_up gauge
ping_up{version="0.4.7"} 1

来对结果进行一下解读 ping_up 这个指标提供了 2 个信息,一个是当前 Ping Exporter 的版本信息,一个是当前的状态,值为 1 的时候是启动状态,值为 0 的时候是停止状态。

ping_loss_percent 这个提供了丢包率, ping_rtt_best_seconds_ms 最好的响应时间(millis) ping_rtt_mean_seconds_ms 平均响应时间(毫秒)(已弃用) ping_rtt_seconds_ms 响应时间(毫秒)(已弃用) ping_rtt_std_deviation_seconds_ms 以毫秒为单位的标准偏差(已弃用) ping_rtt_worst_seconds_ms 最差的响应时间(已弃用)

ping_rtt_seconds_ms 这个 Metric 里 已经用 label 对最好响应时间、最差响应时间、标准差进行了区分。

作者对好多指标标注了 deprecated 已弃用,但是也都还在,还没有到弃用的时间节点,可能后边几个版本就去掉了,个人感觉 ping_rtt_seconds_ms 和其他的几个指标有重复的情况,在使用的时候可以酌情选取。

小结

使用单个 Ping Exporter 其实效果有限,实际使用场景中,可以在每个机房或者数据中心部署一个,将多个的结果进行收集就可以形成一个简单的 Ping 检查的网络,如果能够结合配置自动发现,那效果会更好。

results matching ""

    No results matching ""