@nwire/telemetry-otel 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -36,17 +36,11 @@ detach();
36
36
 
37
37
  ## When to use
38
38
 
39
- When you want production traces in your APM. Fits L4 and up.
39
+ When you want production traces in your APM.
40
40
 
41
- ## Standalone use
41
+ ## Full recipe
42
42
 
43
- For developers using `@nwire/telemetry-otel` **without the rest of Nwire** pair it with any TypeScript project, any container, any HTTP framework.
44
-
45
- ```ts
46
- // See the package's main entry (src/) for the standalone surface.
47
- // The exports below work without @nwire/app or @nwire/forge.
48
- import {} from /* ...standalone exports... */ "@nwire/telemetry-otel";
49
- ```
43
+ See [Production observability with OpenTelemetry](https://nwire.dev/recipes/observability-otel) for the end-to-end wiring (BatchSpanProcessor, sampling, redaction, causation-chain explanation, production checklist).
50
44
 
51
45
  ## Within nwire-app
52
46
 
@@ -60,8 +54,3 @@ const app = createApp({
60
54
  });
61
55
  // Adapter/plugin wiring happens here when applicable.
62
56
  ```
63
-
64
- ## See also
65
-
66
- - [Architecture sketch §05 — Adapters tier](../../architecture-sketch.html#packages)
67
- - Sibling packages: [@nwire/observability](../nwire-observability), [@nwire/logger-pino](../nwire-logger-pino)
@@ -1 +1 @@
1
- {"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAmB,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAA4B,MAAM,cAAc,CAAC;AAEzE,MAAM,WAAW,yBAAyB;IACxC,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;CAC/C;AAUD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,yBAAyB,GACjC,MAAM,IAAI,CAwTZ"}
1
+ {"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAmB,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAA4B,MAAM,cAAc,CAAC;AAEzE,MAAM,WAAW,yBAAyB;IACxC,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;CAC/C;AAUD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,yBAAyB,GACjC,MAAM,IAAI,CA4SZ"}
package/dist/exporter.js CHANGED
@@ -45,9 +45,7 @@ export function attachOtelExporter(runtime, options) {
45
45
  const tracer = options.tracer;
46
46
  const prefix = options.spanNamePrefix ?? "nwire.";
47
47
  const eventsAsSpans = options.eventsAsSpans ?? false;
48
- const allowed = options.kinds
49
- ? new Set(options.kinds)
50
- : null;
48
+ const allowed = options.kinds ? new Set(options.kinds) : null;
51
49
  // Open spans, keyed by envelope.messageId (action) or call+messageId
52
50
  // pair (external call). When the matching completion arrives we close.
53
51
  const actionSpans = new Map();
@@ -267,9 +265,7 @@ export function attachOtelExporter(runtime, options) {
267
265
  attributes: {
268
266
  "nwire.external.call": rec.call,
269
267
  "nwire.external.target": rec.target,
270
- ...(rec.idempotencyKey
271
- ? { "nwire.external.idempotency_key": rec.idempotencyKey }
272
- : {}),
268
+ ...(rec.idempotencyKey ? { "nwire.external.idempotency_key": rec.idempotencyKey } : {}),
273
269
  ...(rec.envelope ? envelopeAttrs(rec.envelope) : {}),
274
270
  "nwire.app": rec.appName,
275
271
  },
@@ -1 +1 @@
1
- {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "@nwire/telemetry-otel",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "private": false,
5
5
  "description": "OpenTelemetry bridge for the Nwire canonical telemetry stream. Translates every Telemetry record into OTLP spans + events. Plug in any OTEL exporter (Datadog, Honeycomb, Tempo, Vector → GreptimeDB).",
6
+ "license": "MIT",
6
7
  "files": [
7
8
  "dist",
8
- "src"
9
+ "src",
10
+ "LICENSE"
9
11
  ],
10
12
  "type": "module",
11
13
  "main": "./dist/telemetry-otel.js",
@@ -20,11 +22,13 @@
20
22
  "access": "public"
21
23
  },
22
24
  "dependencies": {
23
- "@nwire/forge": "0.7.0"
25
+ "@nwire/forge": "0.8.0"
24
26
  },
25
27
  "devDependencies": {
26
28
  "typescript": "^5.6.0",
27
- "vitest": "^4.0.18"
29
+ "vitest": "^4.0.18",
30
+ "zod": "^4.0.0",
31
+ "@nwire/messages": "0.8.0"
28
32
  },
29
33
  "scripts": {
30
34
  "build": "tsc",
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Correlation E2E — depth-5 causation chain through @nwire/forge + the
3
+ * OTel bridge, optionally end-to-end through Vector → GreptimeDB.
4
+ *
5
+ * ## What this test proves
6
+ *
7
+ * Action.1 → Step1Done → Workflow.1 dispatches Action.2 → Step2Done
8
+ * → Workflow.2 dispatches Action.3 → … five levels deep.
9
+ *
10
+ * Every level carries the SAME correlationId (the trace handle) and
11
+ * chained causationIds (each action's envelope.causationId points at
12
+ * the previous level's event.messageId). The exporter must:
13
+ *
14
+ * 1. Open exactly one span per dispatched action (5 spans).
15
+ * 2. Stitch event.published as a span event on the open action span.
16
+ * 3. Preserve correlationId on every span so a trace query returns
17
+ * the entire chain.
18
+ * 4. Carry causationId so parent-child reconstruction is possible
19
+ * downstream.
20
+ *
21
+ * ## Two run modes
22
+ *
23
+ * - DEFAULT (no env): fake tracer, in-memory. Asserts every invariant
24
+ * above. Runs in `pnpm test`. Docker-free.
25
+ *
26
+ * - RUN_INTEGRATION=1: additionally pushes the captured spans as
27
+ * JSON-encoded log records to GreptimeDB's HTTP log-ingest endpoint
28
+ * (the same Vector → Greptime path documented in vector.toml), then
29
+ * queries Greptime's HTTP SQL endpoint to confirm the round-trip.
30
+ * Requires `docker compose -f docker-compose.yml -f docker-compose.telemetry.yml up -d`.
31
+ *
32
+ * ## What this does NOT catch
33
+ *
34
+ * - Network partitions between Vector and Greptime (Vector buffers;
35
+ * this test doesn't exercise the buffer drain).
36
+ * - Sampling drops at the SDK level (we don't run the real BatchSpanProcessor).
37
+ * - Schema drift between OTLP and Greptime's storage model (we use the
38
+ * log-events path, not the OTLP-protobuf path; see docs/internals/logger-correlation-e2e.md).
39
+ */
40
+
41
+ import { describe, it, expect } from "vitest";
42
+ import { z } from "zod";
43
+ import * as forge from "@nwire/forge";
44
+ import { defineEvent, type EventDefinition } from "@nwire/messages";
45
+ import { attachOtelExporter } from "../telemetry-otel";
46
+ import type { OtelTracer, OtelSpan } from "../telemetry-otel";
47
+
48
+ // ─── Captured-span fake tracer ────────────────────────────────────────
49
+
50
+ interface CapturedSpan {
51
+ name: string;
52
+ attributes: Record<string, unknown>;
53
+ events: Array<{ name: string; attrs?: Record<string, unknown> }>;
54
+ status: { code: number; message?: string } | null;
55
+ ended: boolean;
56
+ startTime?: number | Date;
57
+ endTime?: number | Date;
58
+ }
59
+
60
+ function makeCapturingTracer(): { tracer: OtelTracer; spans: CapturedSpan[] } {
61
+ const spans: CapturedSpan[] = [];
62
+ const tracer: OtelTracer = {
63
+ startSpan(name, options) {
64
+ const rec: CapturedSpan = {
65
+ name,
66
+ attributes: { ...(options?.attributes ?? {}) },
67
+ events: [],
68
+ status: null,
69
+ ended: false,
70
+ startTime: options?.startTime,
71
+ };
72
+ spans.push(rec);
73
+ const span: OtelSpan = {
74
+ setAttribute(k, v) {
75
+ rec.attributes[k] = v;
76
+ },
77
+ setAttributes(attrs) {
78
+ Object.assign(rec.attributes, attrs);
79
+ },
80
+ addEvent(eventName, attrs) {
81
+ rec.events.push({ name: eventName, attrs });
82
+ },
83
+ recordException() {
84
+ /* noop */
85
+ },
86
+ setStatus(s) {
87
+ rec.status = { ...s };
88
+ },
89
+ end(endTime) {
90
+ rec.ended = true;
91
+ rec.endTime = endTime;
92
+ },
93
+ };
94
+ return span;
95
+ },
96
+ };
97
+ return { tracer, spans };
98
+ }
99
+
100
+ // ─── Domain: depth-5 chain ────────────────────────────────────────────
101
+ //
102
+ // step1 → Step1Done → workflow12 → step2 → Step2Done → workflow23 → … →
103
+ // step5. Five actions, four workflows in between, five events emitted.
104
+
105
+ const DEPTH = 5;
106
+
107
+ interface ChainModule {
108
+ app: forge.AppDefinition;
109
+ actions: forge.ActionDefinition[];
110
+ }
111
+
112
+ function makeChain(): ChainModule {
113
+ const events: EventDefinition[] = [];
114
+ const actions: forge.ActionDefinition[] = [];
115
+
116
+ for (let i = 1; i <= DEPTH; i += 1) {
117
+ const ev = defineEvent({
118
+ name: `chain.step-${i}-done`,
119
+ description: `Step ${i} completed.`,
120
+ schema: z.object({ step: z.number(), payload: z.string() }),
121
+ });
122
+ events.push(ev);
123
+
124
+ const action = forge.defineAction({
125
+ name: `chain.step-${i}`,
126
+ description: `Run step ${i} of the chain.`,
127
+ schema: z.object({ payload: z.string() }),
128
+ emits: [ev],
129
+ handler: async (input) => ev({ step: i, payload: input.payload }),
130
+ });
131
+ actions.push(action);
132
+ }
133
+
134
+ // Wire the workflows: event_i triggers action_{i+1}.
135
+ const workflows: forge.WorkflowDefinition[] = [];
136
+ for (let i = 1; i < DEPTH; i += 1) {
137
+ const sourceEvent = events[i - 1];
138
+ const nextAction = actions[i];
139
+ const wf = forge.defineWorkflow(`chain-${i}-to-${i + 1}`, ({ on, send }) => {
140
+ on(sourceEvent, async (ev) => {
141
+ await send(nextAction, { payload: `from-step-${ev.step}` });
142
+ });
143
+ });
144
+ workflows.push(wf);
145
+ }
146
+
147
+ const mod = forge.defineModule("chain", {
148
+ events,
149
+ actions,
150
+ workflows,
151
+ });
152
+
153
+ const app = forge.defineApp("chain-e2e", { modules: [mod] });
154
+ return { app, actions };
155
+ }
156
+
157
+ // ─── In-memory invariant assertions ───────────────────────────────────
158
+
159
+ describe("@nwire/telemetry-otel — depth-5 correlation chain", () => {
160
+ it("emits one action span per chain level with shared correlationId", async () => {
161
+ const { app, actions } = makeChain();
162
+ const built = app.create();
163
+ await built.start();
164
+
165
+ const { tracer, spans } = makeCapturingTracer();
166
+ const detach = attachOtelExporter(built.runtime, { tracer });
167
+
168
+ await built.runtime.dispatch(actions[0], { payload: "kickoff" });
169
+ // Workflows run async on the in-memory bus; give the event loop a
170
+ // few ticks to drain all five levels.
171
+ await waitForChain(spans, DEPTH);
172
+ detach();
173
+
174
+ const actionSpans = spans.filter((s) => /^nwire\.action chain\.step-\d/.test(s.name));
175
+ expect(actionSpans, "must observe exactly DEPTH action spans").toHaveLength(DEPTH);
176
+
177
+ // Every action span carries the same correlationId — that's the trace key.
178
+ const correlationIds = new Set(
179
+ actionSpans.map((s) => String(s.attributes["nwire.correlation_id"])),
180
+ );
181
+ expect(correlationIds.size, "all spans share one correlationId").toBe(1);
182
+
183
+ // Each span ends OK.
184
+ for (const s of actionSpans) {
185
+ expect(s.ended).toBe(true);
186
+ expect(s.status?.code, `${s.name} must complete OK`).toBe(1);
187
+ }
188
+ });
189
+
190
+ it("preserves parent-child causation across the chain", async () => {
191
+ const { app, actions } = makeChain();
192
+ const built = app.create();
193
+ await built.start();
194
+
195
+ const { tracer, spans } = makeCapturingTracer();
196
+ const detach = attachOtelExporter(built.runtime, { tracer });
197
+
198
+ await built.runtime.dispatch(actions[0], { payload: "kickoff" });
199
+ await waitForChain(spans, DEPTH);
200
+ detach();
201
+
202
+ const actionSpans = spans
203
+ .filter((s) => /^nwire\.action chain\.step-\d/.test(s.name))
204
+ .sort((a, b) => stepNumber(a.name) - stepNumber(b.name));
205
+
206
+ // Step 1 is the root — its causationId equals its own messageId (or
207
+ // is empty / matches the kickoff envelope). Every subsequent step's
208
+ // causationId should point at the messageId of the previous step's
209
+ // EMITTED event. We can't see message ids directly here, but we can
210
+ // assert causationId is non-empty AND differs from its own messageId
211
+ // (i.e. it's truly chained, not root-like).
212
+ for (let i = 1; i < actionSpans.length; i += 1) {
213
+ const span = actionSpans[i];
214
+ const msgId = String(span.attributes["nwire.message_id"]);
215
+ const causationId = String(span.attributes["nwire.causation_id"]);
216
+ expect(msgId, `step ${i + 1} must have messageId`).toBeTruthy();
217
+ expect(causationId, `step ${i + 1} must have causationId`).toBeTruthy();
218
+ expect(causationId, `step ${i + 1} causationId must differ from its own messageId`).not.toEqual(msgId);
219
+ }
220
+ });
221
+
222
+ it("attaches event.published as a span event on each open action span", async () => {
223
+ const { app, actions } = makeChain();
224
+ const built = app.create();
225
+ await built.start();
226
+
227
+ const { tracer, spans } = makeCapturingTracer();
228
+ const detach = attachOtelExporter(built.runtime, { tracer });
229
+
230
+ await built.runtime.dispatch(actions[0], { payload: "kickoff" });
231
+ await waitForChain(spans, DEPTH);
232
+ detach();
233
+
234
+ const actionSpans = spans.filter((s) => /^nwire\.action chain\.step-\d/.test(s.name));
235
+ for (const s of actionSpans) {
236
+ const eventPublished = s.events.filter((e) => e.name === "event.published");
237
+ expect(eventPublished.length, `${s.name} must record at least one event.published`).toBeGreaterThanOrEqual(1);
238
+ }
239
+ });
240
+ });
241
+
242
+ // ─── Round-trip through Vector → GreptimeDB (gated) ───────────────────
243
+
244
+ describe.skipIf(!process.env.RUN_INTEGRATION)(
245
+ "@nwire/telemetry-otel — round-trip through GreptimeDB",
246
+ () => {
247
+ const GREPTIME_HTTP = process.env.GREPTIMEDB_HTTP ?? "http://localhost:4000";
248
+ const TABLE = `nwire_corr_e2e_${Date.now()}`;
249
+
250
+ it("ships the chain to Greptime and queries it back", async () => {
251
+ // 1. Probe Greptime — fail fast if compose isn't up.
252
+ const health = await fetch(`${GREPTIME_HTTP}/health`).catch(() => null);
253
+ if (!health || !health.ok) {
254
+ throw new Error(
255
+ `GreptimeDB not reachable at ${GREPTIME_HTTP}. Start it with:\n` +
256
+ ` docker compose -f docker-compose.yml -f docker-compose.telemetry.yml up -d greptimedb vector`,
257
+ );
258
+ }
259
+
260
+ // 2. Run the chain + capture spans.
261
+ const { app, actions } = makeChain();
262
+ const built = app.create();
263
+ await built.start();
264
+ const { tracer, spans } = makeCapturingTracer();
265
+ attachOtelExporter(built.runtime, { tracer });
266
+
267
+ const rootCorrelationId = await dispatchAndGetCorrelationId(built.runtime, actions[0]);
268
+ await waitForChain(spans, DEPTH);
269
+
270
+ const actionSpans = spans.filter((s) => /^nwire\.action chain\.step-\d/.test(s.name));
271
+
272
+ // 3. Ship to Greptime via the log-events endpoint (same path Vector uses).
273
+ const payload = actionSpans.map((s) => ({
274
+ span_name: s.name,
275
+ correlation_id: String(s.attributes["nwire.correlation_id"]),
276
+ message_id: String(s.attributes["nwire.message_id"]),
277
+ causation_id: String(s.attributes["nwire.causation_id"]),
278
+ action: String(s.attributes["nwire.action"]),
279
+ status_code: s.status?.code ?? -1,
280
+ event_count: s.events.length,
281
+ // Greptime auto-derives `ts` from the first time-typed column;
282
+ // we provide one explicitly so the table is well-formed.
283
+ ts: Date.now(),
284
+ }));
285
+ const ndjson = payload.map((r) => JSON.stringify(r)).join("\n");
286
+ // Greptime ≥ 0.10 requires an explicit pipeline; `greptime_identity`
287
+ // is the built-in passthrough that maps NDJSON keys 1:1 to columns.
288
+ const ingestUrl =
289
+ `${GREPTIME_HTTP}/v1/events/logs` +
290
+ `?db=public&table=${TABLE}&pipeline_name=greptime_identity`;
291
+ const ingest = await fetch(ingestUrl, {
292
+ method: "POST",
293
+ headers: { "content-type": "application/x-ndjson" },
294
+ body: ndjson,
295
+ });
296
+ expect(ingest.ok, `ingest: ${ingest.status} ${await ingest.text()}`).toBe(true);
297
+
298
+ // 4. Query Greptime for our chain.
299
+ // Brief settle wait — Greptime flushes async.
300
+ await sleep(500);
301
+ const sql = encodeURIComponent(
302
+ `SELECT span_name, correlation_id, message_id, causation_id ` +
303
+ `FROM ${TABLE} WHERE correlation_id = '${rootCorrelationId}'`,
304
+ );
305
+ const queryUrl = `${GREPTIME_HTTP}/v1/sql?db=public&sql=${sql}`;
306
+ const queryResp = await fetch(queryUrl);
307
+ expect(queryResp.ok).toBe(true);
308
+ const body = (await queryResp.json()) as {
309
+ output: Array<{ records: { rows: unknown[][]; schema: { column_schemas: Array<{ name: string }> } } }>;
310
+ };
311
+ const rows = body.output?.[0]?.records?.rows ?? [];
312
+ expect(rows.length, `expected ${DEPTH} rows for correlation ${rootCorrelationId}`).toBe(DEPTH);
313
+
314
+ // Every row must carry the root correlation id.
315
+ const corrIdx =
316
+ body.output[0].records.schema.column_schemas.findIndex((c) => c.name === "correlation_id");
317
+ for (const row of rows) {
318
+ expect(row[corrIdx]).toBe(rootCorrelationId);
319
+ }
320
+ }, 30_000);
321
+ },
322
+ );
323
+
324
+ // ─── Helpers ──────────────────────────────────────────────────────────
325
+
326
+ function stepNumber(spanName: string): number {
327
+ const m = spanName.match(/step-(\d)/);
328
+ return m ? Number(m[1]) : -1;
329
+ }
330
+
331
+ function sleep(ms: number): Promise<void> {
332
+ return new Promise((r) => setTimeout(r, ms));
333
+ }
334
+
335
+ /**
336
+ * Wait for at least `levels` action spans to have been observed AND
337
+ * for each of them to be `ended`. Polls every 5ms with a 2s cap so
338
+ * tests fail loudly if the chain doesn't complete instead of hanging.
339
+ */
340
+ async function waitForChain(spans: CapturedSpan[], levels: number): Promise<void> {
341
+ const start = Date.now();
342
+ while (Date.now() - start < 2_000) {
343
+ const actionSpans = spans.filter((s) => /^nwire\.action chain\.step-\d/.test(s.name));
344
+ if (actionSpans.length >= levels && actionSpans.every((s) => s.ended)) return;
345
+ await sleep(5);
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Dispatch and surface the resulting envelope's correlationId. We can't
351
+ * read the envelope directly from `dispatch()`'s return value, so we
352
+ * peek at the next-emitted telemetry record. In normal use this is what
353
+ * Studio's correlation tooling does too.
354
+ */
355
+ async function dispatchAndGetCorrelationId(
356
+ runtime: forge.Runtime,
357
+ action: forge.ActionDefinition,
358
+ ): Promise<string> {
359
+ let captured: string | null = null;
360
+ const off = runtime.onTelemetry((rec) => {
361
+ if (captured) return;
362
+ if (rec.kind === "action.dispatched" && "envelope" in rec) {
363
+ captured = rec.envelope.correlationId;
364
+ }
365
+ });
366
+ await runtime.dispatch(action, { payload: "kickoff" });
367
+ off();
368
+ if (!captured) throw new Error("no correlationId captured");
369
+ return captured;
370
+ }