CMDCSkillEngine.Telemetry (cmdc_skill_engine v0.3.0)

Copy Markdown View Source

cmdc_skill_engine 标准 :telemetry 事件契约。

本模块只暴露事件 schema + emit 辅助函数,本身不挂任何 handler。集成方 (Studio / Hive / 其它 BaaS)用 :telemetry.attach_many/4 接入即可。

设计原则

  1. 零强制依赖:telemetry 已是 BEAM 生态事实标准
  2. 事件命名稳定 — schema 锁定 + schema_version 标签
  3. metadata 字段白名单 — 明确列出,避免敏感字段意外泄露
  4. inline emit 而非异步 — handler 必须自行 fast;慢 handler 会阻塞 Store GenServer,请在 handler 内异步分发

事件清单(v0.3,共 4 事件)

事件名触发时机measurementsmetadata
[:cmdc_skill_engine, :analyzer, :analyze, :start]Analyzer 开始分析 session%{system_time}%{session_id, scope, analysis_model, selected_skill_count}
[:cmdc_skill_engine, :analyzer, :analyze, :stop]Analyzer 分析完成(含降级到规则路径)%{duration_ms}%{session_id, scope, analysis_model, task_completed, suggestion_count, fallback?}
[:cmdc_skill_engine, :evolution, :emitted]Evolver 成功产出新 SkillRecord%{count: 1}%{evolution_type, skill_id, scope, parent_skill_ids, name, source_task_id}
[:cmdc_skill_engine, :store, :record_updated]Store 完成 save_recordupdate_counters%{count: 1}%{skill_id, scope, operation, name}
  • evolution_type 取值 :fix | :derived | :captured

  • operation 取值 :save | :counters_incremented

  • scope 当前 v0.3 PR-1 默认 "global";PR-2 多租户支持完成后承载真实租户 ID
  • fallback? 表示 LLM 分析失败被降级到规则分析

Quick Start

# 1) 开发期 logger
CMDCSkillEngine.Telemetry.attach_logger()

# 2) 集成方挂自定义 handler
:telemetry.attach_many(
  "studio-skill-engine-bridge",
  CMDCSkillEngine.Telemetry.all_events(),
  &MyApp.SkillBridge.handle_event/4,
  nil
)

def handle_event([:cmdc_skill_engine, :evolution, :emitted], _meas, meta, _) do
  # 异步派发到 Phoenix Channel / Kafka / ...
  Task.Supervisor.start_child(MyApp.TaskSup, fn ->
    MyApp.Skills.upsert(meta.skill_id, meta.scope)
  end)
end

# 3) detach
:telemetry.detach("studio-skill-engine-bridge")

schema_version

所有事件 metadata 自动注入 :schema_version(当前 1)。集成方可据此做 字段变更感知(v0.4+ 引入新字段时 bump version + 文档说明)。

Summary

Functions

返回当前所有 cmdc_skill_engine telemetry 事件名称。

附加一个开发期 Logger handler,所有 cmdc_skill_engine 事件打到 console。

Detach 开发期 Logger handler。

Evolver 成功产出新 SkillRecord 时调用。

Store 完成一次记录写入时调用。

低阶 emit,自动注入 schema_version。一般不直接调用,用各类 helper。

返回 telemetry schema 版本号。

包装一次 analyze 过程,自动 emit analyze :start / analyze :stop, 并把 :duration_ms 计入 measurements。

Functions

all_events()

@spec all_events() :: [[atom()]]

返回当前所有 cmdc_skill_engine telemetry 事件名称。

attach_logger(opts \\ [])

@spec attach_logger(keyword()) :: :ok | {:error, term()}

附加一个开发期 Logger handler,所有 cmdc_skill_engine 事件打到 console。

生产环境请用 :telemetry.attach_many/4 接实际可观测性栈。

detach_logger(opts \\ [])

@spec detach_logger(keyword()) :: :ok | {:error, :not_found}

Detach 开发期 Logger handler。

emit_evolution(evolution_type, record, extra \\ %{})

@spec emit_evolution(
  :fix | :derived | :captured,
  CMDCSkillEngine.Types.SkillRecord.t(),
  map()
) :: :ok

Evolver 成功产出新 SkillRecord 时调用。

  • evolution_type:fix | :derived | :captured

  • record — 新创建的 SkillRecord
  • extra — 任意补充字段(如 source_task_id

emit_record_updated(operation, record)

@spec emit_record_updated(
  :save | :counters_incremented,
  CMDCSkillEngine.Types.SkillRecord.t()
) :: :ok

Store 完成一次记录写入时调用。

  • operation:save(save_record 路径) / :counters_incremented(update_counters 路径)

execute(event_name, measurements, metadata)

@spec execute([atom()], map(), map()) :: :ok

低阶 emit,自动注入 schema_version。一般不直接调用,用各类 helper。

schema_version()

@spec schema_version() :: pos_integer()

返回 telemetry schema 版本号。

span_analyze(start_metadata, fun)

@spec span_analyze(map(), (-> result)) :: result when result: var

包装一次 analyze 过程,自动 emit analyze :start / analyze :stop, 并把 :duration_ms 计入 measurements。

示例

Telemetry.span_analyze(meta, fn ->
  build_session_analysis(state, ctx)
end)