跳至正文

10 — Core 业务接入埋点

1. 结论

业务接入埋点是 flare-im-contracts 给外部业务系统的非侵入式扩展面。它不把业务逻辑写进 Core,而是把 Core 主链中的关键事实转换为稳定事件,交给业务侧 Hook、Capability、MQ、Webhook 或 Sidecar 消费。

默认状态下,Core 使用 Noop 埋点实现;没有任何业务接入时,Core 仍可独立运行。

2. 埋点与 Hook 的区别

类型目的是否影响主链典型场景
pre_send Hook决策/拦截可以阻断好友关系、群禁言、风控
post_send Hook发送后旁路默认不阻断审计、数据分析
Business Probe标准事实埋点不阻断增长、BI、风控特征、账单、推荐
Capability Dispatch命令/查询能力调用方决定业务能力调用

原则:

  • 能用埋点解决的,不要写进 Core。
  • 需要拒绝主链的,使用 Hook。
  • 需要业务命令结果的,使用 Capability / Extension。
  • 需要异步观察事实的,使用 Business Probe。

3. Core 标准埋点模型

Rust 公共类型位于 flare-im-core/crates/flare-im-contracts/src/instrumentation/mod.rs

类型说明
BusinessProbeEvent标准业务埋点事件
BusinessProbeKindmessage / conversation / participant / hook / sync / push / capability 等分类
BusinessProbeDeliverybest_effort / reliable_async / blocking_audit
BusinessProbeSink业务埋点投递端口
NoopBusinessProbeSink默认空实现,保证 Core 独立运行

事件核心字段:

字段说明
name稳定事件名,如 core.message.send.accepted
kind分类
delivery投递语义
schemapayload schema 版本
tenant_id / user_id来自 Ctx
request_id / trace_id幂等和追踪
conversation_id / message_id / subject_id业务定位
attributes轻量标签
payloadJSON 业务载荷

4. 标准事件名

事件名触发语义
core.hook.message.pre_send.invoked发前 Hook 被调用
core.hook.message.pre_send.allowed发前 Hook 放行
core.hook.message.pre_send.rejected发前 Hook 拒绝
core.hook.message.post_send.invoked发后 Hook 被调用
core.hook.message.delivery.observed送达 Hook 观测
core.hook.message.recall.invoked撤回 Hook 被调用
core.hook.message.read.observed已读 Hook 观测
core.hook.message.reaction.invoked表态 Hook 被调用
core.hook.conversation.lifecycle.observed会话生命周期 Hook 观测
core.hook.conversation.member.invoked会话成员 Hook 被调用
core.message.send.accepted发送请求通过校验并进入 Core 主链
core.message.send.rejected发送请求被 Hook 或 Core 校验拒绝
core.message.persisted消息完成持久化或入主队列
core.message.recalled消息撤回
core.conversation.created会话创建/ensure
core.conversation.updated会话资料或生命周期更新
core.conversation.participants.changed会话参与者增加、移除、角色变化
core.sync.executed多端同步执行
core.push.enqueued推送任务入队
core.capability.dispatched能力调用执行

5. 接入方式

5.1 进程内 Sink

适合 Rust 部署或 sidecar 同进程:

use flare_im_contracts::{BusinessProbeEvent, BusinessProbeSink, Ctx};
use flare_server_core::error::Result;

pub struct KafkaProbeSink;

#[async_trait::async_trait]
impl BusinessProbeSink for KafkaProbeSink {
    async fn emit(&self, ctx: &Ctx, event: BusinessProbeEvent) -> Result<()> {
        // 写 Kafka / NATS / 审计库
        Ok(())
    }
}

5.2 HookPlugin

适合跨语言业务系统:

  • pre_send 处理好友、群权限、风控等强门禁。
  • post_send 消费消息发送后事实。
  • delivery / message_read 消费送达和已读行为。
  • message_reaction 处理点赞、emoji、业务表态。
  • conversation_lifecycle 消费会话状态变化。
  • conversation_member 消费参与者变化。

消息和会话 Hook 的接入细节见 02-hook-plugin.md

5.3 Capability / Extension

适合需要业务命令结果的场景:

  • 计费:billing.im.message_usage.record
  • 风控特征:risk.feature.im_activity.append
  • 推荐特征:rec.relation.interaction.update

5.4 MQ / Webhook

适合批处理、数据平台、增长分析:

  • Core 侧投递 BusinessProbeEvent 到 MQ。
  • 业务侧按 nametenant_idschema 消费。
  • Webhook 只用于低 QPS 管理或审计场景。

6. 业务可实现的非侵入能力

业务能力推荐埋点/扩展
消息发送统计core.message.send.accepted
发送失败/拒绝分析core.message.send.rejected
群活跃度core.message.persisted + conversation kind
成员变更通知core.conversation.participants.changed
群生命周期分析core.conversation.updated
已读率message_read Hook / core.sync.executed
推送到达分析delivery Hook / core.push.enqueued
计费message / media / capability probe
风控特征pre_send Hook + probe 旁路
推荐特征message / relation / conversation probe

7. Hook 观测 payload 建议

Hook 观测事件建议使用 schema = "flare.im.hook_probe.v1",payload 保持可演进 JSON:

{
  "hook_name": "social-policy-pre-send",
  "operation": "flare.hook.v1.pre_send",
  "decision": "allow",
  "latency_ms": 12,
  "error_policy": "fail_fast",
  "require_success": true,
  "deny_reason_code": "",
  "conversation_type": "group",
  "message_type": "text"
}

字段约定:

字段说明
hook_name配置中的 Hook 名称
operationHookPlugin operation
decisionallow / reject / success / failed / timeout
latency_msHook 执行耗时
error_policyfail_fast / retry / ignore
require_success是否要求成功
deny_reason_code业务拒绝码
conversation_type / message_type选择器相关标签

8. 投递语义

Delivery语义主链影响
best_effort日志/指标即可不影响
reliable_async进入 MQ 或审计库,失败可重试不影响
blocking_audit严格审计点只用于合规明确要求

生产默认:

  • 消息、会话、同步埋点使用 reliable_async
  • 指标类使用 best_effort
  • 不要把普通 BI 埋点设置成 blocking_audit

9. 独立运行保证

Core 独立运行时:

  • 使用 NoopBusinessProbeSink
  • Hook 配置为空时跳过 Hook。
  • Capability 未部署时不影响消息、会话、同步核心链路。
  • 业务 bridge 不部署时,Core 只维护自身会话和参与者投影。

业务接入后:

  • 通过配置注入 Sink / Hook / Capability。
  • 业务失败按投递语义降级。
  • Core 不依赖业务 crate,不因业务不可用而无法启动。

10. 后续落地建议

优先级任务
P0Orchestrator 在发送成功/拒绝处发 BusinessProbeEvent
P0Conversation 在参与者变更处发 BusinessProbeEvent
P1Gateway 统一记录 HTTP API probe
P1Capability 增加 probe sink adapter
P1MQ probe sink 与配置化开关
P2数据平台 schema registry 与采样策略