Telegraf的合成监控

导航至

收集系统软件数据主要有两种模式:第一种是从应用程序内部收集数据,通常称为白盒监控;第二种是从外部查询系统并收集响应数据。

谷歌的SRE书籍将白盒监控定义为“基于系统内部公开的指标进行监控”,将黑盒监控定义为“测试用户可以看到的外部可见行为”。合成监控是黑盒监控系统的实现,涉及创建模拟用户活动的请求。

合成监控的目标是揭示用户可能遇到的问题,例如网站无法访问。由于它代表了真实的用户痛点,因此这些数据作为调用信号的警报信号特别有用。

这补充了白盒方法,允许开发人员和运维人员了解系统的内部工作原理,为用户可能看不到的问题提供见解,例如导致成功重试的失败,并为调试提供宝贵的信息。

Telegraf可以使用特定于应用程序的插件(如NGINX或MySQL插件)收集许多白盒指标,您可以使用InfluxDB客户端库对应用程序进行测量,但我们也可以将Telegraf用作合成监控工具,从外部监控系统状态。

HTTP响应输入插件

Telegraf的http_response 输入插件通过轮询自定义请求的端点来检查HTTP和HTTPS连接的状态,并记录关于结果的信息。该插件的配置允许您指定要查询的URL列表,定义请求方法,并发送自定义请求正文或头信息以模拟外部用户和系统可能执行的操作。它还允许您通过使用正则表达式验证这些请求的响应是否与预定义的字符串匹配来验证这些端点的行为。这些选项为我们提供了很大的灵活性,关于如何监控我们的应用程序。

对于每个被轮询的目标服务器,插件将向InfluxDB发送一个带有服务器(目标URL)、请求方法、状态码和结果的标签的测量值,以及包含关于响应时间、响应字符串是否匹配、HTTP响应代码以及名为结果代码的数值表示的字段。

我们可以在Telegraf配置中为每个要监控的端点创建一个新的块。Telegraf将在每个收集间隔期间为每个配置块收集数据一次。

监控influxdata.com

让我们看看一个简单的例子:我们将创建一个简单的合成监控检查,它会告诉我们influxdata.com是否正常运行。由于我们希望这些监控检查来自系统外部,我们需要为运行Telegraf设置某种独立的基础设施,与我们的其他系统分开。这可能意味着在AWS的不同可用区中运行,或者使用完全不同的云提供商。由于我实际上不需要为这个例子创建长期的基础设施,我将配置Telegraf在我的Mac上运行,它是influxdata.com基础设施之外的外部设备。

我已经使用Homebrew安装了Telegraf,所以下一步将是为我们的http_response设置创建一个新的配置文件。下面是inputs.http_response块的一个示例片段

# HTTP/HTTPS request given an address a method and a timeout
[[inputs.http_response]]
  ## List of urls to query.
  urls = ["https://influxdb.org.cn"]

[...]

  ## Optional substring or regex match in body of the response (case sensitive)
  response_string_match = "InfluxDB is the open source time series database"

这个查询InfluxData主页,并尝试匹配短语“InfluxDB是开源的[…]”。

需要注意的是,Telegraf的收集间隔对于这个插件尤为重要,因为它决定了多久向目标端点发送一次请求。各个插件可以通过在相应的配置块中包含一个interval参数来自定义其收集间隔,以定义自己的收集间隔。为了举例,我们将使用Telegraf的默认值,但你需要根据自己系统的需要决定合适的间隔。你可以在这个gist中找到一个完整的配置文件。

然后我们可以使用新的配置启动Telegraf的一个副本,应该会看到一些输出,如下所示

$ telegraf --config synthetic-telegraf.conf --debug
2019-07-01T11:51:52Z I! Starting Telegraf 1.10.4
2019-07-01T11:51:52Z I! Loaded inputs: http_response
2019-07-01T11:51:52Z I! Loaded aggregators: 
2019-07-01T11:51:52Z I! Loaded processors: 
2019-07-01T11:51:52Z I! Loaded outputs: influxdb
2019-07-01T11:51:52Z I! Tags enabled: host=noah-mbp.local
2019-07-01T11:51:52Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:noah-mbp.local", Flush Interval:10s
2019-07-01T11:51:52Z D! [agent] Connecting outputs
2019-07-01T11:51:52Z D! [agent] Attempting connection to output: influxdb
2019-07-01T11:51:52Z D! [agent] Successfully connected to output: influxdb
2019-07-01T11:51:52Z D! [agent] Starting service inputs
2019-07-01T11:52:10Z D! [outputs.influxdb] wrote batch of 1 metrics in 9.118061ms
2019-07-01T11:52:10Z D! [outputs.influxdb] buffer fullness: 0 / 10000 metrics. 
2019-07-01T11:52:20Z D! [outputs.influxdb] wrote batch of 1 metrics in 7.672117ms
2019-07-01T11:52:20Z D! [outputs.influxdb] buffer fullness: 0 / 10000 metrics.

下一步

http_response插件在创建监控请求方面提供了很大的灵活性,你可以使用这些请求更准确地模拟用户和应用程序如何与你的网站交互。例如,在influxdata.com上,你可能想通过提交POST请求并验证响应是否包含搜索结果页面的文本来验证你的搜索页面是否正常工作,而不仅仅是检查页面是否加载。由于合成监控旨在模拟用户体验,你的检查的具体数量、频率和实现将取决于你产品的设计和功能,但通常你寻找的是影响用户满意度的因素,如响应时间慢或错误率高。

由于黑盒监控经常暴露出已经影响用户的问题,因此你还需要根据这些数据创建一个合理的警报策略。这可能意味着给工程师发短信,或者在Slack中发送通知,此时他们需要转向更适合调试的数据:白盒指标和事件。

黑盒监控不是替代从你的应用程序中捕获的数据,但它提供端到端覆盖,在极端情况下非常有用。与白盒工具结合使用时,它可以给你额外的信心来确保软件的正常运行,使其成为监控系统的一个关键组件。