Skip to content

Commit 71a278f

Browse files
nicklaslclaude
andcommitted
fix(wasm): preserve sdk info in telemetry data during flush
bounded_flush_logs was overwriting telemetry_data from the resolve logger (which contains sdk info) with the delta snapshot from the Telemetry module (which always has sdk: None). This caused sdk_id to never appear in VictoriaMetrics. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7aa5935 commit 71a278f

File tree

3 files changed

+47
-4
lines changed

3 files changed

+47
-4
lines changed

openfeature-provider/js/proto/test-only.proto

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,22 @@ message WriteFlagLogsRequest {
99
repeated bytes flag_resolve_info = 4;
1010
}
1111

12+
message Sdk {
13+
oneof sdk {
14+
SdkId id = 1;
15+
string custom_id = 2;
16+
}
17+
string version = 3;
18+
}
19+
20+
enum SdkId {
21+
SDK_ID_UNSPECIFIED = 0;
22+
SDK_ID_JS_LOCAL_SERVER_PROVIDER = 22;
23+
}
24+
1225
message TelemetryData {
1326
// Information about the SDK/provider
14-
// Sdk sdk = 2;
27+
Sdk sdk = 2;
1528

1629
ResolveLatency resolve_latency = 4;
1730
repeated ResolveRate resolve_rate = 5;

openfeature-provider/js/src/WasmResolver.test.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
22
import { UnsafeWasmResolver, WasmResolver } from './WasmResolver';
33
import { readFileSync } from 'node:fs';
44
import { ResolveProcessRequest } from './proto/confidence/wasm/wasm_api';
5-
import { ResolveReason } from './proto/confidence/flags/resolver/v1/types';
6-
import { WriteFlagLogsRequest } from './proto/test-only';
5+
import { ResolveReason, SdkId } from './proto/confidence/flags/resolver/v1/types';
6+
import { SdkId as TestSdkId, WriteFlagLogsRequest } from './proto/test-only';
77

88
const moduleBytes = readFileSync(__dirname + '/../../../wasm/confidence_resolver.wasm');
99
const stateBytes = readFileSync(__dirname + '/../../../wasm/resolver_state.pb');
@@ -138,6 +138,31 @@ describe('basic operation', () => {
138138
expect(total).toBeGreaterThan(0);
139139
}
140140
});
141+
142+
it('should include sdk info in telemetry data', () => {
143+
const requestWithSdk: ResolveProcessRequest = {
144+
deferredMaterializations: {
145+
...RESOLVE_REQUEST.deferredMaterializations!,
146+
sdk: {
147+
id: SdkId.SDK_ID_JS_LOCAL_SERVER_PROVIDER,
148+
version: '1.0.0',
149+
},
150+
},
151+
};
152+
wasmResolver.resolveProcess(requestWithSdk);
153+
154+
const decoded = WriteFlagLogsRequest.decode(wasmResolver.flushLogs());
155+
const telemetry = decoded.telemetryData;
156+
157+
expect(telemetry).toBeDefined();
158+
// SDK info must be preserved alongside telemetry metrics
159+
expect(telemetry!.sdk).toBeDefined();
160+
expect(telemetry!.sdk!.id).toBe(TestSdkId.SDK_ID_JS_LOCAL_SERVER_PROVIDER);
161+
expect(telemetry!.sdk!.version).toBe('1.0.0');
162+
// Telemetry metrics should also be present
163+
expect(telemetry!.resolveRate.length).toBeGreaterThan(0);
164+
expect(telemetry!.resolveLatency).toBeDefined();
165+
});
141166
});
142167
});
143168
});

wasm/rust-guest/src/lib.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,12 @@ wasm_msg_guest! {
188188

189189
fn bounded_flush_logs(_request:Void) -> WasmResult<WriteFlagLogsRequest> {
190190
let mut req = RESOLVE_LOGGER.checkpoint();
191-
req.telemetry_data = Some(TELEMETRY.delta_snapshot(&LAST_FLUSHED));
191+
let mut telemetry = TELEMETRY.delta_snapshot(&LAST_FLUSHED);
192+
// Preserve SDK info from resolve logger (delta_snapshot doesn't track it)
193+
if let Some(existing_td) = &req.telemetry_data {
194+
telemetry.sdk = existing_td.sdk.clone();
195+
}
196+
req.telemetry_data = Some(telemetry);
192197
ASSIGN_LOGGER.checkpoint_fill_with_limit(&mut req, LOG_TARGET_BYTES, false);
193198
Ok(req)
194199
}

0 commit comments

Comments
 (0)