开始使用Cloudprober

Cloudprober是什么?

Cloudprober是Google特制的开源监控软件,用于监视系统和服务,它是用Go语言实现的。除了内置了HTTP、UDP、PING和DNS Probe之外,还可以通过外部执行程序与标准输入输出交互来定制扩展Probe功能的External Probe机制。Probe的结果可以导出到StackDriver和Prometheus。此外,在Google Cloud上还可以自动发现目标(本次不讨论)。

image.png

[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的数据源,创建图表。

image.png

顺便提一下,在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

结束

广告
将在 10 秒后关闭
bannerAds