遥测与分析
遥测与分析
相关源文件
本章引用的主要源码文件:
mem0-ts/package.jsonmem0-ts/src/client/config.tsmem0-ts/src/client/index.tsmem0-ts/src/client/mem0.tsmem0-ts/src/client/mem0.types.tsmem0-ts/src/client/telemetry.tsmem0-ts/src/client/telemetry.types.tsmem0-ts/src/client/tests/memoryClient.webhooks.test.tsmem0-ts/src/client/tests/telemetry-aliasing.test.tsmem0/memory/setup.pymem0/memory/telemetry.pytests/test_telemetry_aliasing.py
本文档描述了 Mem0 的遥测与分析系统,该系统通过 PostHog 收集使用指标以改进产品。关于 API 客户端的配置选项,请参见客户端 SDK。关于自托管部署配置,请参见部署模型。
目的与范围
Mem0 的遥测系统从 SDK 客户端(包括平台 API 客户端和自托管实例)捕获匿名化的使用指标,以了解功能采用情况、识别问题并改善开发者体验。该系统默认启用(选择退出),并与 PostHog 集成以进行事件处理和分析。
架构总览
遥测架构由 Python 中的核心 AnonymousTelemetry 类和 TypeScript 中的 UnifiedTelemetry 类组成。这些类与 PostHog 交互以传输事件数据。
Python 遥测架构
来源: mem0/memory/telemetry.py:73-132, mem0/memory/telemetry.py:186-210, mem0-ts/src/client/telemetry.ts:26-75
PostHog 集成
Mem0 使用 PostHog 作为其分析后端。在 Python 中,它使用 posthog 库;在 TypeScript 中,它通过 fetch 进行直接 API 集成。
配置常量(Python)
| 常量 | 值 | 文件位置 |
|---|---|---|
PROJECT_API_KEY | phc_hgJkUVJFYtmaJqrvf6CYN67TIQ8yhXAkWzUn9AMU4yX | mem0/memory/telemetry.py:15 |
HOST | https://us.i.posthog.com | mem0/memory/telemetry.py:16 |
MEM0_TELEMETRY | True(默认值) | mem0/memory/telemetry.py:14 |
MEM0_TELEMETRY 环境变量控制遥测是否启用。它接受布尔型字符串:"true"、"1"、"yes"。mem0/memory/telemetry.py:18-22
配置常量(TypeScript)
| 常量 | 值 | 文件位置 |
|---|---|---|
POSTHOG_API_KEY | phc_hgJkUVJFYtmaJqrvf6CYN67TIQ8yhXAkWzUn9AMU4yX | mem0-ts/src/client/telemetry.ts:15 |
POSTHOG_HOST | https://us.i.posthog.com/i/v0/e/ | mem0-ts/src/client/telemetry.ts:16 |
来源: mem0/memory/telemetry.py:14-22, mem0-ts/src/client/telemetry.ts:11-16
遥测系统组件
AnonymousTelemetry 类(Python)
AnonymousTelemetry 类处理 PostHog 客户端的生命周期。它包含一个 capture_event 方法,该方法在发送前使用系统信息(操作系统、Python 版本、处理器)丰富数据。mem0/memory/telemetry.py:98-110
身份拼接(别名)
Python 和 TypeScript SDK 都支持身份拼接,以将匿名本地 ID 与平台用户身份(电子邮件)合并。这确保了当使用 API 密钥初始化 MemoryClient 时,来自 CLI 或本地 OSS 实例的使用情况可以与平台账户关联。
- 机制: SDK 会触发一个
$identify事件,并将$anon_distinct_id设置为本地匿名 ID。mem0/memory/telemetry.py:116-131,mem0-ts/src/client/telemetry.ts:77-113 - 持久化: 为避免冗余的身份识别调用,标记会存储在
~/.mem0/config.json中。mem0/memory/setup.py:100-119,mem0-ts/src/client/config.ts:140-165
采样机制(Python OSS)
为减少噪音和成本,Mem0 在 OSS Python SDK 中为"热路径"事件实现了采样机制。
- 默认采样率: 0.1(10% 的事件)。
mem0/memory/telemetry.py:31 - 配置: 通过
MEM0_TELEMETRY_SAMPLE_RATE环境变量控制。mem0/memory/telemetry.py:47 - 生命周期事件: 某些事件会绕过采样,始终以 100% 的概率触发。这些事件包括
mem0.init、mem0.reset、mem0._create_procedural_memory和$identify。mem0/memory/telemetry.py:52
来源: mem0/memory/telemetry.py:31-70
事件属性
捕获的元数据(Python)
Python SDK 捕获广泛的系统元数据:
| 属性 | 来源 |
|---|---|
client_source | 硬编码为 "python" |
client_version | mem0.__version__ |
python_version | sys.version |
os | sys.platform |
os_version | platform.version() |
processor | platform.processor() |
来源: mem0/memory/telemetry.py:99-110
捕获的元数据(TypeScript 客户端)
当为 MemoryClient 捕获事件时,系统会记录:
function:实例的构造函数名称(例如MemoryClient)。method:被调用的具体方法(例如add)。api_host:API 调用的目标主机。client_version:在构建时注入。
来源: mem0-ts/src/client/telemetry.ts:136-150
事件命名约定
事件根据 SDK 和部署方式遵循命名模式:
- 平台客户端(Python/TS):
client.{method_name}(例如client.init、client.add)mem0-ts/src/client/telemetry.ts:148 - OSS SDK(Python):
mem0.{method_name}(例如mem0.init、mem0.add)mem0/memory/telemetry.py:186
隐私与选择退出
禁用遥测
可以通过将 MEM0_TELEMETRY 环境变量设置为 False(Python)或 false(TS)来禁用遥测。
- Python: 在
AnonymousTelemetry.__init__和capture_event中处理。mem0/memory/telemetry.py:14-22,mem0/memory/telemetry.py:75-78 - TypeScript: 在
UnifiedTelemetry.captureEvent和isTelemetryEnabled中处理。mem0-ts/src/client/telemetry.ts:11-14,mem0-ts/src/client/telemetry.ts:40
用户标识
用于遥测的 user_id 由 Python 中的 get_or_create_user_id 和 TypeScript 中的 getOrCreateMem0UserId 管理。
- 它首先检查
MEM0_DIR(默认为~/.mem0)中的本地config.json文件。mem0/memory/setup.py:9-11,mem0-ts/src/client/config.ts:37 - 在 Python 中,如果提供了
vector_store,它会尝试检索或持久化一个user_identity向量,以在使用相同数据库的不同环境中维护稳定的 ID。mem0/memory/setup.py:122-154
来源: mem0/memory/setup.py:122-154, mem0-ts/src/client/config.ts:81-96
实现细节
线程安全单例(Python)
OSS 遥测使用线程安全的惰性单例模式,以确保每个进程只存在一个 PostHog 客户端。它使用 threading.Lock() 进行实例化,并使用 atexit.register() 确保后台工作线程在进程退出时被干净地关闭。
来源: mem0/memory/telemetry.py:139-168
TypeScript 构建时版本控制
TypeScript SDK 在构建时注入版本号。在非打包环境(如测试)中,它会回退到 "dev"。
来源: mem0-ts/src/client/telemetry.ts:7-8