开始使用Cloudprober
Cloudprober是什么?
Cloudprober是Google特制的开源监控软件,用于监视系统和服务,它是用Go语言实现的。除了内置了HTTP、UDP、PING和DNS Probe之外,还可以通过外部执行程序与标准输入输出交互来定制扩展Probe功能的External Probe机制。Probe的结果可以导出到StackDriver和Prometheus。此外,在Google Cloud上还可以自动发现目标(本次不讨论)。
[Google开源博客] Cloudprober:开源的黑盒监控软件
https://opensource.googleblog.com/2018/03/cloudprober-open-source-black-box.html
cloudprober.org
https://cloudprober.org/
Github
https://github.com/google/cloudprober/
前提 tí) –
条件
本文中使用了以下环境。
-
- Ubuntu 16.04.3
-
- Cloudprober 0.9.3
-
- Prometheus 2.3.1
- Grafana 5.2.1
Cloudprober 的安装步骤
Cloudprober是用Go语言实现的,只需一个二进制文件即可运行。针对每个平台都有相应的二进制文件可供使用,因此可以快速地使用它。
$ wget https://github.com/google/cloudprober/releases/download/0.9.3/cloudprober-0.9.3-linux-x86_64.zip
$ unzip cloudprober-0.9.3-linux-x86_64.zip
HTTP探测
首先,我们尝试使用HTTP Probe。
我们准备了一个专门用于HTTP Probe的配置文件。
probe {
name: "ping-probe-to-google"
type: HTTP
targets {
host_names: "www.google.com"
}
}
移至展开了Cloudprober二进制文件的目录,并运行Cloudprober。
$ ./cloudprober -config_file cloudprober.cfg
然后,它会开始定期获取数据。
前四行的数据似乎是无论设置如何都会默认获取的数据。
最后一行是通过HTTP探测获取的数据。
cloudprober 1531202334854079988 1531202344 labels=ptype=sysvars,probe=sysvars hostname="vagrant"
cloudprober 1531202334854079989 1531202344 labels=ptype=sysvars,probe=sysvars cpu_usage_msec=163.139
cloudprober 1531202334854079990 1531202344 labels=ptype=sysvars,probe=sysvars uptime_msec=10002.874 uptime=10 gc_time_msec=0 mallocs=11847 frees=567
cloudprober 1531202334854079991 1531202344 labels=ptype=sysvars,probe=sysvars goroutines=15 mem_stats_sys_bytes=3903488
cloudprober 1531202334854079992 1531202344 labels=ptype=http,probe=http-probe-to-google,dst=www.google.com total=1 success=1 latency=216295.213 timeouts=0 resp-code=map:code,200:1 resp-body=map:resp
...
运行Cloudprober时,同时会在后台运行Prometheus Exporter。当从浏览器访问http://<Cloudprobe正在运行的服务器的IP>:9313/metrics,将得到以下类似的结果。省略与HTTP Probe无关的项目。
#TYPE hostname gauge
...
#TYPE total counter
total{ptype="http",probe="http-probe-to-google",dst="www.google.com"} 1 1531202344854
#TYPE success counter
success{ptype="http",probe="http-probe-to-google",dst="www.google.com"} 1 1531202344854
#TYPE latency counter
latency{ptype="http",probe="http-probe-to-google",dst="www.google.com"} 216295.213 1531202344854
#TYPE timeouts counter
timeouts{ptype="http",probe="http-probe-to-google",dst="www.google.com"} 0 1531202344854
#TYPE resp_code counter
resp_code{ptype="http",probe="http-probe-to-google",dst="www.google.com",code="200"} 1 1531202344854
PING探测
PING探针有两种类型:一种需要Root权限,限制在需要原始套接字发送和接收的情况下;另一种不需要Root权限,限制在ICMP回显上。这两种类型使用数据报套接字运行。
我們將準備一個用於在ICMP Datagram Socket上執行的HTTP探測的設定文件。
probe {
type: PING
name: "ping-probe-to-google"
targets {
host_names: "www.google.com"
}
ping_probe {
use_datagram_socket: true
source_interface: "eth0"
}
}
ICMP数据报套接字在许多系统上默认是禁用的,因此需要设置内核参数如下所示。
$ sudo sysctl -w net.ipv4.ping_group_range="0 5000"
运行Cloudprober时,如下所示。省略了与PING探测无关的项目。
$ ./cloudprober -config_file ping_probe.cfg
...
cloudprober 1531207071003333543 1531207081 labels=ptype=ping,probe=ping-probe-to-google,dst=www.google.com total=10 success=10 latency=1513849.826
...
中文:域名解析探测
我会准备一个供DNS Probe使用的设置文件。
probe {
type: DNS
name: "dns-probe-to-google"
targets {
host_names: "8.8.8.8,8.8.4.4"
}
dns_probe {
resolved_domain: "www.google.com."
}
}
执行Cloudprober将产生以下结果。此处省略与DNS探针无关的项目。
$ ./cloudprober -config_file dns_prove.cfg
...
cloudprober 1531207394187566637 1531207404 labels=ptype=dns,probe=dns-probe-to-google,dst=8.8.8.8 total=4 success=4 latency=142839.218 timeouts=0
cloudprober 1531207394187566638 1531207404 labels=ptype=dns,probe=dns-probe-to-google,dst=8.8.4.4 total=4 success=4 latency=164540.74 timeouts=0
与 Prometheus 和 Grafana 的整合合作
最后,我们将解释与Prometheus和Grafana的整合。
作为一个相似的例子,我们在同一个目标(www.google.com)上执行PING探测和HTTP探测。当用户感觉到响应很慢时,我们可以区分是网络问题还是服务问题。由于我们正在酒店的WIFI环境中尝试,恰好遇到了延迟的问题。
最初短暫地對於如何設定多個探測器感到困惑,但只需要在一個設定文件中簡單地寫入多個設定即可。
probe {
name: "http-probe-to-google"
type: HTTP
targets {
host_names: "www.google.com"
}
}
probe {
type: PING
name: "ping-probe-to-google"
targets {
host_names: "www.google.com"
}
ping_probe {
use_datagram_socket: true
source_interface: "eth0"
}
}
由于Cloudprober作为Prometheus Exporter运行,因此Prometheus的配置如下所示。假设Prometheus和Cloudprober在同一台服务器上运行。
scrape_configs:
- job_name: 'cloudprober'
scrape_interval: 10s
static_configs:
- targets: ['localhost:9313']
然后,将Prometheus指定为Grafana的数据源,创建图表。
顺便提一下,在Grafana上配置的用于创建图表的查询分别如下。
尝试检测连通性
rate(latency{probe="ping-probe-to-google"}[20s])/rate(total{probe="ping-probe-to-google"}[20s])
HTTP探针
rate(latency{probe="http-probe-to-google"}[20s])/rate(total{probe="http-probe-to-google"}[20s])
故障排除
如果在运行时添加-logtostderr标志,它将会将日志输出到标准错误。
$ ./cloudprober -config_file pg_probe.cfg -logtostderr
举个例子,由于最初没有指定source_interface,PING Probe无法正常工作。在那个时候,当我给它加上-logtostderr标记时,会输出以下日志,这样我就意识到了配置错误。
W0709 13:57:39.626037 1731 logger.go:181] write udp 127.0.1.1:10->172.217.8.4:0: sendto: invalid argument
结束