合成监控

2017年1月25日

合成监控(也称为语义监控[1])定期针对实时生产系统运行应用程序自动化测试的子集。结果将被推送到监控服务,如果出现故障,该服务会触发警报。此技术将自动化测试与监控结合起来,以便检测生产环境中失败的业务需求。

在小型独立服务和频繁部署的时代,很难在预生产环境中使用与生产环境完全相同的版本组合进行测试。缓解此问题的一种方法是将可测试性从预生产环境扩展到生产环境,这就是生产环境中的质量保证背后的理念。这样做将思维方式从关注平均故障间隔时间 (MTBF) 转变为关注平均恢复时间 (MTTR)。

对于大多数类型的故障,MTTR > MTBF

-- John Allspaw

合成监控就是一种这样的技术,我们在一个客户那里使用了这种技术,该客户是一个数字汽车交易平台,在十几个国家拥有数百万条分类广告。他们在生产环境中拥有近百种服务,每种服务每天部署多次。在将服务部署到生产环境之前,测试会在持续交付管道中运行。集成测试的依赖项不使用测试替身,而是在生产环境中的组件上运行测试。

以下是一个非常适合合成监控的测试示例。它模拟用户将分类广告添加到她的收藏夹列表中。她采取的步骤如下:

为了从分析中排除测试请求,我们在 URL 中添加了一个参数(例如 excluderequests=true)。该参数被传递给所有下游服务,当该参数设置为 true 时,每个服务都会抑制分析和第三方脚本。

我们可以使用 excluderequests 参数在后端数据存储中将数据标记为合成的。在我们的例子中,这无关紧要,因为我们重复使用同一个用户帐户并在测试开始时清除其状态。缺点是我们不能并发运行此测试。或者,我们可以为每次测试运行创建一个新的用户帐户。为了使测试用户易于识别,这些帐户的电子邮件地址中会有一个特定的前缀或后缀。另一种选择是在每个请求中发送一个自定义 HTTP 标头,以将其标识为测试,但这在 API 中更为常见。

我们的测试使用 Selenium webdriver 运行,并使用 PhantomJS 每 5 分钟针对生产环境中的服务执行一次。测试结果被输入到监控系统中,并显示在团队的仪表板上。根据被测功能的重要性,故障还可以触发待命人员的警报。

测试金字塔顶部的精选广栈测试非常适合用于合成监控。这些测试可以是 Web 应用程序的 UI 测试、用户旅程测试、用户验收测试或端到端测试;也可以是 API 的消费者驱动的契约测试 (CDC)。作为运行一套 UI 测试的替代方案(例如,在批处理作业的上下文中),可以将一个合成事务输入到系统中,并断言其所需的最终状态,例如数据库条目、队列中的消息或目录中的文件。

延伸阅读

致谢

感谢Henry Lawson的反馈。

特别感谢 Martin Fowler 的支持、建议以及帮助我们改进此 Bliki 所花费的时间。

注释

1: Ryan Murray创造了“语义监控”一词,该词出现在 2012 年底的Thoughtworks 技术雷达上。然而,“合成监控”似乎是更广泛使用的术语,并且有效地建立在合成事务的概念之上。