资讯动态

从零部署Beacon:构建统一监控传统应用与LLM的开源可观测性平台

发布时间:2026/8/13 12:40:27 来源:尧图企业网站定制
在分布式系统和微服务架构中错误追踪与日志监控是保障服务稳定性的基石。随着大型语言模型LLM应用的深入其特有的提示词Prompt工程、模型调用链、Token消耗与成本监控又构成了一个全新的可观测性维度。传统错误追踪工具如Sentry、Datadog等与新兴的LLM应用监控需求之间存在割裂导致开发者需要在多个平台间切换难以形成统一的故障排查视图。Beacon正是为解决这一痛点而设计的开源解决方案。它将传统的应用错误追踪与LLM应用的可观测性Observability能力整合在一个自托管Self-hosted的平台中。这意味着无论是后端服务的500错误、数据库连接超时还是LLM调用中的提示词注入攻击、响应延迟激增、Token成本异常都可以在同一个仪表盘上被捕获、关联和分析。对于追求数据主权、成本控制或深度定制的团队而言自托管模式提供了对数据的完全控制权避免了将敏感日志和错误信息发送到第三方SaaS平台的风险。本文将带你从零开始完成Beacon的部署、配置并将其集成到一个示例的Python Web服务与LLM应用中。你将理解其核心架构掌握错误与LLM事件的捕获方法并学会通过其界面进行高效的根因分析。最终你将拥有一个能够同时监控传统应用错误和LLM应用性能的私有化可观测性平台。1. 理解Beacon的核心架构与数据流在动手部署之前需要先厘清Beacon是如何工作的。它不是一个单体应用而是一个由多个组件构成的微服务系统其设计遵循了现代可观测性平台的标准范式。1.1 核心组件解析Beacon平台主要包含以下组件理解它们的关系是后续部署和排错的基础采集端 SDK (Client SDKs): 这是集成在你应用程序中的库。Beacon为不同语言如Python、JavaScript、Go等提供了SDK。SDK负责捕获应用程序中的异常Exception、日志Log、性能指标Metrics以及LLM调用如OpenAI、Anthropic的API调用并将其封装成事件Event发送到后端。接收网关 (Ingestion Gateway/API): 一个高可用的HTTP/HTTPS服务负责接收来自所有客户端SDK的事件数据。它进行初步的验证、鉴权如果配置了API Key和格式化然后将事件放入消息队列。消息队列 (Message Queue, 如Kafka/RabbitMQ): 作为缓冲层解耦数据接收与处理过程在高流量场景下保证系统不会因为处理不及时而丢失数据。事件处理器 (Event Processor): 从消息队列中消费事件进行更复杂的处理如错误分组Grouping将相似错误归为一类、指纹计算Fingerprinting、上下文信息丰富Enrichment最后将处理好的数据写入存储。存储层 (Storage): 通常由时序数据库如TimescaleDB基于PostgreSQL和对象存储如S3/MinIO组成。时序数据库存储结构化的错误事件、性能指标和LLM调用元数据对象存储用于存储可能较大的堆栈跟踪详情、请求/响应体等。查询引擎与API (Query Engine/API): 提供GraphQL或RESTful API供前端界面查询和聚合数据。前端界面 (Web UI): 基于React或Vue等框架构建的交互式仪表盘用于可视化错误、查看LLM调用链、设置告警规则等。数据流可以概括为应用 - SDK - 接收网关 - 消息队列 - 事件处理器 - 存储 - 查询API - 前端UI。1.2 传统错误追踪与LLM可观测性的融合Beacon的独特之处在于它对两类数据的统一处理传统错误追踪捕获未处理的异常Uncaught Exceptions、记录错误日志Error Logs、跟踪HTTP请求的性能如延迟、状态码。它会自动收集丰富的上下文如用户ID、会话ID、设备信息、代码堆栈、环境变量等。LLM可观测性通过SDK装饰器或中间件自动拦截对LLM提供商OpenAI, Anthropic, Cohere等的API调用。它会记录提示词Prompt与完成内容Completion用于分析提示词有效性。延迟与Token使用监控每次调用的耗时和成本。模型与参数记录使用的模型、温度Temperature、最大Token数等。调用链Trace将一个用户请求中可能发生的多次LLM调用、工具调用Function Calling串联起来形成完整的执行轨迹。这两类数据在Beacon内部共享相同的项目Project、环境Environment和用户User模型使得你可以在一个错误详情页中同时看到触发该错误的用户在之前进行了哪些LLM操作从而快速定位是否是提示词设计或模型响应导致了后续的业务逻辑错误。2. 环境准备与部署方案选择Beacon支持多种部署方式从最简单的单机Docker Compose到基于Kubernetes的生产级部署。为了快速体验和评估我们选择使用Docker Compose进行部署。2.1 系统与软件要求部署主机应满足以下最低要求组件最低要求推荐配置 (用于评估)说明操作系统Linux (x86_64), macOS, WSL2Ubuntu 22.04 LTS需要支持Docker。Docker20.1024.0确保docker和docker-compose或docker compose插件命令可用。Docker Compose1.292.20用于编排多个容器。CPU2核4核处理事件需要一定计算资源。内存4 GB8 GBBeacon服务、数据库、队列等会占用内存。磁盘20 GB50 GB (SSD)存储事件数据和日志SSD能显著提升查询性能。网络可访问互联网拉取镜像稳定的局域网生产环境需考虑防火墙和网络安全组规则。在终端中执行以下命令验证环境# 检查Docker版本 docker --version # 检查Docker Compose版本 (V2插件形式) docker compose version # 检查系统资源 (Linux示例) free -h df -h2.2 获取部署配置文件Beacon官方通常会在GitHub仓库提供示例的docker-compose.yml文件。我们创建一个工作目录并获取配置。# 创建项目目录 mkdir beacon-demo cd beacon-demo # 从官方仓库获取docker-compose示例 (假设地址请以实际仓库为准) # 这里我们创建一个模拟的docker-compose.yml文件 cat docker-compose.yml EOF version: 3.8 services: postgres: image: timescale/timescaledb:latest-pg14 environment: POSTGRES_DB: beacon POSTGRES_USER: beacon_user POSTGRES_PASSWORD: secure_password_here volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: [CMD-SHELL, pg_isready -U beacon_user -d beacon] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine command: redis-server --appendonly yes volumes: - redis_data:/data healthcheck: test: [CMD, redis-cli, ping] interval: 10s timeout: 5s retries: 5 kafka: image: bitnami/kafka:latest environment: KAFKA_CFG_NODE_ID: 0 KAFKA_CFG_PROCESS_ROLES: controller,broker KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0kafka:9093 KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093 KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER volumes: - kafka_data:/bitnami/kafka healthcheck: test: [CMD, kafka-topics.sh, --bootstrap-server, localhost:9092, --list] interval: 30s timeout: 10s retries: 3 api: image: usebeacon/beacon-api:latest depends_on: postgres: condition: service_healthy redis: condition: service_healthy kafka: condition: service_healthy environment: DATABASE_URL: postgresql://beacon_user:secure_password_herepostgres:5432/beacon REDIS_URL: redis://redis:6379 KAFKA_BROKERS: kafka:9092 SECRET_KEY: your-very-secret-key-change-this-in-production ports: - 8081:8080 # 假设API服务运行在8080端口映射到主机8081 processor: image: usebeacon/beacon-processor:latest depends_on: api: condition: service_started kafka: condition: service_healthy environment: DATABASE_URL: postgresql://beacon_user:secure_password_herepostgres:5432/beacon KAFKA_BROKERS: kafka:9092 web: image: usebeacon/beacon-web:latest depends_on: api: condition: service_started environment: NEXT_PUBLIC_API_URL: http://localhost:8081 ports: - 3000:3000 volumes: postgres_data: redis_data: kafka_data: EOF注意以上docker-compose.yml是一个基于常见架构的模拟示例。实际部署时请务必参考Beacon官方仓库的最新配置。关键环境变量如SECRET_KEY、数据库密码等必须修改为强密码。2.3 启动Beacon服务配置好docker-compose.yml后使用以下命令启动所有服务# 在后台启动所有服务 docker compose up -d # 查看服务启动日志和状态 docker compose logs -f # 按 CtrlC 退出日志跟随模式 # 查看所有容器状态 docker compose ps当所有服务状态显示为healthy或running时表示启动成功。主要服务访问地址如下前端界面 (Web UI):http://localhost:3000后端API:http://localhost:8081(通常供SDK调用)首次访问Web UI (http://localhost:3000)通常会引导你完成初始化设置如创建管理员账户、第一个组织Organization和项目Project。3. 集成SDK捕获Python应用错误与LLM调用平台部署完成后下一步是在你的应用程序中集成Beacon的SDK。这里以Python的Flask应用为例演示如何同时捕获HTTP请求错误和OpenAI API调用。3.1 安装Python SDK假设你的项目使用pip进行包管理。首先安装Beacon的Python SDK。# 在你的Python项目虚拟环境中执行 pip install beacon-python3.2 基础配置与错误捕获创建一个简单的Flask应用并集成Beacon SDK进行错误自动捕获。# app.py import os from flask import Flask, request, jsonify from beacon import BeaconClient # 初始化Beacon客户端 # 从环境变量读取配置避免硬编码 client BeaconClient( dsnos.getenv(BEACON_DSN), # 例如: https://keyyour-beacon-domain/api environmentos.getenv(BEACON_ENVIRONMENT, development), releaseos.getenv(BEACON_RELEASE, 1.0.0), ) app Flask(__name__) # 使用Beacon的Flask集成中间件假设SDK提供 # 这能自动捕获未处理的异常和请求信息 try: from beacon.flask import BeaconMiddleware app.wsgi_app BeaconMiddleware(app.wsgi_app, clientclient) except ImportError: print(Beacon Flask middleware not available, basic error capture only.) app.route(/api/divide, methods[GET]) def divide_numbers(): 一个会触发错误的路由示例 a request.args.get(a, typefloat) b request.args.get(b, typefloat) # 如果b为0会触发ZeroDivisionError result a / b return jsonify({result: result}) app.route(/api/health) def health(): return jsonify({status: ok}) if __name__ __main__: app.run(debugFalse) # 生产环境应关闭debug模式配置环境变量或直接在代码中设置BEACON_DSN。DSNData Source Name是SDK与你的Beacon项目通信的凭证可以在Beacon Web UI的项目设置中找到。3.3 集成LLM可观测性接下来我们演示如何监控对OpenAI API的调用。Beacon SDK通常会提供装饰器或直接包装LLM客户端。# llm_service.py import openai from beacon import llm_trace, record_llm_call import os # 配置OpenAI客户端 openai.api_key os.getenv(OPENAI_API_KEY) # 方法一使用装饰器自动记录如果SDK支持 llm_trace(clientclient, operation_namegenerate_advice) def get_financial_advice(question: str): 获取金融建议此函数调用将被Beacon自动追踪 response openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ {role: system, content: 你是一个专业的金融顾问。}, {role: user, content: question} ], temperature0.7, max_tokens150, ) return response.choices[0].message.content # 方法二手动记录LLM调用细节 def summarize_text(text: str): 手动记录LLM调用的各项参数和结果 start_time time.time() try: response openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ {role: system, content: 请总结以下文本。}, {role: user, content: text} ], temperature0.5, ) completion response.choices[0].message.content usage response.usage # 手动向Beacon记录此次LLM调用 record_llm_call( clientclient, provideropenai, modelgpt-3.5-turbo, prompt_messages[{role: user, content: text}], completioncompletion, temperature0.5, total_tokensusage.total_tokens, prompt_tokensusage.prompt_tokens, completion_tokensusage.completion_tokens, duration_ms(time.time() - start_time) * 1000, metadata{operation: summarize} ) return completion except openai.error.OpenAIError as e: # 记录LLM调用失败 client.capture_exception(e) raise将上述服务集成到Flask路由中# 在app.py中添加 from llm_service import get_financial_advice, summarize_text app.route(/api/advice, methods[POST]) def advice(): data request.get_json() question data.get(question, ) if not question: return jsonify({error: Question is required}), 400 try: advice_text get_financial_advice(question) return jsonify({advice: advice_text}) except Exception as e: # Beacon中间件会自动捕获并上报这个异常 # 你也可以手动添加额外上下文 client.capture_message(fFailed to generate advice for question: {question}, levelerror) return jsonify({error: Internal server error}), 500 app.route(/api/summarize, methods[POST]) def summarize(): data request.get_json() text data.get(text, ) if not text: return jsonify({error: Text is required}), 400 try: summary summarize_text(text) return jsonify({summary: summary}) except Exception as e: return jsonify({error: str(e)}), 5003.4 运行与验证设置环境变量并启动应用export BEACON_DSN你的项目DSN export OPENAI_API_KEY你的OpenAI Key python app.py发送请求触发错误和LLM调用# 触发除法错误 (模拟传统错误) curl http://localhost:5000/api/divide?a10b0 # 触发LLM调用 (模拟LLM可观测性) curl -X POST http://localhost:5000/api/advice \ -H Content-Type: application/json \ -d {question: 我应该如何开始投资}访问Beacon Web UI (http://localhost:3000)在仪表盘上应该能看到新上报的错误事件和LLM调用事件。4. Beacon Web界面核心功能详解成功上报数据后通过Web界面进行排查和分析是核心工作流。4.1 错误追踪面板在“Issues”或“Errors”面板你会看到按错误分组Group的列表。点击一个错误组进入详情页这里包含错误信息与堆栈跟踪精确到代码行。事件频率图表显示错误随时间发生的次数。受影响用户看到哪些用户遇到了此错误。上下文信息HTTP请求头、用户代理、环境变量、自定义标签Tags。关联的LLM调用如果该错误发生前或发生时有相关的LLM操作会在这里显示帮助你判断是否是模型输出导致了逻辑错误。4.2 LLM可观测性面板在“LLM”或“Traces”面板专注于模型调用调用列表列出所有记录的LLM调用包含模型、耗时、Token用量、状态成功/失败。调用链Trace视图以瀑布图形式展示一个请求内多次LLM调用、函数调用的先后顺序和耗时对于分析复杂Agent应用至关重要。提示词与响应查看器可以安全地查看发送给模型的提示词和返回的完整响应用于调试和优化提示工程。成本分析根据Token使用量和模型单价需配置估算LLM调用成本并识别异常消耗。延迟与性能图表监控各模型P95/P99延迟及时发现性能退化。4.3 搜索、过滤与告警强大的查询语言允许你使用类似error.type:ZeroDivisionError environment:production或llm.model:gpt-4 duration:5000的查询语句精准定位问题。保存视图与仪表盘将常用的过滤条件保存为视图或将关键指标错误数、LLM平均延迟、Token消耗速率聚合到自定义仪表盘。告警规则可以配置当特定错误首次出现、频率激增或LLM调用平均延迟超过阈值、Token成本异常时通过邮件、Slack、Webhook等方式通知团队。5. 生产环境部署与运维要点将Beacon用于生产环境需要考虑更多关于稳定性、安全性和性能的方面。5.1 配置与安全加固修改默认密码与密钥务必修改docker-compose.yml中所有数据库密码、Redis密码以及SECRET_KEY。使用强密码生成器。配置TLS/HTTPS为接收网关API和Web UI配置SSL证书。可以在网关前部署Nginx或Traefik作为反向代理处理TLS终止。设置网络隔离将Beacon的服务部署在内部网络仅将API网关和Web UI的端口暴露给需要访问的网络如办公网。数据库、消息队列不应直接暴露。启用身份认证为Web UI配置SSO如OAuth2/OIDC或强密码策略。为SDK上报配置项目级别的DSN或API Key并定期轮换。环境变量管理使用.env文件或专门的配置管理工具如HashiCorp Vault管理敏感信息不要将密码硬编码在Compose文件中。5.2 数据持久化与备份在docker-compose.yml中我们使用了命名卷postgres_data,redis_data等。在生产中你需要配置卷的持久化路径将卷映射到宿主机的可靠存储位置或网络存储如NFS、云盘。制定备份策略定期备份PostgreSQL/TimescaleDB数据库。可以使用pg_dump或TimescaleDB的连续聚合与备份工具。日志轮转配置Docker容器的日志驱动和轮转策略避免日志占满磁盘。5.3 性能与高可用对于高负载场景横向扩展api和processor服务是无状态的可以通过增加副本数来水平扩展。在docker-compose中可以使用deploy.replicasSwarm模式或迁移到Kubernetes。消息队列使用生产级的Kafka集群替代单节点确保消息不丢失。数据库优化根据数据量调整TimescaleDB的块大小、压缩策略和索引。资源限制为每个容器设置合理的CPU和内存限制deploy.resources.limits防止单个服务异常影响主机。5.4 监控Beacon自身“可观测性平台也需要被观测”。建议为Beacon的各个服务API、Processor也配置基础指标如CPU、内存、请求率、错误率监控可以使用PrometheusGrafana。监控PostgreSQL和Kafka的健康状态。设置磁盘使用率告警。6. 常见问题排查清单在集成和使用Beacon过程中你可能会遇到以下问题。问题现象可能原因检查步骤解决方案前端Web UI无法访问 (localhost:3000)1. 容器未启动或启动失败。2. 端口被占用。3. 前端服务依赖的API服务未就绪。1.docker compose ps查看状态。2.docker compose logs web查看前端容器日志。3.curl -f http://localhost:8081/health检查API健康。1. 根据日志修复配置错误。2. 更换主机端口映射。3. 确保所有依赖服务健康后再启动Web。SDK无法发送数据到Beacon1. DSN配置错误。2. 网络不通防火墙、代理。3. Beacon API服务故障。4. SDK版本不兼容。1. 检查BEACON_DSN环境变量确保格式正确。2. 从应用所在网络curlBeacon API端点。3. 查看API容器日志docker compose logs api。4. 检查SDK和Server版本是否匹配。1. 在Web UI中重新生成DSN并更新。2. 配置网络或代理。3. 重启API服务或检查依赖服务DB Kafka。4. 查阅官方文档使用兼容版本。Beacon界面看不到LLM调用记录1. LLM集成代码未正确调用。2.record_llm_call参数错误或异步问题。3. Processor服务处理队列积压或失败。1. 在代码中打印日志确认装饰器或手动记录函数被调用。2. 检查发送给record_llm_call的参数是否完整。3. 查看Processor容器日志docker compose logs processor。1. 确保LLM调用路径被SDK包装或装饰。2. 同步调用时确保在LLM调用后立即记录异步场景需处理回调。3. 重启Processor检查Kafka连接和消息格式。错误事件没有分组产生大量重复Issue1. 错误指纹Fingerprint计算不准确。2. 堆栈跟踪中包含动态信息如行号因代码变动频繁变化。1. 在错误详情页查看计算出的指纹。2. 对比不同事件的堆栈差异。1. 在SDK初始化时配置in_app_include或in_app_exclude聚焦于项目自身代码栈。2. 使用SDK提供的fingerprint回调函数自定义分组逻辑。数据库磁盘占用增长过快1. 事件数据没有保留策略。2. 调试日志级别过高记录了过多信息。1. 检查数据库中事件表的数据量。2. 检查SDK配置的sample_rate和send_default_pii。1. 在Beacon服务配置或TimescaleDB中设置数据保留策略如只保留30天数据。2. 在生产环境调高采样率关闭不必要的个人身份信息(PII)收集。性能影响应用变慢1. SDK同步上报阻塞主线程。2. 网络延迟高上报超时。1. 使用性能分析工具如cProfile查看SDK上报耗时。2. 检查网络延迟。1. 配置SDK使用异步传输或后台线程。2. 增加SDK的上报超时时间或配置本地缓存和批量发送。7. 最佳实践与扩展方向7.1 集成与使用最佳实践分环境配置为开发、测试、生产环境配置不同的Beacon项目Project和环境Environment标签。在SDK初始化时通过环境变量区分便于在界面中过滤。添加自定义上下文和标签在捕获错误或记录LLM调用时添加上下文信息如用户ID、请求ID、业务流水号、功能模块等。这能极大提升排查效率。# 示例在Flask请求上下文中添加用户信息 app.before_request def set_beacon_context(): if hasattr(request, user) and request.user: client.set_user({id: request.user.id, email: request.user.email}) client.set_tag(transaction_id, request.headers.get(X-Request-ID))敏感信息过滤在SDK配置中启用数据擦除Data Scrubbing功能自动过滤请求头、请求体、环境变量中的密码、Token、密钥等敏感信息避免泄露。采样控制在高流量应用中对性能指标和部分低优先级错误进行采样Sampling避免数据洪峰和成本激增。但对关键错误和LLM调用应保持100%捕获。与现有日志系统集成Beacon不应完全替代现有日志系统如ELK。可以将Beacon视为错误和LLM调用的“索引”或“警报触发器”详细日志仍应发往中心化日志平台并通过Trace ID进行关联。7.2 扩展方向自定义事件与指标除了自动捕获你可以使用SDK发送自定义业务事件如“用户完成支付”和指标如“购物车平均金额”在Beacon中创建业务专属仪表盘。告警升级与排班配置更复杂的告警规则如基于错误频率、LLM延迟的复合条件告警并与PagerDuty、OpsGenie等值班系统集成实现告警升级。数据导出与分析利用Beacon提供的API将错误和LLM数据定期导出到数据仓库如Snowflake、BigQuery进行更长期的趋势分析和成本审计。源码管理集成在Beacon中配置代码仓库GitHub, GitLab连接使其能在错误堆栈中直接显示代码片段和提交记录实现“错误即工单”。通过将Beacon作为统一的可观测性中心团队可以打破传统应用监控与AI应用监控之间的壁垒用同一套方法论和工具来保障整个系统的稳定性与性能。从部署、集成到深入使用每一步都围绕着“快速发现问题、清晰定位根因”这一核心目标。开始在你的下一个项目中引入Beacon体验这种融合监控带来的效率提升。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价