SuperAPI AI 工具集

elixir-observability

部署与运维

查看项目

更新于 10-15 21:55

技能介绍

用途:在设计、实现、评审或重构 Elixir、Phoenix、Ecto、Oban、Broadway、OTP 应用的可观测性时使用。核心架构:领域/库代码只发 :telemetry 事件,应用边界负责挂载处理器、定义指标、创建或桥接 OpenTelemetry span 并导出到 collector/后端。:telemetry 是内部埋点契约,OpenTelemetry 负责分布式追踪、跨服务上下文传播与导出,两者不是竞争关系。

决策:需要可复用库埋点、内部领域事件、Phoenix/Ecto/Oban/Broadway/GenServer/任务/领域流程指标、后端中立埋点时用 :telemetry;需要分布式追踪、跨服务 span 上下文、导出到 OpenTelemetry Collector、对接 Tempo/Jaeger/Honeycomb/Datadog/New Relic/SigNoz/OpenObserve 等后端、标准语义约定、日志与追踪关联时用 OpenTelemetry。两者并用时,仅在生命周期、计时与上下文可保留的情况下(通常来自成对的 start/stop/exception 事件)把遥测桥接成 span,不能由单个完成事件事后造 span 并声称测量了原操作。

用法:用户代码用 :telemetry.execute/3 发事件,边界代码用 :telemetry.attach_many/4 挂处理器;OpenTelemetry 放在应用级可观测模块,而非深层领域模块。事件名必须是原子的分层列表,如 [:my_app, :domain, :resource, :event],稳定且属于公开埋点契约,不可随意改名。测量值必须为数值(count、duration、queue_time、bytes、rows),描述性值放 metadata。内部计时用 System.monotonic_time(),在报告/导出层换算单位。处理器运行在调用进程内,必须快速、非阻塞、失败安全,不得做阻塞网络调用、昂贵序列化、外部 API、慢存储同步写或抛异常。

Phoenix/Ecto:它们已自带 :telemetry 事件,不要重复埋点,指标在 lib/my_app_web/telemetry.ex 中定义,如 summary("phoenix.endpoint.stop.duration", unit: {:native, :millisecond})。OpenTelemetry 依赖分 opentelemetry_api、opentelemetry、opentelemetry_exporter,可选 opentelemetry_phoenix、opentelemetry_ecto 等自动埋点包;标准基础设施优先自动埋点,领域流程用手动 span。span 名要有意义,如 billing.create_invoice,不要 do_work、handle_call、map。指标用于速率、计数、时长、队列、错误总量与告警;追踪用于请求流、跨服务因果、延迟分解与故障排查;日志用于离散事实与审计。伞形应用推荐 apps/core 只发遥测、apps/web 定义 Web 指标、apps/worker 发任务遥测、apps/observability 挂处理器与配置 OpenTelemetry。

限制:避免在指标标签中使用 user_id、account_id、email、request_id、trace_id、原始 URL/SQL、params、token、秘钥等高基数或敏感数据;避免把 OpenTelemetry 当作 :telemetry 的替代;不要给每个函数包 span;不要用追踪做主告警源、用日志做主指标系统。加入遥测时测试事件契约与形状,不要过度测试附带 metadata。具体依赖版本与配置细节本资料未提供。