@crvouga/mockingbird-service-posthog (英语)
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
状态模拟器 邮箱 测试套间:远程特征旗评价(/flags 页:1
遗产 /decide 形状),远程配置,事件抓取(/batch/, (中文(简体) ), /e/, (中文(简体) ), /i/v0/e/, (中文(简体) ),
分会话记录录入、hog-js后资产和调查终点以及片段
管理 API 我们的工具和餐具呼叫(feature-flag list/create/patch, HogQL). 每个旗帜
通过管理路径设定每个测试,因此无法到达我们的应用程序内覆盖路径(限制)
布尔斯人, getConfig 有效载荷、EMR服务器闸门、成员-应用程序变体)成为可控制装置,以及
堆栈运行从未达到 us.i.posthog.com。 。 。 .
- 行动范围: 支助
- 合同
openapi.yaml)由后浩格-节点5.52.2的线形手写出,@posthog/core1.54.0 (后反应-内生 4.72.1''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 我们自己的原始取来。 所有三个SDK都被证明是与之相反的(posthog.sdk.test.ts) (中文(简体) ).
安装
npm install -D @crvouga/mockingbird-service-posthog
仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务
npx mockingbird-posthog serve, (中文(简体) ), createServer 从 ./server (节点),或 createRuntime 与
任何获取服务器.
使用量
将应用的 PostHog 主机指向模拟器( 默认为8795 端口 ) :
| 应用 | 变量 |
|---|---|
| 后端(旗子、抓取、网站购买槽) | POSTHOG_HOST, (中文(简体) ), POSTHOG_API_KEY |
| EMR 后端 | POSTHOG_HOST, (中文(简体) ), POSTHOG_API_KEY |
| EMR 前端( 浏览器后hog- js 和服务器原始抓取) | NEXT_PUBLIC_POSTHOG_HOST, (中文(简体) ), NEXT_PUBLIC_POSTHOG_KEY |
| 成员应用 | public-config.json[stage] 主机,或 ?POSTHOG_HOST=&POSTHOG_API_KEY= 在线(G-P1) |
| Python 补充管理服务 | POSTHOG_HOST |
npx mockingbird-posthog serve --port 8795 --import-flags dev
import { PostHog } from "posthog-node"
import { createRuntime } from "@crvouga/mockingbird-service-posthog"
// Test setup: the emulator and the flags this worker should see.
const emulator = createRuntime()
const admin = (path: string, body: unknown, method = "PUT") =>
emulator.fetch(
new Request(`http://posthog.test/__admin${path}`, { method, body: JSON.stringify(body) }),
)
// Per-worker namespaces: map each worker's project token (the SDKs cannot add headers)…
await admin("/credentials", { credentials: { phc_worker1: "w1" } })
// …then set flags in that namespace.
await admin("/flags/shop-coupons?namespace=w1", { default: true })
await admin("/flags/rx-category-intake?namespace=w1", {
default: true,
payload: { categories: ["trt"] },
overrides: [{ distinct_id: "42", value: false }, { email: "[email protected]", value: "beta" }],
})
await admin("/flags/mobile-smart-links?namespace=w1", undefined, "DELETE") // absent again
// The application's posthog-node client. Only its fetch changes: requests reach the
// emulator in this process instead of us.i.posthog.com.
const posthog = new PostHog("phc_worker1", {
fetch: (url, options) => emulator.fetch(new Request(url, options)),
})
await posthog.getFeatureFlag("shop-coupons", "7") // true
await posthog.getFeatureFlag("rx-category-intake", "42") // false
posthog.capture({ distinctId: "7", event: "coupon_applied" })
await posthog.shutdown()
路线
| 路线 | 行为 |
|---|---|
POST /flags/?v=2 (单位:千美元)&config=true(中文(简体) ) | 后浩格-节点,后浩克-反应-内生,后浩克-js. 体质 {token, distinct_id, person_properties?, groups?, flag_keys_to_evaluate?, …}答复 {flags: {<key>: {key, enabled, variant, reason, metadata: {id, version, description, payload?}}}, errorsWhileComputingFlags, requestId, evaluatedAt}· ; payload 这是JSON 字符串 并且只伴有启用的旗帜. config=true 添加远程配置字段 . |
POST /flags?v=2 | 同样的路线,没有后遗症: EMR前端的生取,身体 {api_key, distinct_id, person_properties?}。 。 。 . |
POST /flags/ (无) v,或 v=1, (中文(简体) ), POST /decide/?v=3 | 遗产形状 {featureFlags: {k: bool | variant}, featureFlagPayloads: {k: "<json>"}, errorsWhileComputingFlags, config, …} (Python客户端). /decide/?v=4 回答 v2 形状 . |
GET /array/{token}/config, (中文(简体) ), …/config.js | 远程配置 : {supportedCompression: ["gzip","gzip-js"], hasFeatureFlags: true, analytics: {endpoint: "/i/v0/e/"}, sessionRecording: false | {endpoint: "/s/"}, surveys: false, …}; 数据 .js 窗体组合 window._POSTHOG_REMOTE_CONFIG[token]。 。 。 . hasFeatureFlags 总是真实的(假使后hog-react-native跳过旗下加载). |
POST /batch/ | {api_key, batch: [{event, distinct_id, properties, timestamp, uuid}], sent_at},通常情况下 Content-Encoding: gzip。 。 。 . |
POST /e/, (中文(简体) ), POST /i/v0/e/ | 一个事件,一系列事件,或者 {api_key, batch}; 身体可能是生的gzip (gzip-js),基数64 data= 表单( 表格)compression=base64),或叫"JSON". 已知事件 uuid 被贬低. |
POST /s/ | 会议记录: 已计(GET /__admin/recordings),从未被存储. |
GET /static/recorder.js, (中文(简体) ), /static/{ver}/recorder.js | 惰性脚本. |
GET /api/surveys/?token=, (中文(简体) ), /api/web_experiments/?token= | {surveys: []}, (中文(简体) ), {experiments: []}。 。 。 . |
GET/POST /api/projects/{id}/feature_flags/, (中文(简体) ), GET/PATCH …/{flagId}/ | 需要持枪者私人钥匙。 列表页面 {count, next, previous, results} (单位:千美元)limit编号 :offset• 旗帜 filters.groups 编号 : multivariate 编号 : payloads 从旗子模型中衍生出来;实验旗保留了完整的变种配置,并创建/patch parse filters (见下文). flagId 是数字代号还是密钥. |
GET/POST /api/projects/{id}/experiments/, (中文(简体) ), GET/PATCH …/{experimentId}/ | 项目实验的个人钥匙管理:名称,参数,度量衡,日期,存档状态,以及活相接的旗帜. 新的旗帜草稿有控制/测试变体,不活动;设置 start_date 激活它们 设置 end_date 或者说 archived 保留了旗帜活动。 列表是最新的第一位,带有终止限制/抵消链接(包括命名空间前缀). 遗留变体/滚出/负载参数草案更新了共享旗;正在运行的旗帜更改使用特征旗 API. |
POST /api/projects/{id}/query/ | 猪肉QL {query: {kind: "HogQLQuery", query}} → {results, columns} 从罐装的答案(PUT /__admin/settings {"queryResults": […]}, (中文(简体) ), {results: []} 否则. |
每条路线都用它后面的斜线来回答。 错误使用 PostHog
{type, code, detail, attr} 机构: 401 invalid_api_key 没有项目代号,400
missing_distinct_id、400个 invalid_payload 404 为不可毁谤的身体 not_found。 。 。 .
旗帜语义
- 缺席对
false。 。 。 . 一个旗子,它的default省略(或null) 完全没有返回 除非一个覆盖匹配;default: false返回时enabled: false成员应用软件hasFlag仅因缺席而发生静态默认。 非活动或删除 旗帜从不返回(如PostHog). - 目标: 按顺序排列
distinct_id或通过person_properties.email默认值. - 备选案文: 字符串值是一个变体(
enabled: true, variant: "<key>"我们的后端, EMR和Python客户端都读作true。 。 。 . - 有效载荷 : 任意 JSON; 存储并发送为 JSON 字符串 PostHog 使用. 后门的
getConfig只接受物体有效载荷. - 管理层
filters• 型号:distinct_id编号 :email财产组合成为被取代; 100%的无财产群体为默认(其variant,否则最大多变量 变体,其他true);在0%或部分推出时是false; 组和其他财产 团体被忽略(决定性,不散开). 创建/ patch 拒绝数组/ scalarfilters.payloads在改变旗帜或链接之前使用 400 实验状态。 字典要求对照 PostHog 的序列器回归 和当地合同;种子172181039通过自我均等,而不是现场管理平等.
管理员(超过标准合同)
| 路线 | 效果 |
|---|---|
PUT /__admin/flags/:key | {default?: bool | "variant" | null, payload?: any, overrides?: [{distinct_id? | email?, value?, payload?}], active?, name?}. 弃权 default 使得每个人的旗子都不存在 上面的名字。 弹出 metadata.version。 。 。 . |
DELETE /__admin/flags/:key | 删除旗帜( 缺席 ) . |
PUT /__admin/flags | 块数 : {flags: {<key>: spec}, replace?: true} 或者说 [{key, …spec}]。 。 。 . |
GET /__admin/flags, (中文(简体) ), GET /__admin/flags/:key | 名字空间的旗帜. |
GET /__admin/flags/evaluate?distinct_id=&email= | 什麽 /flags 对这一主题的答复,如 {flags: {key: value}}。 。 。 . |
POST /__admin/flags/import | {from: "state.json", env: "dev" | "prod", project?: "member-app" | "emr", replace?} 消费者应用软件的捆绑副本中的种子 docs/feature-flags/state.json (或通过) state: {flags: […]} 。 。 . live → true (或最大变体), rollout 0 编号 : targeted 编号 : ramping → false, (中文(简体) ), inactive 编号 : missing ——缺席. |
POST /__admin/flags/bump | 不更改服务器侧; 返回 a generation 计数器。 文件记录的清除应用程序旗下缓存的时刻(后端) getAllFlagsAndPayloads 每个用户60 s;EMR前端服务器60 s / 10 s. |
GET /__admin/events?distinct_id=&event=&since= | 被俘事件,最古老的since: 时代 ms 或 ISO, 模拟时钟. $exception 仅保留 $lib, (中文(简体) ), $lib_version, (中文(简体) ), $exception_level, (中文(简体) ), $session_id;每个事件(以及来自 $set) (中文(简体) ). |
GET /__admin/recordings | {count} 联 合 国 /s/ 员额. |
GET/PUT /__admin/settings | {sessionRecording?: bool, queryResults?: [{match?, columns?, results}]}。 。 。 . |
错误预设( E)POST /__admin/faults {"preset": "<name>", "count"?: n}· ; GET /__admin/faults/presets, (中文(简体) ),
每个人在 /flags 财务报告和审定财务报表 /decide数字 : flags_5xx, (中文(简体) ), flags_429 (单位:千美元)retry-after: 1, (中文(简体) ), flags_hang
(1.5 s,通过后端严格和EMR 1 s s 比赛), errors_while_computing
(单位:千美元)errorsWhileComputingFlags: true旗帜还在, quota_limited
(单位:千美元)quotaLimited: ["feature_flags"]没有旗帜。 加号 capture_5xx 在捕捉的终点.
每个预设每个路线都增加一条规则,所以 count 每个路线适用.
命名空间
PostHog SDK 无法添加信头 。 选择命名空间 :
- 主机前缀 (小学):
POSTHOG_HOST=http://127.0.0.1:8795/__admin/ns/w1。每个 SDK 构建${host}/path这样/__admin/ns/w1/flags/?v=2选择w1。 。 。 . - 项目令牌数字 :
PUT /__admin/credentials {"credentials": {"phc_…": "w1"}}。符号是 读取自/array/{token}/…, (中文(简体) ),?token=,尸体(token, (中文(简体) ),api_key,或者第一个批次的 事件properties.token,在解码gzip/base64后,或个人钥匙的Authorization: Bearer在管理API. x-mockingbird-namespace对原始客户来说.
管理API的 next 页面 URL 保存已配置的管理员前缀和名空间.
在每个页面请求中发送授权头中的个人密钥 .
故意不模拟
- 推出、组别、组(组织)目标确定和地方评价的百分比
(单位:千美元)
/api/feature_flag/local_evaluation:旗帜从明确角度进行确定性评估 覆盖和默认. - 实验统计、接触群、计量执行、特别发射/存档/船舶终点、批准政策、高级试验过滤器以及
feature_flag配置通过实验写出. 管理旗使用现有的全名空间项目别名模型;实验记录额外通过项目id过滤. - 会话记录内容,热映射,调查和网络实验(端点回答为空).
- HogQL执行:查询回答罐头结果.
- 人物简介 :
$identify编号 :$set事件为断言而存储,但不反馈 目标; 发送person_properties打开/flags就像SDK一样. - 按管理API上的工程id进行项目隔离:每个命名空间设置一面旗.
- 真正的远程配置字段 超过SDKs读取.
API 密码
| 导出 | 仁爱 | 说明 |
|---|---|---|
PostHogAPI | 类 | 进程模拟器 : fetch(request), (中文(简体) ), reset(), (中文(简体) ), evaluate(subject, keys?), (中文(简体) ), events(query?), (中文(简体) ), flagList(), (中文(简体) ), state选项: sqlite, (中文(简体) ), now, (中文(简体) ), namespace, (中文(简体) ), flags, (中文(简体) ), settings。 。 。 . |
createRuntime | 函数 | 全面服务合同的仿真器(保健、管理员、前缀/托肯/标题的命名空间、预设、日记)。 选项 : flags, (中文(简体) ), settings, (中文(简体) ), clock, (中文(简体) ), seed, (中文(简体) ), adminKey, (中文(简体) ), onLog, (中文(简体) ), sqlite。 。 。 . |
POSTHOG_PRESETS | 对象 | 每个命名的断层预设. |
POSTHOG_NAMESPACE | 字符串 | 服务名称, "posthog"。 。 。 . |
evaluateFlag | 函数 | 评价一个旗帜记录 {distinct_id, person_properties} (单位:千美元)undefined = 缺席). |
parseFlagSpec | 函数 | 将管理旗帜机构验证为 FlagSpec。 。 。 . |
payloadString | 函数 | 邮电站存储时的有效载荷(JSON字符串,或 null) (中文(简体) ). |
specsFromState, (中文(简体) ), valueForState | 函数 | 地图a state.json 文件(或一个旗帜国)改为旗帜规格. |
ACME_FLAG_STATE | 对象 | 消费者应用软件的捆绑和修剪本 docs/feature-flags/state.json。 。 。 . |
decodePostHogBody, (中文(简体) ), tokenFromBody | 函数 | 取消 PostHog 机身信封(gzip, gzip-js, base64) data=); 在一个体内找到项目标志. |
scrubProperties | 函数 | 在存储前应用了事件财产洗涤. |
document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds | 数值 | 销售商为OpenAPI合同及其业务代号. |
createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT (单位:千美元)./server(中文(简体) ) | 节点 | 服务过来 node:http; 数据 serve CLI目标(--import-flags dev|prod, (中文(简体) ), --session-recording; 蚌埠8795. |
部分 嘲笑鸟。 。 。 .