作者:来自 Elastic Jessica Garson

本文探讨如何使用 Elastic Observability、TypeScript 和 FastMCP 自动创建合成监控中的用户旅程(journeys),并演示该应用及其工作流程。
Elastic Observability 中的 Synthetic Monitoring 允许你通过全球测试基础设施跟踪用户路径,模拟完整的用户流程,以衡量 Web 应用的影响。它还能从开发到生产阶段提供对网站性能、功能和可用性的全面洞察,使你能够在问题影响客户之前发现并解决它们。
Elastic Synthetic Monitoring 的核心能力之一是创建用户旅程,这可以通过有代码或无代码的方式完成。系统提供 Synthetics agent,这是一个 CLI 工具,可以引导你创建 heartbeat 监控和用户旅程,并将代码部署到 Elastic Observability。如果你使用代码来创建用户旅程,本质上是在使用 Playwright,并在其之上增加了一些配置,使其更易于与 Elastic Observability 集成。
要使用 TypeScript 自动创建用户旅程,你可以基于 prompt 生成 Playwright 测试,使用 Warp(AI 辅助终端)、Gemini 2.5 Pro 以及 MCP 来完成这一过程。该应用使用 Python 和 FastMCP 构建,它对 synthetic agent 进行了封装,使浏览器测试能够自动部署到 Elastic。
本文将介绍该应用的工作原理、使用方法以及开发过程。完整代码可以在 GitHub 上获取。
解决方案概览

目前该方案在 Warp 中作为 MCP server 运行;不过你也可以使用其他客户端,例如 Claude Desktop 或 Cursor。在此基础上,你会使用 FastMCP 创建一个 Python 脚本,它允许你定义可以被 LLM 调用的函数。
在 Warp 中,你可以创建一个 JSON 配置文件,用来指向你的 Python 脚本,并传入你正在使用的所有环境变量。完成之后,你需要切换到 agent mode,并提出关于创建合成测试的问题,或者直接调用 MCP 函数。
在 LLM 选择方面有多种选项,可以查看 Warp 的文档了解可用能力。
之后,你可以提出关于创建合成测试的问题,或者直接调用目标 MCP 函数。以下三个函数可以使用:
- diagnose_warp_mcp_config
- 用于调试可能出现的环境变量配置问题。除非配置出现错误,否则通常不需要使用。
- create_and_deploy_browser_test
- 如果提供测试名称、测试 URL 和调度时间,它会自动创建 Playwright 测试。这种方式基于模板,而不是基于机器学习,因此生成的测试结构通常比较一致。
- llm_create_and_deploy_test_from_prompt
- 与 create_and_deploy_browser_test 类似,但区别在于它使用 LLM 根据你提供的 prompt 生成测试。生成结果会反映你的描述。调用该函数时需要提供测试名称、URL、prompt 和调度时间。
为什么将该方案设计为 MCP server?
这样做的原因是:相比于单独的脚本或标准 CLI,将其实现为 MCP server 可以让系统以更 "对话式" 的方式进行结构化交互。它使 LLM 能够生成动态的 Playwright 测试,同时仍然保持一致的参数结构、环境变量以及响应格式,从而保证准确性与可靠性。
因此,它形成了一种可靠的工作流,可以与其他 agent 或开发工具进行组合使用。换句话说,MCP 层将基于 LLM 的测试生成能力,从 "一次性脚本" 提升为标准化、可复用的能力。
要了解 MCP 的发展方向,可以参考我们关于该主题的文章。
实现考虑因素
在构建类似方案时,需要特别注意 token 的使用问题。该方案的早期版本生成合成测试大约需要 20 分钟,并最终导致严重的速率限制(rate-limiting)问题。
另一个开发过程中遇到的问题,是如何在 "模板化 Playwright 脚本生成 "和 "基于 prompt 的 LLM 生成" 之间取得平衡。一方面,完全模板化的方式可以提高可靠性,但生成结果容易显得机械、重复;另一方面,完全依赖 LLM 虽然更灵活,但经常会生成无法运行的脚本,或者依赖不存在的参数。
最终版本尝试在两者之间折中:使用模板结构作为基础,同时通过调整 LLM 参数 temperature(用于控制模型输出的随机性与创造性)来增强生成多样性。
在测试过程中,还发现了一个失败的测试场景:需要处理弹窗(pop-up)才能继续执行。在更复杂的场景中,这类问题可能需要引入额外的领域知识,才能构建完整可通过的 Playwright 测试。
如何开始
前置条件
- 本项目使用 Python 3.12.1,但任何高于 3.10 的 Python 版本均可使用。
- 本应用使用 Elastic Observability 9.1.2,但任何高于 8.10 的版本均可使用,也支持 Elastic Cloud Serverless。
- 你还需要一个 OpenAI API key 来使用该应用的 LLM 能力,并将其配置为环境变量,可在 OpenAI 开发者门户的 API keys 页面获取。
步骤 1:安装依赖并克隆仓库
为了在本地运行该 MCP server,你需要安装以下依赖:
pip install fastmcp openai
npm install -g playwright @elastic/synthetics
你将使用 FastMCP 2.0 来创建 MCP server,并使用 OpenAI 根据你提供的 prompt 生成测试。此外,你还需要克隆该仓库以获取该 server 的本地副本。
步骤 2:在 Warp 中设置配置文件
在 Warp 中,你需要进入侧边栏中的 MCP servers,然后点击 "add"。

之后,系统会提示你添加一个 JSON 配置文件,其结构类似如下。请确保填入你自己的 Kibana URL,更新正确的路径,并包含你自己的密钥和 token。
{
"elastic-synthetics": {
"command": "python",
"args": ["elastic_synthetics_server.py"],
"env": {
"PYTHONPATH": ".",
"ELASTIC_KIBANA_URL": "https://your-kibana-url.elastic-cloud.com",
"ELASTIC_API_KEY": "your-api-key-here",
"ELASTIC_PROJECT_ID": "mcp-synthetics-demo",
"ELASTIC_SPACE": "default",
"ELASTIC_AUTO_PUSH": "true",
"ELASTIC_USE_JAVASCRIPT": "false",
"ELASTIC_INSTALL_DEPENDENCIES": "true",
"OPENAI_API_KEY": "sk-your-openai-key",
"LLM_MODEL": "gpt-4o"
},
"working_directory": "/path/to/your/file",
"start_on_launch": true
}
}
步骤 3:提问或直接调用工具
完成本地配置后,你需要切换到 agent mode,并选择你希望使用的 LLM。本篇博客选择 Gemini-Pro-2.5 的原因是它能提供更直接的回答,而其他 LLM 往往会返回非常冗长的响应。

要开始使用 MCP 工具,你可以从 MCP server 发起一个请求,其中包含测试名称、URL、prompt 以及 schedule。

你也可以直接调用 llm_create_and_deploy_test_from_prompt(),程序会提示你输入相关的详细信息:

在 Kibana 中,如果你点击 Applications,并在 Synthetics 下选择 Monitors,你应该可以看到你的监控任务列表。你也可以在 MCP 工具的响应中找到指向该监控的链接。

内部发生了什么
这个代码示例主要由三个函数组成,它们是 MCP tools,你可以从 MCP client 中调用,包括 diagnose_warp_mcp_config、create_and_deploy_browser_test 和 llm_create_and_deploy_test_from_prompt。
调试环境问题
在构建该应用时,环境变量加载过程中出现了多个问题,因此需要创建一个 MCP 工具,用于在出现错误时进行诊断调用。
工具 diagnose_warp_mcp_config 通过 @mcp.tool() 装饰器启动,这使它可以被调用并显示在可用工具列表中。该工具用于排查 Elastic 相关环境变量的配置问题。
首先,它会加载环境变量并检查 Elastic 相关变量,然后进行安全脱敏处理,避免暴露敏感信息(例如 API keys),只显示前 8 个字符,后面用 "..." 替代。
该工具还会检查是否具备最基本的必要凭证(Kibana URL 和 API Key)以继续部署,并输出一份报告,提示用户需要修复的配置问题。
@mcp.tool()
def diagnose_warp_mcp_config() -> Dict[str, Any]:
"""Diagnose Warp MCP environment configuration for Elastic Synthetics"""
try:
env_vars = load_env_from_warp_mcp()
# Check for required variables
kibana_url = env_vars.get('ELASTIC_KIBANA_URL') or env_vars.get('KIBANA_URL')
api_key = env_vars.get('ELASTIC_API_KEY') or env_vars.get('API_KEY')
project_id = env_vars.get('ELASTIC_PROJECT_ID') or env_vars.get('PROJECT_ID')
space = env_vars.get('ELASTIC_SPACE') or env_vars.get('SPACE', 'default')
# Mask sensitive values for display
masked_vars = {}
for key, value in env_vars.items():
if 'API_KEY' in key or 'TOKEN' in key:
masked_vars[key] = f"{value[:8]}..." if value and len(value) > 8 else "***"
else:
masked_vars[key] = value
deployment_ready = bool(kibana_url and api_key)
return safe_json_response({
"status": "success",
"environment_variables": masked_vars,
"required_check": {
"kibana_url": bool(kibana_url),
"api_key": bool(api_key),
"project_id": bool(project_id),
"space": bool(space)
},
"deployment_ready": deployment_ready,
"recommendations": [
"Environment variables detected" if env_vars else "No environment variables found",
"Kibana URL configured" if kibana_url else "Missing ELASTIC_KIBANA_URL or KIBANA_URL",
"API Key configured" if api_key else "Missing ELASTIC_API_KEY or API_KEY",
"Ready for deployment" if deployment_ready else "Missing required credentials"
]
})
except Exception as e:
return safe_json_response({
"status": "error",
"error": str(e),
"error_type": type(e).__name__
})
基于模板创建合成测试
在开发这个基于 prompt 生成测试的方案过程中,过程并不总是顺利的。早期版本遇到了准确性问题、幻觉问题以及循环生成等情况。为了解决这些问题,一个合理的下一步是先回到 "模板化测试",用来验证整个系统的基础机制,例如测试是否可以成功运行并正确部署到 Elastic。
该方案实现了自动化生成合成浏览器测试的完整流程:定期检查网站是否正常运行,并将测试部署到 Elastic Observability Synthetics。与 diagnose_warp_mcp_config 类似,MCP 工具 create_and_deploy_browser_test 同样使用 @mcp.tool() 装饰器,并检查环境变量是否正确加载。
随后,它会生成一个基于模板的 TypeScript 测试文件,并根据目标网站特性动态生成测试步骤,包括访问网站、验证页面标题是否存在、检查页面加载性能、截图、验证页面内容可见性等,最后将测试保存到 synthetic_tests 目录中。
最终,它封装 Elastic CLI 工具 @elastic/synthetics,将测试推送到 Kibana,同时允许配置测试运行的地理位置、执行频率,以及项目和 workspace 设置。
完整代码可以在这里查看。
基于 prompt 创建合成测试
虽然基于模板生成浏览器测试是一个良好的起点,但它显得较为固定和"模板化"。不过,它为构建基于 LLM 的功能提供了一个很好的结构基础。
MCP 工具 llm_create_and_deploy_test_from_prompt 首先会确保基础参数(如 locations、schedule 和目录)已正确配置。同时,它会分析目标网站以提供给 AI 更丰富的上下文,并初始化 OpenAI client 和模型(这里使用 GPT-4o)。
在完成 LLM 初始化后,它会将自然语言请求转换为 Playwright 测试代码,并对 AI 生成的代码进行清理和校验,以防止注入攻击或语法错误。它借鉴了模板化方法,将 AI 生成的步骤封装在一个可靠的测试框架中。最后,它以与前一个工具相同的方式将测试部署到 Elastic。
该工具的完整代码可以在这里查看。
结论与下一步
Elastic Observability 中的合成监控可以轻松测试完整用户旅程,帮助保持网站稳定性,并与 Playwright 集成,实现简单配置即可运行。
这样的方案只是 MCP 实现的起点:它可以自动生成 Playwright 测试,并在未来扩展到 heartbeat monitor、Playwright MCP server 集成,甚至可以尝试使用 Claude for Chrome 来生成合成测试。
更多内容可以在 Observability Labs 上查看 Synthetic Monitoring 相关文章。
原文:https://www.elastic.co/observability-labs/blog/tag/synthetics