合成监控
2017年1月25日
合成监控(也称为语义监控[1])定期针对实时生产系统运行应用程序自动化测试的子集。结果将被推送到监控服务,如果出现故障,该服务会触发警报。此技术将自动化测试与监控结合起来,以便检测生产环境中失败的业务需求。
在小型独立服务和频繁部署的时代,很难在预生产环境中使用与生产环境完全相同的版本组合进行测试。缓解此问题的一种方法是将可测试性从预生产环境扩展到生产环境,这就是生产环境中的质量保证背后的理念。这样做将思维方式从关注平均故障间隔时间 (MTBF) 转变为关注平均恢复时间 (MTTR)。
对于大多数类型的故障,MTTR > MTBF
-- John Allspaw
合成监控就是一种这样的技术,我们在一个客户那里使用了这种技术,该客户是一个数字汽车交易平台,在十几个国家拥有数百万条分类广告。他们在生产环境中拥有近百种服务,每种服务每天部署多次。在将服务部署到生产环境之前,测试会在持续交付管道中运行。集成测试的依赖项不使用测试替身,而是在生产环境中的组件上运行测试。
以下是一个非常适合合成监控的测试示例。它模拟用户将分类广告添加到她的收藏夹列表中。她采取的步骤如下:
转到主页,登录并删除所有收藏夹(如果有)。此时,收藏夹计数器为零。 | |
选择一些过滤条件并执行搜索。 | |
通过单击星标将结果中的两个条目添加到收藏夹。星星的颜色从灰色变为黄色。 | |
转到主页。此时,收藏夹计数器应为 2。 |
为了从分析中排除测试请求,我们在 URL 中添加了一个参数(例如 excluderequests=true
)。该参数被传递给所有下游服务,当该参数设置为 true 时,每个服务都会抑制分析和第三方脚本。
我们可以使用 excluderequests
参数在后端数据存储中将数据标记为合成的。在我们的例子中,这无关紧要,因为我们重复使用同一个用户帐户并在测试开始时清除其状态。缺点是我们不能并发运行此测试。或者,我们可以为每次测试运行创建一个新的用户帐户。为了使测试用户易于识别,这些帐户的电子邮件地址中会有一个特定的前缀或后缀。另一种选择是在每个请求中发送一个自定义 HTTP 标头,以将其标识为测试,但这在 API 中更为常见。
我们的测试使用 Selenium webdriver 运行,并使用 PhantomJS 每 5 分钟针对生产环境中的服务执行一次。测试结果被输入到监控系统中,并显示在团队的仪表板上。根据被测功能的重要性,故障还可以触发待命人员的警报。
测试金字塔顶部的精选广栈测试非常适合用于合成监控。这些测试可以是 Web 应用程序的 UI 测试、用户旅程测试、用户验收测试或端到端测试;也可以是 API 的消费者驱动的契约测试 (CDC)。作为运行一套 UI 测试的替代方案(例如,在批处理作业的上下文中),可以将一个合成事务输入到系统中,并断言其所需的最终状态,例如数据库条目、队列中的消息或目录中的文件。
延伸阅读
- 构建微服务:设计细粒度系统 -- 作者:Sam Newman
- 微服务架构中的测试策略 -- 作者:Toby Clemson
注释
1: Ryan Murray创造了“语义监控”一词,该词出现在 2012 年底的Thoughtworks 技术雷达上。然而,“合成监控”似乎是更广泛使用的术语,并且有效地建立在合成事务的概念之上。