[sdk/local-evaluation] getEnvironmentFlags() evaluations are not tracked for analytics
还没有人认领这个 Issue。
评估
- 难度
- 2/5
- 预计耗时
- 1 小时以内
- 新手友好度
- 85/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- nodejs, typescript
- 领域
- analytics
调研方向
该 issue 指向 sdk/index.ts 中第 640 行附近的 getEnvironmentFlagsFromDocument,其中调用 Flags.fromEvaluationResult 时没有传入 analytics processor。请将其与第 669 行附近的 getIdentityFlagsFromDocument 比较,后者已经传入了 this.analyticsProcessor。运行 issue 中的复现脚本:当本地运行结果与远程运行一样报告 {"my_feature":5} 时即为完成。
由索引模型根据 Issue 内容生成。
描述
Problem
With enableLocalEvaluation: true, flag evaluations from getEnvironmentFlags() are never counted towards analytics. The same code against the same environment reports usage correctly when local evaluation is off, so flag analytics are effectively unavailable to anyone evaluating locally.
The cause looks like a missed argument in getEnvironmentFlagsFromDocument:
// sdk/index.ts:640
const flags = Flags.fromEvaluationResult(evaluationResult);
The other three evaluation paths all pass the processor through:
getIdentityFlagsFromDocument(local) ->sdk/index.ts:669, passesthis.analyticsProcessorgetEnvironmentFlagsFromApi(remote) ->sdk/index.ts:689getIdentityFlagsFromApi(remote) ->sdk/index.ts:710
Since the other local path already tracks, this doesn't look like a deliberate decision to skip analytics during local evaluation.
For what it's worth, the Python client passes it in the equivalent method, so the two SDKs behave differently here:
# flagsmith/flagsmith.py:535, _get_environment_flags_from_document
return Flags.from_evaluation_result(
evaluation_result=evaluation_result,
analytics_processor=self._analytics_processor,
default_flag_handler=self.default_flag_handler,
)
Impact
getEnvironmentFlags() is the common path for server-side usage, and local evaluation is the recommended mode there, so this combination silently reports no usage at all. Nothing warns or errors, and the dashboard just shows the flag as unused. We ran into it while using analytics to decide which stale flags were safe to delete, where a flag wrongly showing zero evaluations is the dangerous direction to be wrong in.
Reproduction
Standalone script, no account needed; it stubs the API locally and compares the two modes.
const http = require('node:http');
const { Flagsmith } = require('flagsmith-nodejs');
const ENV_DOC = {
api_key: 'ser.repro',
project: { id: 1, name: 'repro', organisation: { id: 1, name: 'org', feature_analytics: true,
stop_serving_flags: false, persist_trait_data: true }, hide_disabled_flags: false, segments: [] },
feature_states: [{ feature: { id: 1, name: 'my_feature', type: 'STANDARD' },
enabled: true, feature_state_value: null, featurestate_uuid: 'fs-1', multivariate_feature_state_values: [] }],
identity_overrides: []
};
const API_FLAGS = [{ feature: { id: 1, name: 'my_feature', type: 'STANDARD' },
enabled: true, feature_state_value: null }];
(async () => {
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
if (req.url.includes('environment-document')) return res.end(JSON.stringify(ENV_DOC));
if (req.url.includes('/flags')) return res.end(JSON.stringify(API_FLAGS));
res.end('{}');
});
await new Promise(r => server.listen(0, '127.0.0.1', r));
const apiUrl = `http://127.0.0.1:${server.address().port}/api/v1/`;
async function run(local) {
const f = new Flagsmith({ environmentKey: 'ser.repro', apiUrl,
enableLocalEvaluation: local, enableAnalytics: true });
const flags = await f.getEnvironmentFlags();
for (let i = 0; i < 5; i++) await flags.isFeatureEnabled('my_feature');
const buf = { ...(f.analyticsProcessor?.analyticsData ?? {}) };
f.environmentDataPollingManager?.stop();
console.log(`${local ? 'LOCAL ' : 'REMOTE'} -> buffer ${JSON.stringify(buf)}`);
}
await run(true);
await run(false);
server.close();
})();
Observed:
LOCAL -> buffer {}
REMOTE -> buffer {"my_feature":5}
Expected: both report {"my_feature":5}.
Version: [email protected] (current npm latest), Node 24.13.0. Line numbers above are from main as of today, which still has the same call.
Workaround
Calling trackFeature(name) on the processor after each evaluation restores the counts, which is what we're doing for now.
- 主要语言
- TypeScript
- 星标
- 30
- 派生
- 28
- 平均合并
- 7 天 23 小时
- 30 天内合并 PR
- 3
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
Flagsmith/flagsmith-nodejs-client 的其他 Issue
-
难度 4/5 3-5 天 新手友好度 65/100
-
难度 4/5 3-5 天 新手友好度 48/100
-
难度 4/5 3-5 天 新手友好度 25/100
-
难度 4/5 3-5 天 新手友好度 55/100
Flagsmith/flagsmith-nodejs-client#273 · 1 条评论 ·
-
[sdk/local-evaluation] Duplicate identity override entries silently drop feature overrides可能已有人在做 @xolott-ark 于 157 天前认领。 未关闭
难度 3/5 1-2 天 新手友好度 68/100
Flagsmith/flagsmith-nodejs-client#267 · 5 条评论 ·
查看 Flagsmith/flagsmith-nodejs-client 的全部 Issue