问题描述
在我工作的公司中,我们部署了许多服务:其中大部分是小型且使用频率较低的服务,但如果出现故障仍然会带来问题。我意识到手动测试它们是否正常工作需要太多的资源,因此自动化工作可能是一个好主意。
我最初的想法是,自托管这个基础设施意味着我必须维护两个独立的关键生态系统:如果我在运行服务的同一台服务器(甚至是同一家托管提供商)上运行测试,停机可能会导致两个系统都崩溃,并且我将无法收到故障通知。因此,我决定选择付费解决方案。
我研究了这个主题,并找到了许多工具,如Runscope,但其中大多数都是基本的请求-响应验证工具:如果服务器没有超时或响应错误,这些工具会认为一切正常。但是,当网站对未经身份验证的用户不开放时,这种方法效果不好:在许多情况下,无法创建一个POST登录查询(例如,由于CSRF),这意味着我需要基于浏览器的自动化测试,而不是基于查询的测试。有人建议我公开一个未经身份验证的“健全性测试”端点,但这感觉太人为了:理想情况下,测试应尽可能地模拟用户交互。
我目前的解决方案是使用Pingdom的事务/合成测试,但我很快发现了多个问题:
1. 价格。Pingdom每年收费490,00 €,提供10个自动化基于浏览器的测试场景和故障通知。
2. 安全性。当前解决方案要求我上传凭据到被测试应用程序,以便测试登录墙之外的任何内容。
3. “看守者的看守者”问题。我通过公开一个单独的服务来解决这个问题,该服务跟踪上次联系的时间,并在Pingdom一段时间没有联系时发送单独的通知。
我觉得这是一个如此常见的问题,我无法相信没有流行/标准的解决方案或策略来解决它。我的方法是否有问题,还是通常以项目特定的方式开发?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
对于您的Web服务的流量较小的部分,合成事务是一个不错的选择。
在选择使用API还是使用完整浏览器样式检查时,需要权衡一些因素。
使用API检查需要更改被测试的应用程序。我建议首先尝试这种方法,但它取决于您需要测试的功能。这些可以被视为健康端点。一些示例实现是Beamly S4或Hootsuite Health Checks。有许多可以访问这些端点的网站,如您提到的Pingdom、FreshPing或Datadog Synthetics。
完整浏览器样式检查不需要对应用程序进行更改,这意味着它们很容易添加。由于它们使用呈现的网页内容进行导航,它们可能会很脆弱。页面布局或CSS的更改可能会破坏已创建的测试。在这里的选项包括BrowserStack或Datadog Synthetics。
在自己运行时,您可能会遇到某些位置、区域或CDN的POP无法访问您的站点的问题。这就是为什么大多数这些服务提供了许多位置来访问您的站点,以便您可以捕捉那些可能只影响某些客户的问题。因此,我强烈建议选择托管路线。
从安全的角度来看,这些系统肯定需要凭据。如果您无法将这些服务使用的帐户在应用程序中锁定为只读,或者只为您的应用程序提供特定区域的权限,一个选择可能是轮换凭据。例如,创建一个每天运行的作业,更改服务帐户,并使用新密码更新提供程序。例如,使用Datadog Synthetics Terraform资源。
对于“看守者的看守者”:由于现在基于合成事务的负载会定期出现在您的应用程序上,您可以对应用程序进行仪表化或解析日志以确保事务正常进行。
方案2
使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。您可以使用docker run
命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:
#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b
在这个示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。
以上是两种解决方案,您可以根据您的具体需求选择适合您的方法。希望对您有所帮助!