@celerity-sdk/telemetry 0.2.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/dist/index.js ADDED
@@ -0,0 +1,544 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/telemetry-layer.ts
5
+ import createDebug3 from "debug";
6
+ import { context as otelContext2 } from "@opentelemetry/api";
7
+ import { extractUserId } from "@celerity-sdk/common";
8
+
9
+ // src/env.ts
10
+ var VALID_LOG_LEVELS = /* @__PURE__ */ new Set([
11
+ "debug",
12
+ "info",
13
+ "warn",
14
+ "error"
15
+ ]);
16
+ var VALID_LOG_FORMATS = /* @__PURE__ */ new Set([
17
+ "json",
18
+ "human",
19
+ "auto"
20
+ ]);
21
+ function readTelemetryEnv() {
22
+ const rawLevel = process.env.CELERITY_LOG_LEVEL;
23
+ const rawFormat = process.env.CELERITY_LOG_FORMAT;
24
+ return {
25
+ tracingEnabled: process.env.CELERITY_TELEMETRY_ENABLED === "true",
26
+ otlpEndpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? process.env.CELERITY_TRACE_OTLP_COLLECTOR_ENDPOINT ?? "http://otelcollector:4317",
27
+ serviceName: process.env.OTEL_SERVICE_NAME ?? "celerity-app",
28
+ serviceVersion: process.env.OTEL_SERVICE_VERSION ?? "0.0.0",
29
+ logLevel: rawLevel && VALID_LOG_LEVELS.has(rawLevel) ? rawLevel : "info",
30
+ logFormat: rawFormat && VALID_LOG_FORMATS.has(rawFormat) ? rawFormat : "auto",
31
+ logFilePath: process.env.CELERITY_LOG_FILE_PATH ?? null
32
+ };
33
+ }
34
+ __name(readTelemetryEnv, "readTelemetryEnv");
35
+
36
+ // src/init.ts
37
+ import createDebug2 from "debug";
38
+ import { NodeSDK } from "@opentelemetry/sdk-node";
39
+ import { resourceFromAttributes } from "@opentelemetry/resources";
40
+ import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from "@opentelemetry/semantic-conventions";
41
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc";
42
+ import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-grpc";
43
+ import { BatchLogRecordProcessor } from "@opentelemetry/sdk-logs";
44
+ import { CompositePropagator, W3CTraceContextPropagator } from "@opentelemetry/core";
45
+ import { AWSXRayPropagator } from "@opentelemetry/propagator-aws-xray";
46
+ import { AWSXRayIdGenerator } from "@opentelemetry/id-generator-aws-xray";
47
+
48
+ // src/instrumentations.ts
49
+ import createDebug from "debug";
50
+ import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
51
+ import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
52
+ var debug = createDebug("celerity:telemetry");
53
+ async function buildInstrumentations() {
54
+ const instrumentations = [
55
+ new HttpInstrumentation(),
56
+ new UndiciInstrumentation()
57
+ ];
58
+ const optionalPackages = [
59
+ "@opentelemetry/instrumentation-aws-sdk",
60
+ "@opentelemetry/instrumentation-ioredis",
61
+ "@opentelemetry/instrumentation-pg",
62
+ "@opentelemetry/instrumentation-mysql2"
63
+ ];
64
+ for (const name of optionalPackages) {
65
+ try {
66
+ const pkg = name;
67
+ const mod = await import(pkg);
68
+ const InstrumentationClass = findInstrumentationExport(mod);
69
+ if (InstrumentationClass) {
70
+ debug("instrumentation: loaded %s", name);
71
+ instrumentations.push(new InstrumentationClass());
72
+ }
73
+ } catch (err) {
74
+ const code = err.code;
75
+ if (code !== "ERR_MODULE_NOT_FOUND" && code !== "MODULE_NOT_FOUND") {
76
+ debug("instrumentation: failed to load %s: %O", name, err);
77
+ }
78
+ }
79
+ }
80
+ return instrumentations;
81
+ }
82
+ __name(buildInstrumentations, "buildInstrumentations");
83
+ function findInstrumentationExport(mod) {
84
+ for (const value of Object.values(mod)) {
85
+ if (typeof value === "function" && value.prototype && "enable" in value.prototype) {
86
+ return value;
87
+ }
88
+ }
89
+ return null;
90
+ }
91
+ __name(findInstrumentationExport, "findInstrumentationExport");
92
+
93
+ // src/init.ts
94
+ var debug2 = createDebug2("celerity:telemetry");
95
+ var initialized = false;
96
+ var sdk = null;
97
+ async function initTelemetry() {
98
+ if (initialized) {
99
+ debug2("initTelemetry: already initialized, skipping");
100
+ return;
101
+ }
102
+ const config = readTelemetryEnv();
103
+ if (!config.tracingEnabled) {
104
+ debug2("initTelemetry: tracing disabled, skipping");
105
+ return;
106
+ }
107
+ const platform = process.env.CELERITY_RUNTIME_PLATFORM ?? "local";
108
+ const isAws = platform === "aws";
109
+ debug2("initTelemetry: platform=%s endpoint=%s service=%s", platform, config.otlpEndpoint, config.serviceName);
110
+ const instrumentations = await buildInstrumentations();
111
+ sdk = new NodeSDK({
112
+ resource: resourceFromAttributes({
113
+ [ATTR_SERVICE_NAME]: config.serviceName,
114
+ [ATTR_SERVICE_VERSION]: config.serviceVersion
115
+ }),
116
+ traceExporter: new OTLPTraceExporter({
117
+ url: config.otlpEndpoint
118
+ }),
119
+ logRecordProcessors: [
120
+ new BatchLogRecordProcessor(new OTLPLogExporter({
121
+ url: config.otlpEndpoint
122
+ }))
123
+ ],
124
+ textMapPropagator: new CompositePropagator({
125
+ propagators: [
126
+ new W3CTraceContextPropagator(),
127
+ new AWSXRayPropagator()
128
+ ]
129
+ }),
130
+ ...isAws ? {
131
+ idGenerator: new AWSXRayIdGenerator()
132
+ } : {},
133
+ instrumentations
134
+ });
135
+ sdk.start();
136
+ initialized = true;
137
+ debug2("initTelemetry: SDK started");
138
+ }
139
+ __name(initTelemetry, "initTelemetry");
140
+ async function shutdownTelemetry() {
141
+ if (sdk) {
142
+ debug2("shutdownTelemetry: shutting down SDK");
143
+ await sdk.shutdown();
144
+ sdk = null;
145
+ initialized = false;
146
+ }
147
+ }
148
+ __name(shutdownTelemetry, "shutdownTelemetry");
149
+
150
+ // src/logger.ts
151
+ import pino from "pino";
152
+
153
+ // src/otel-transport.ts
154
+ import { Writable } from "stream";
155
+ import { logs, SeverityNumber } from "@opentelemetry/api-logs";
156
+ var LEVEL_MAP = {
157
+ 10: SeverityNumber.TRACE,
158
+ 20: SeverityNumber.DEBUG,
159
+ 30: SeverityNumber.INFO,
160
+ 40: SeverityNumber.WARN,
161
+ 50: SeverityNumber.ERROR,
162
+ 60: SeverityNumber.FATAL
163
+ };
164
+ function createOTelStream() {
165
+ const otelLogger = logs.getLogger("celerity");
166
+ return new Writable({
167
+ write(chunk, _encoding, callback) {
168
+ try {
169
+ const obj = JSON.parse(typeof chunk === "string" ? chunk : chunk.toString());
170
+ const { level, msg, name, ...rest } = obj;
171
+ delete rest.time;
172
+ const attributes = {};
173
+ if (typeof name === "string") attributes["logger.name"] = name;
174
+ for (const [key, val] of Object.entries(rest)) {
175
+ if (typeof val === "string" || typeof val === "number" || typeof val === "boolean") {
176
+ attributes[key] = val;
177
+ }
178
+ }
179
+ otelLogger.emit({
180
+ severityNumber: LEVEL_MAP[level] ?? SeverityNumber.INFO,
181
+ body: msg,
182
+ attributes
183
+ });
184
+ } catch {
185
+ }
186
+ callback();
187
+ }
188
+ });
189
+ }
190
+ __name(createOTelStream, "createOTelStream");
191
+
192
+ // src/logger.ts
193
+ var CelerityLoggerImpl = class _CelerityLoggerImpl {
194
+ static {
195
+ __name(this, "CelerityLoggerImpl");
196
+ }
197
+ pinoLogger;
198
+ constructor(pinoLogger) {
199
+ this.pinoLogger = pinoLogger;
200
+ }
201
+ debug(message, attributes) {
202
+ this.log("debug", message, attributes);
203
+ }
204
+ info(message, attributes) {
205
+ this.log("info", message, attributes);
206
+ }
207
+ warn(message, attributes) {
208
+ this.log("warn", message, attributes);
209
+ }
210
+ error(message, attributes) {
211
+ this.log("error", message, attributes);
212
+ }
213
+ log(level, message, attributes) {
214
+ const fn = this.pinoLogger[level].bind(this.pinoLogger);
215
+ if (attributes) fn(attributes, message);
216
+ else fn(message);
217
+ }
218
+ child(name, attributes) {
219
+ return new _CelerityLoggerImpl(this.pinoLogger.child({
220
+ name,
221
+ ...attributes
222
+ }));
223
+ }
224
+ withContext(attributes) {
225
+ return new _CelerityLoggerImpl(this.pinoLogger.child(attributes));
226
+ }
227
+ /** Update the log level at runtime. Internal — used by TelemetryLayer for dynamic config. */
228
+ setLevel(level) {
229
+ this.pinoLogger.level = level;
230
+ }
231
+ };
232
+ function createLogger(config) {
233
+ const streams = [];
234
+ const isLocal = !process.env.CELERITY_RUNTIME_PLATFORM || process.env.CELERITY_RUNTIME_PLATFORM === "local";
235
+ const useHumanFormat = config.logFormat === "human" || config.logFormat === "auto" && isLocal;
236
+ if (useHumanFormat) {
237
+ streams.push({
238
+ level: config.logLevel,
239
+ stream: pino.transport({
240
+ target: "pino-pretty",
241
+ options: {
242
+ destination: 1
243
+ }
244
+ })
245
+ });
246
+ } else {
247
+ streams.push({
248
+ level: config.logLevel,
249
+ stream: pino.destination(1)
250
+ });
251
+ }
252
+ if (config.logFilePath) {
253
+ streams.push({
254
+ level: config.logLevel,
255
+ stream: pino.destination(config.logFilePath)
256
+ });
257
+ }
258
+ if (config.tracingEnabled) {
259
+ streams.push({
260
+ level: config.logLevel,
261
+ stream: createOTelStream()
262
+ });
263
+ }
264
+ const redactPaths = resolveRedactPaths();
265
+ const logger = pino({
266
+ level: config.logLevel,
267
+ redact: redactPaths.length > 0 ? {
268
+ paths: redactPaths,
269
+ censor: "[REDACTED]"
270
+ } : void 0,
271
+ timestamp: pino.stdTimeFunctions.isoTime
272
+ }, pino.multistream(streams));
273
+ return new CelerityLoggerImpl(logger);
274
+ }
275
+ __name(createLogger, "createLogger");
276
+ function resolveRedactPaths() {
277
+ const keys = process.env.CELERITY_LOG_REDACT_KEYS;
278
+ if (!keys) return [];
279
+ return keys.split(",").map((k) => k.trim());
280
+ }
281
+ __name(resolveRedactPaths, "resolveRedactPaths");
282
+
283
+ // src/request-context.ts
284
+ import { AsyncLocalStorage } from "async_hooks";
285
+ var requestStore = new AsyncLocalStorage();
286
+ function getRequestLogger() {
287
+ return requestStore.getStore()?.logger;
288
+ }
289
+ __name(getRequestLogger, "getRequestLogger");
290
+ var ContextAwareLogger = class {
291
+ static {
292
+ __name(this, "ContextAwareLogger");
293
+ }
294
+ rootLogger;
295
+ constructor(rootLogger) {
296
+ this.rootLogger = rootLogger;
297
+ }
298
+ get current() {
299
+ return getRequestLogger() ?? this.rootLogger;
300
+ }
301
+ debug(message, attributes) {
302
+ this.current.debug(message, attributes);
303
+ }
304
+ info(message, attributes) {
305
+ this.current.info(message, attributes);
306
+ }
307
+ warn(message, attributes) {
308
+ this.current.warn(message, attributes);
309
+ }
310
+ error(message, attributes) {
311
+ this.current.error(message, attributes);
312
+ }
313
+ child(name, attributes) {
314
+ return this.current.child(name, attributes);
315
+ }
316
+ withContext(attributes) {
317
+ return this.current.withContext(attributes);
318
+ }
319
+ };
320
+
321
+ // src/context.ts
322
+ import { propagation, ROOT_CONTEXT } from "@opentelemetry/api";
323
+ function extractTraceContext(request) {
324
+ if (!request.traceContext) return ROOT_CONTEXT;
325
+ return propagation.extract(ROOT_CONTEXT, request.traceContext);
326
+ }
327
+ __name(extractTraceContext, "extractTraceContext");
328
+
329
+ // src/tracer.ts
330
+ import { trace, context as otelContext, SpanStatusCode } from "@opentelemetry/api";
331
+ var OTelTracer = class {
332
+ static {
333
+ __name(this, "OTelTracer");
334
+ }
335
+ tracer = trace.getTracer("celerity");
336
+ startSpan(name, attributes) {
337
+ const span = this.tracer.startSpan(name, {
338
+ attributes
339
+ });
340
+ return new OTelSpan(span);
341
+ }
342
+ async withSpan(name, fn, attributes) {
343
+ const span = this.tracer.startSpan(name, {
344
+ attributes
345
+ });
346
+ const ctx = trace.setSpan(otelContext.active(), span);
347
+ return otelContext.with(ctx, async () => {
348
+ const wrapped = new OTelSpan(span);
349
+ try {
350
+ const result = await fn(wrapped);
351
+ span.setStatus({
352
+ code: SpanStatusCode.OK
353
+ });
354
+ return result;
355
+ } catch (error) {
356
+ span.setStatus({
357
+ code: SpanStatusCode.ERROR
358
+ });
359
+ if (error instanceof Error) span.recordException(error);
360
+ throw error;
361
+ } finally {
362
+ span.end();
363
+ }
364
+ });
365
+ }
366
+ };
367
+ var OTelSpan = class {
368
+ static {
369
+ __name(this, "OTelSpan");
370
+ }
371
+ span;
372
+ constructor(span) {
373
+ this.span = span;
374
+ }
375
+ setAttribute(key, value) {
376
+ this.span.setAttribute(key, value);
377
+ }
378
+ setAttributes(attributes) {
379
+ this.span.setAttributes(attributes);
380
+ }
381
+ recordError(error) {
382
+ this.span.recordException(error);
383
+ this.span.setStatus({
384
+ code: SpanStatusCode.ERROR,
385
+ message: error.message
386
+ });
387
+ }
388
+ setOk() {
389
+ this.span.setStatus({
390
+ code: SpanStatusCode.OK
391
+ });
392
+ }
393
+ end() {
394
+ this.span.end();
395
+ }
396
+ };
397
+
398
+ // src/noop.ts
399
+ var NoopTracer = class {
400
+ static {
401
+ __name(this, "NoopTracer");
402
+ }
403
+ startSpan() {
404
+ return NOOP_SPAN;
405
+ }
406
+ async withSpan(_name, fn) {
407
+ return fn(NOOP_SPAN);
408
+ }
409
+ };
410
+ var NOOP_SPAN = {
411
+ setAttribute() {
412
+ },
413
+ setAttributes() {
414
+ },
415
+ recordError() {
416
+ },
417
+ setOk() {
418
+ },
419
+ end() {
420
+ }
421
+ };
422
+
423
+ // src/tokens.ts
424
+ var LOGGER_TOKEN = "CelerityLogger";
425
+ var TRACER_TOKEN = "CelerityTracer";
426
+
427
+ // src/telemetry-layer.ts
428
+ var debugLog = createDebug3("celerity:telemetry");
429
+ var LOG_LEVEL_CONFIG_KEYS = [
430
+ "CELERITY_LOG_LEVEL",
431
+ "celerityLogLevel",
432
+ "celerity_log_level",
433
+ "CelerityLogLevel"
434
+ ];
435
+ var VALID_LOG_LEVELS2 = /* @__PURE__ */ new Set([
436
+ "debug",
437
+ "info",
438
+ "warn",
439
+ "error"
440
+ ]);
441
+ var TelemetryLayer = class {
442
+ static {
443
+ __name(this, "TelemetryLayer");
444
+ }
445
+ config;
446
+ rootLogger = null;
447
+ currentLevel;
448
+ initPromise = null;
449
+ constructor() {
450
+ this.config = readTelemetryEnv();
451
+ this.currentLevel = this.config.logLevel;
452
+ if (this.config.tracingEnabled) {
453
+ this.initPromise = initTelemetry();
454
+ }
455
+ }
456
+ async handle(context, next) {
457
+ if (this.initPromise) {
458
+ await this.initPromise;
459
+ this.initPromise = null;
460
+ }
461
+ if (!this.rootLogger) {
462
+ debugLog("creating root logger (format=%s, level=%s)", this.config.logFormat, this.config.logLevel);
463
+ this.rootLogger = createLogger(this.config);
464
+ context.container.register(LOGGER_TOKEN, {
465
+ useValue: new ContextAwareLogger(this.rootLogger)
466
+ });
467
+ context.container.register(TRACER_TOKEN, {
468
+ useValue: this.config.tracingEnabled ? new OTelTracer() : new NoopTracer()
469
+ });
470
+ debugLog("registered logger and tracer (tracing=%s)", this.config.tracingEnabled);
471
+ }
472
+ await this.refreshLogLevelFromConfig(context.container);
473
+ const userId = extractUserId(context.request.auth);
474
+ const requestLogger = this.rootLogger.child("request", {
475
+ requestId: context.request.requestId,
476
+ method: context.request.method,
477
+ path: context.request.path,
478
+ matchedRoute: context.request.matchedRoute,
479
+ clientIp: context.request.clientIp,
480
+ userAgent: context.request.userAgent,
481
+ ...userId ? {
482
+ userId
483
+ } : {}
484
+ });
485
+ context.logger = requestLogger;
486
+ const runWithLogger = /* @__PURE__ */ __name(() => requestStore.run({
487
+ logger: requestLogger
488
+ }, () => next()), "runWithLogger");
489
+ if (!this.config.tracingEnabled) return runWithLogger();
490
+ const parentContext = extractTraceContext(context.request);
491
+ return otelContext2.with(parentContext, runWithLogger);
492
+ }
493
+ async dispose() {
494
+ if (this.config.tracingEnabled) await shutdownTelemetry();
495
+ }
496
+ async refreshLogLevelFromConfig(container) {
497
+ if (!container.has("ConfigService")) return;
498
+ try {
499
+ const configService = await container.resolve("ConfigService");
500
+ for (const key of LOG_LEVEL_CONFIG_KEYS) {
501
+ const value = await configService.get(key);
502
+ if (value && VALID_LOG_LEVELS2.has(value) && value !== this.currentLevel) {
503
+ debugLog("log level changed %s \u2192 %s", this.currentLevel, value);
504
+ this.rootLogger?.setLevel(value);
505
+ this.currentLevel = value;
506
+ return;
507
+ }
508
+ }
509
+ } catch {
510
+ }
511
+ }
512
+ };
513
+
514
+ // src/index.ts
515
+ import { extractUserId as extractUserId2 } from "@celerity-sdk/common";
516
+
517
+ // src/helpers.ts
518
+ async function getLogger(container) {
519
+ return container.resolve(LOGGER_TOKEN);
520
+ }
521
+ __name(getLogger, "getLogger");
522
+ async function getTracer(container) {
523
+ return container.resolve(TRACER_TOKEN);
524
+ }
525
+ __name(getTracer, "getTracer");
526
+ export {
527
+ CelerityLoggerImpl,
528
+ ContextAwareLogger,
529
+ LOGGER_TOKEN,
530
+ NOOP_SPAN,
531
+ NoopTracer,
532
+ OTelSpan,
533
+ OTelTracer,
534
+ TRACER_TOKEN,
535
+ TelemetryLayer,
536
+ createLogger,
537
+ extractTraceContext,
538
+ extractUserId2 as extractUserId,
539
+ getLogger,
540
+ getRequestLogger,
541
+ getTracer,
542
+ readTelemetryEnv
543
+ };
544
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/telemetry-layer.ts","../src/env.ts","../src/init.ts","../src/instrumentations.ts","../src/logger.ts","../src/otel-transport.ts","../src/request-context.ts","../src/context.ts","../src/tracer.ts","../src/noop.ts","../src/tokens.ts","../src/index.ts","../src/helpers.ts"],"sourcesContent":["import createDebug from \"debug\";\nimport { context as otelContext } from \"@opentelemetry/api\";\nimport type {\n CelerityLayer,\n HandlerContext,\n HandlerResponse,\n LogLevel,\n ServiceContainer,\n} from \"@celerity-sdk/types\";\nimport { extractUserId } from \"@celerity-sdk/common\";\nimport { readTelemetryEnv, type TelemetryConfig } from \"./env\";\nimport { initTelemetry, shutdownTelemetry } from \"./init\";\nimport { CelerityLoggerImpl, createLogger } from \"./logger\";\nimport { ContextAwareLogger, requestStore } from \"./request-context\";\nimport { extractTraceContext } from \"./context\";\nimport { OTelTracer } from \"./tracer\";\nimport { NoopTracer } from \"./noop\";\nimport { LOGGER_TOKEN, TRACER_TOKEN } from \"./tokens\";\n\nconst debugLog = createDebug(\"celerity:telemetry\");\n\nconst LOG_LEVEL_CONFIG_KEYS = [\n \"CELERITY_LOG_LEVEL\",\n \"celerityLogLevel\",\n \"celerity_log_level\",\n \"CelerityLogLevel\",\n];\n\nconst VALID_LOG_LEVELS = new Set<string>([\"debug\", \"info\", \"warn\", \"error\"]);\n\ntype ConfigService = {\n get(key: string): Promise<string | undefined>;\n};\n\nexport class TelemetryLayer implements CelerityLayer {\n private config: TelemetryConfig;\n private rootLogger: CelerityLoggerImpl | null = null;\n private currentLevel: LogLevel;\n private initPromise: Promise<void> | null = null;\n\n constructor() {\n this.config = readTelemetryEnv();\n this.currentLevel = this.config.logLevel;\n\n if (this.config.tracingEnabled) {\n this.initPromise = initTelemetry();\n }\n }\n\n async handle(\n context: HandlerContext,\n next: () => Promise<HandlerResponse>,\n ): Promise<HandlerResponse> {\n if (this.initPromise) {\n await this.initPromise;\n this.initPromise = null;\n }\n\n if (!this.rootLogger) {\n debugLog(\n \"creating root logger (format=%s, level=%s)\",\n this.config.logFormat,\n this.config.logLevel,\n );\n this.rootLogger = createLogger(this.config);\n context.container.register(LOGGER_TOKEN, {\n useValue: new ContextAwareLogger(this.rootLogger),\n });\n context.container.register(TRACER_TOKEN, {\n useValue: this.config.tracingEnabled ? new OTelTracer() : new NoopTracer(),\n });\n debugLog(\"registered logger and tracer (tracing=%s)\", this.config.tracingEnabled);\n }\n\n await this.refreshLogLevelFromConfig(context.container);\n\n const userId = extractUserId(context.request.auth);\n const requestLogger = this.rootLogger.child(\"request\", {\n requestId: context.request.requestId,\n method: context.request.method,\n path: context.request.path,\n matchedRoute: context.request.matchedRoute,\n clientIp: context.request.clientIp,\n userAgent: context.request.userAgent,\n ...(userId ? { userId } : {}),\n });\n context.logger = requestLogger;\n\n const runWithLogger = () => requestStore.run({ logger: requestLogger }, () => next());\n\n if (!this.config.tracingEnabled) return runWithLogger();\n\n const parentContext = extractTraceContext(context.request);\n return otelContext.with(parentContext, runWithLogger);\n }\n\n async dispose(): Promise<void> {\n if (this.config.tracingEnabled) await shutdownTelemetry();\n }\n\n private async refreshLogLevelFromConfig(container: ServiceContainer): Promise<void> {\n if (!container.has(\"ConfigService\")) return;\n\n try {\n const configService = await container.resolve<ConfigService>(\"ConfigService\");\n for (const key of LOG_LEVEL_CONFIG_KEYS) {\n const value = await configService.get(key);\n if (value && VALID_LOG_LEVELS.has(value) && value !== this.currentLevel) {\n debugLog(\"log level changed %s → %s\", this.currentLevel, value);\n this.rootLogger?.setLevel(value as LogLevel);\n this.currentLevel = value as LogLevel;\n return;\n }\n }\n } catch {\n // Config resolution failed — keep current level\n }\n }\n}\n","import type { LogLevel } from \"@celerity-sdk/types\";\n\nexport type TelemetryConfig = {\n tracingEnabled: boolean;\n otlpEndpoint: string;\n serviceName: string;\n serviceVersion: string;\n logLevel: LogLevel;\n logFormat: \"json\" | \"human\" | \"auto\";\n logFilePath: string | null;\n};\n\nconst VALID_LOG_LEVELS = new Set<string>([\"debug\", \"info\", \"warn\", \"error\"]);\nconst VALID_LOG_FORMATS = new Set<string>([\"json\", \"human\", \"auto\"]);\n\nexport function readTelemetryEnv(): TelemetryConfig {\n const rawLevel = process.env.CELERITY_LOG_LEVEL;\n const rawFormat = process.env.CELERITY_LOG_FORMAT;\n\n return {\n tracingEnabled: process.env.CELERITY_TELEMETRY_ENABLED === \"true\",\n otlpEndpoint:\n process.env.OTEL_EXPORTER_OTLP_ENDPOINT ??\n process.env.CELERITY_TRACE_OTLP_COLLECTOR_ENDPOINT ??\n \"http://otelcollector:4317\",\n serviceName: process.env.OTEL_SERVICE_NAME ?? \"celerity-app\",\n serviceVersion: process.env.OTEL_SERVICE_VERSION ?? \"0.0.0\",\n logLevel: rawLevel && VALID_LOG_LEVELS.has(rawLevel) ? (rawLevel as LogLevel) : \"info\",\n logFormat:\n rawFormat && VALID_LOG_FORMATS.has(rawFormat)\n ? (rawFormat as \"json\" | \"human\" | \"auto\")\n : \"auto\",\n logFilePath: process.env.CELERITY_LOG_FILE_PATH ?? null,\n };\n}\n","import createDebug from \"debug\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from \"@opentelemetry/semantic-conventions\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-grpc\";\nimport { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-grpc\";\nimport { BatchLogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { CompositePropagator, W3CTraceContextPropagator } from \"@opentelemetry/core\";\nimport { AWSXRayPropagator } from \"@opentelemetry/propagator-aws-xray\";\nimport { AWSXRayIdGenerator } from \"@opentelemetry/id-generator-aws-xray\";\nimport { readTelemetryEnv } from \"./env\";\nimport { buildInstrumentations } from \"./instrumentations\";\n\nconst debug = createDebug(\"celerity:telemetry\");\n\nlet initialized = false;\nlet sdk: NodeSDK | null = null;\n\nexport function isInitialized(): boolean {\n return initialized;\n}\n\nexport async function initTelemetry(): Promise<void> {\n if (initialized) {\n debug(\"initTelemetry: already initialized, skipping\");\n return;\n }\n\n const config = readTelemetryEnv();\n if (!config.tracingEnabled) {\n debug(\"initTelemetry: tracing disabled, skipping\");\n return;\n }\n\n const platform = process.env.CELERITY_RUNTIME_PLATFORM ?? \"local\";\n const isAws = platform === \"aws\";\n debug(\n \"initTelemetry: platform=%s endpoint=%s service=%s\",\n platform,\n config.otlpEndpoint,\n config.serviceName,\n );\n\n const instrumentations = await buildInstrumentations();\n\n sdk = new NodeSDK({\n resource: resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_SERVICE_VERSION]: config.serviceVersion,\n }),\n traceExporter: new OTLPTraceExporter({ url: config.otlpEndpoint }),\n logRecordProcessors: [\n new BatchLogRecordProcessor(new OTLPLogExporter({ url: config.otlpEndpoint })),\n ],\n textMapPropagator: new CompositePropagator({\n propagators: [new W3CTraceContextPropagator(), new AWSXRayPropagator()],\n }),\n ...(isAws ? { idGenerator: new AWSXRayIdGenerator() } : {}),\n instrumentations,\n });\n\n sdk.start();\n initialized = true;\n debug(\"initTelemetry: SDK started\");\n}\n\nexport async function shutdownTelemetry(): Promise<void> {\n if (sdk) {\n debug(\"shutdownTelemetry: shutting down SDK\");\n await sdk.shutdown();\n sdk = null;\n initialized = false;\n }\n}\n","import createDebug from \"debug\";\nimport { HttpInstrumentation } from \"@opentelemetry/instrumentation-http\";\nimport { UndiciInstrumentation } from \"@opentelemetry/instrumentation-undici\";\nimport type { Instrumentation } from \"@opentelemetry/instrumentation\";\n\nconst debug = createDebug(\"celerity:telemetry\");\n\nexport async function buildInstrumentations(): Promise<Instrumentation[]> {\n // Core instrumentation: always active — covers all HTTP/HTTPS and fetch() calls\n const instrumentations: Instrumentation[] = [\n new HttpInstrumentation() as Instrumentation,\n new UndiciInstrumentation() as Instrumentation,\n ];\n\n // Dynamically load optional instrumentation packages.\n // Each targets a specific library and silently no-ops if the library isn't installed.\n const optionalPackages = [\n \"@opentelemetry/instrumentation-aws-sdk\",\n \"@opentelemetry/instrumentation-ioredis\",\n \"@opentelemetry/instrumentation-pg\",\n \"@opentelemetry/instrumentation-mysql2\",\n ];\n\n for (const name of optionalPackages) {\n try {\n const pkg = name;\n const mod = (await import(pkg)) as Record<string, unknown>;\n const InstrumentationClass = findInstrumentationExport(mod);\n if (InstrumentationClass) {\n debug(\"instrumentation: loaded %s\", name);\n instrumentations.push(new InstrumentationClass() as Instrumentation);\n }\n } catch (err) {\n const code = (err as { code?: string }).code;\n if (code !== \"ERR_MODULE_NOT_FOUND\" && code !== \"MODULE_NOT_FOUND\") {\n debug(\"instrumentation: failed to load %s: %O\", name, err);\n }\n }\n }\n\n return instrumentations;\n}\n\nfunction findInstrumentationExport(mod: Record<string, unknown>): (new () => unknown) | null {\n for (const value of Object.values(mod)) {\n if (typeof value === \"function\" && value.prototype && \"enable\" in value.prototype) {\n return value as new () => unknown;\n }\n }\n return null;\n}\n","import pino from \"pino\";\nimport type { CelerityLogger, LogLevel } from \"@celerity-sdk/types\";\nimport type { TelemetryConfig } from \"./env\";\nimport { createOTelStream } from \"./otel-transport\";\n\n/**\n * Thin pino wrapper implementing CelerityLogger.\n * Every method delegates directly to the underlying pino instance.\n */\nexport class CelerityLoggerImpl implements CelerityLogger {\n constructor(private pinoLogger: pino.Logger) {}\n\n debug(message: string, attributes?: Record<string, unknown>): void {\n this.log(\"debug\", message, attributes);\n }\n\n info(message: string, attributes?: Record<string, unknown>): void {\n this.log(\"info\", message, attributes);\n }\n\n warn(message: string, attributes?: Record<string, unknown>): void {\n this.log(\"warn\", message, attributes);\n }\n\n error(message: string, attributes?: Record<string, unknown>): void {\n this.log(\"error\", message, attributes);\n }\n\n private log(level: LogLevel, message: string, attributes?: Record<string, unknown>): void {\n const fn = this.pinoLogger[level].bind(this.pinoLogger);\n if (attributes) fn(attributes, message);\n else fn(message);\n }\n\n child(name: string, attributes?: Record<string, unknown>): CelerityLogger {\n return new CelerityLoggerImpl(this.pinoLogger.child({ name, ...attributes }));\n }\n\n withContext(attributes: Record<string, unknown>): CelerityLogger {\n return new CelerityLoggerImpl(this.pinoLogger.child(attributes));\n }\n\n /** Update the log level at runtime. Internal — used by TelemetryLayer for dynamic config. */\n setLevel(level: LogLevel): void {\n this.pinoLogger.level = level;\n }\n}\n\nexport function createLogger(config: TelemetryConfig): CelerityLoggerImpl {\n const streams: pino.StreamEntry[] = [];\n\n const isLocal =\n !process.env.CELERITY_RUNTIME_PLATFORM || process.env.CELERITY_RUNTIME_PLATFORM === \"local\";\n const useHumanFormat = config.logFormat === \"human\" || (config.logFormat === \"auto\" && isLocal);\n\n if (useHumanFormat) {\n // pino-pretty via worker thread — fine for local dev only\n streams.push({\n level: config.logLevel,\n stream: pino.transport({ target: \"pino-pretty\", options: { destination: 1 } }),\n });\n } else {\n // Raw JSON to stdout — synchronous, Lambda-safe\n streams.push({ level: config.logLevel, stream: pino.destination(1) });\n }\n\n // File stream — if configured (synchronous SonicBoom destination)\n if (config.logFilePath) {\n streams.push({\n level: config.logLevel,\n stream: pino.destination(config.logFilePath),\n });\n }\n\n // OTel log stream — main-thread writable (NOT worker-thread transport).\n // Runs in main thread so it can read active OTel context (traceId/spanId)\n // and is safe for Lambda (no worker thread flush issues).\n if (config.tracingEnabled) {\n streams.push({\n level: config.logLevel,\n stream: createOTelStream(),\n });\n }\n\n const redactPaths = resolveRedactPaths();\n\n const logger = pino(\n {\n level: config.logLevel,\n redact: redactPaths.length > 0 ? { paths: redactPaths, censor: \"[REDACTED]\" } : undefined,\n timestamp: pino.stdTimeFunctions.isoTime,\n },\n pino.multistream(streams),\n );\n\n return new CelerityLoggerImpl(logger);\n}\n\nfunction resolveRedactPaths(): string[] {\n const keys = process.env.CELERITY_LOG_REDACT_KEYS;\n if (!keys) return [];\n return keys.split(\",\").map((k) => k.trim());\n}\n","import { Writable } from \"node:stream\";\nimport { logs, SeverityNumber } from \"@opentelemetry/api-logs\";\n\nconst LEVEL_MAP: Record<number, SeverityNumber> = {\n 10: SeverityNumber.TRACE,\n 20: SeverityNumber.DEBUG,\n 30: SeverityNumber.INFO,\n 40: SeverityNumber.WARN,\n 50: SeverityNumber.ERROR,\n 60: SeverityNumber.FATAL,\n};\n\n/**\n * Creates a main-thread writable stream that bridges pino log records\n * to the OTel Logs API.\n *\n * Runs in the main thread (NOT a pino worker-thread transport) so it can:\n * 1. Read traceId/spanId from the active OTel context (trace correlation)\n * 2. Flush reliably in Lambda (no worker thread lifecycle issues)\n */\nexport function createOTelStream(): Writable {\n const otelLogger = logs.getLogger(\"celerity\");\n\n return new Writable({\n write(chunk: Buffer | string, _encoding, callback) {\n try {\n const obj = JSON.parse(typeof chunk === \"string\" ? chunk : chunk.toString()) as Record<\n string,\n unknown\n >;\n const { level, msg, name, ...rest } = obj;\n delete rest.time;\n const attributes: Record<string, string | number | boolean> = {};\n if (typeof name === \"string\") attributes[\"logger.name\"] = name;\n for (const [key, val] of Object.entries(rest)) {\n if (typeof val === \"string\" || typeof val === \"number\" || typeof val === \"boolean\") {\n attributes[key] = val;\n }\n }\n otelLogger.emit({\n severityNumber: LEVEL_MAP[level as number] ?? SeverityNumber.INFO,\n body: msg as string,\n attributes,\n });\n } catch {\n // Malformed JSON — skip\n }\n callback();\n },\n });\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { CelerityLogger } from \"@celerity-sdk/types\";\n\ntype RequestStore = {\n logger: CelerityLogger;\n};\n\nexport const requestStore = new AsyncLocalStorage<RequestStore>();\n\n/**\n * Get the request-scoped logger from the current async context.\n *\n * Works anywhere in the async call chain during request handling —\n * handlers, services, repositories, API clients.\n *\n * Returns `undefined` outside a request context (e.g., startup code, background tasks).\n */\nexport function getRequestLogger(): CelerityLogger | undefined {\n return requestStore.getStore()?.logger;\n}\n\n/**\n * Context-aware logger proxy registered under LOGGER_TOKEN.\n *\n * Delegates to the request-scoped logger (via AsyncLocalStorage) when inside\n * a request context, falls back to the root logger otherwise.\n *\n * This means `@Inject(LOGGER_TOKEN)` automatically resolves to the most\n * appropriate logger for the current context — no manual wiring needed.\n */\nexport class ContextAwareLogger implements CelerityLogger {\n constructor(private rootLogger: CelerityLogger) {}\n\n private get current(): CelerityLogger {\n return getRequestLogger() ?? this.rootLogger;\n }\n\n debug(message: string, attributes?: Record<string, unknown>): void {\n this.current.debug(message, attributes);\n }\n\n info(message: string, attributes?: Record<string, unknown>): void {\n this.current.info(message, attributes);\n }\n\n warn(message: string, attributes?: Record<string, unknown>): void {\n this.current.warn(message, attributes);\n }\n\n error(message: string, attributes?: Record<string, unknown>): void {\n this.current.error(message, attributes);\n }\n\n child(name: string, attributes?: Record<string, unknown>): CelerityLogger {\n return this.current.child(name, attributes);\n }\n\n withContext(attributes: Record<string, unknown>): CelerityLogger {\n return this.current.withContext(attributes);\n }\n}\n","import { propagation, ROOT_CONTEXT, type Context } from \"@opentelemetry/api\";\nimport type { HttpRequest } from \"@celerity-sdk/types\";\n\nexport function extractTraceContext(request: HttpRequest): Context {\n if (!request.traceContext) return ROOT_CONTEXT;\n\n // The traceContext map is used directly as a carrier.\n // The composite propagator (W3C + X-Ray) extracts the appropriate context.\n return propagation.extract(ROOT_CONTEXT, request.traceContext);\n}\n","import {\n trace,\n context as otelContext,\n SpanStatusCode,\n type Span,\n type Attributes,\n} from \"@opentelemetry/api\";\nimport type { CelerityTracer, CeleritySpan } from \"@celerity-sdk/types\";\n\nexport class OTelTracer implements CelerityTracer {\n private tracer = trace.getTracer(\"celerity\");\n\n startSpan(name: string, attributes?: Record<string, unknown>): CeleritySpan {\n const span = this.tracer.startSpan(name, {\n attributes: attributes as Attributes,\n });\n return new OTelSpan(span);\n }\n\n async withSpan<T>(\n name: string,\n fn: (span: CeleritySpan) => T | Promise<T>,\n attributes?: Record<string, unknown>,\n ): Promise<T> {\n const span = this.tracer.startSpan(name, {\n attributes: attributes as Attributes,\n });\n const ctx = trace.setSpan(otelContext.active(), span);\n\n return otelContext.with(ctx, async () => {\n const wrapped = new OTelSpan(span);\n try {\n const result = await fn(wrapped);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n if (error instanceof Error) span.recordException(error);\n throw error;\n } finally {\n span.end();\n }\n });\n }\n}\n\nexport class OTelSpan implements CeleritySpan {\n constructor(private span: Span) {}\n\n setAttribute(key: string, value: string | number | boolean): void {\n this.span.setAttribute(key, value);\n }\n\n setAttributes(attributes: Record<string, string | number | boolean>): void {\n this.span.setAttributes(attributes);\n }\n\n recordError(error: Error): void {\n this.span.recordException(error);\n this.span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n }\n\n setOk(): void {\n this.span.setStatus({ code: SpanStatusCode.OK });\n }\n\n end(): void {\n this.span.end();\n }\n}\n","import type { CelerityTracer, CeleritySpan } from \"@celerity-sdk/types\";\n\nexport class NoopTracer implements CelerityTracer {\n startSpan(): CeleritySpan {\n return NOOP_SPAN;\n }\n\n async withSpan<T>(_name: string, fn: (span: CeleritySpan) => T | Promise<T>): Promise<T> {\n return fn(NOOP_SPAN);\n }\n}\n\nexport const NOOP_SPAN: CeleritySpan = {\n setAttribute() {},\n setAttributes() {},\n recordError() {},\n setOk() {},\n end() {},\n};\n","export const LOGGER_TOKEN = \"CelerityLogger\";\nexport const TRACER_TOKEN = \"CelerityTracer\";\n","export { TelemetryLayer } from \"./telemetry-layer\";\nexport { extractUserId } from \"@celerity-sdk/common\";\nexport { CelerityLoggerImpl, createLogger } from \"./logger\";\nexport { ContextAwareLogger, getRequestLogger } from \"./request-context\";\nexport { OTelTracer, OTelSpan } from \"./tracer\";\nexport { NoopTracer, NOOP_SPAN } from \"./noop\";\nexport { LOGGER_TOKEN, TRACER_TOKEN } from \"./tokens\";\nexport { extractTraceContext } from \"./context\";\nexport { getLogger, getTracer } from \"./helpers\";\nexport { readTelemetryEnv } from \"./env\";\nexport type { TelemetryConfig } from \"./env\";\n","import type { CelerityLogger, CelerityTracer, ServiceContainer } from \"@celerity-sdk/types\";\nimport { LOGGER_TOKEN, TRACER_TOKEN } from \"./tokens\";\n\nexport async function getLogger(container: ServiceContainer): Promise<CelerityLogger> {\n return container.resolve<CelerityLogger>(LOGGER_TOKEN);\n}\n\nexport async function getTracer(container: ServiceContainer): Promise<CelerityTracer> {\n return container.resolve<CelerityTracer>(TRACER_TOKEN);\n}\n"],"mappings":"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","names":["createDebug","context","otelContext","extractUserId","VALID_LOG_LEVELS","Set","VALID_LOG_FORMATS","readTelemetryEnv","rawLevel","process","env","CELERITY_LOG_LEVEL","rawFormat","CELERITY_LOG_FORMAT","tracingEnabled","CELERITY_TELEMETRY_ENABLED","otlpEndpoint","OTEL_EXPORTER_OTLP_ENDPOINT","CELERITY_TRACE_OTLP_COLLECTOR_ENDPOINT","serviceName","OTEL_SERVICE_NAME","serviceVersion","OTEL_SERVICE_VERSION","logLevel","has","logFormat","logFilePath","CELERITY_LOG_FILE_PATH","createDebug","NodeSDK","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","OTLPTraceExporter","OTLPLogExporter","BatchLogRecordProcessor","CompositePropagator","W3CTraceContextPropagator","AWSXRayPropagator","AWSXRayIdGenerator","createDebug","HttpInstrumentation","UndiciInstrumentation","debug","createDebug","buildInstrumentations","instrumentations","HttpInstrumentation","UndiciInstrumentation","optionalPackages","name","pkg","mod","InstrumentationClass","findInstrumentationExport","push","err","code","value","Object","values","prototype","debug","createDebug","initialized","sdk","initTelemetry","initialized","debug","config","readTelemetryEnv","tracingEnabled","platform","process","env","CELERITY_RUNTIME_PLATFORM","isAws","otlpEndpoint","serviceName","instrumentations","buildInstrumentations","sdk","NodeSDK","resource","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","serviceVersion","traceExporter","OTLPTraceExporter","url","logRecordProcessors","BatchLogRecordProcessor","OTLPLogExporter","textMapPropagator","CompositePropagator","propagators","W3CTraceContextPropagator","AWSXRayPropagator","idGenerator","AWSXRayIdGenerator","start","shutdownTelemetry","shutdown","pino","Writable","logs","SeverityNumber","LEVEL_MAP","SeverityNumber","TRACE","DEBUG","INFO","WARN","ERROR","FATAL","createOTelStream","otelLogger","logs","getLogger","Writable","write","chunk","_encoding","callback","obj","JSON","parse","toString","level","msg","name","rest","time","attributes","key","val","Object","entries","emit","severityNumber","body","CelerityLoggerImpl","pinoLogger","debug","message","attributes","log","info","warn","error","level","fn","bind","child","name","withContext","setLevel","createLogger","config","streams","isLocal","process","env","CELERITY_RUNTIME_PLATFORM","useHumanFormat","logFormat","push","logLevel","stream","pino","transport","target","options","destination","logFilePath","tracingEnabled","createOTelStream","redactPaths","resolveRedactPaths","logger","redact","length","paths","censor","undefined","timestamp","stdTimeFunctions","isoTime","multistream","keys","CELERITY_LOG_REDACT_KEYS","split","map","k","trim","AsyncLocalStorage","requestStore","AsyncLocalStorage","getRequestLogger","getStore","logger","ContextAwareLogger","rootLogger","current","debug","message","attributes","info","warn","error","child","name","withContext","propagation","ROOT_CONTEXT","extractTraceContext","request","traceContext","ROOT_CONTEXT","propagation","extract","trace","context","otelContext","SpanStatusCode","OTelTracer","tracer","trace","getTracer","startSpan","name","attributes","span","OTelSpan","withSpan","fn","ctx","setSpan","otelContext","active","with","wrapped","result","setStatus","code","SpanStatusCode","OK","error","ERROR","Error","recordException","end","setAttribute","key","value","setAttributes","recordError","message","setOk","NoopTracer","startSpan","NOOP_SPAN","withSpan","_name","fn","setAttribute","setAttributes","recordError","setOk","end","LOGGER_TOKEN","TRACER_TOKEN","debugLog","createDebug","LOG_LEVEL_CONFIG_KEYS","VALID_LOG_LEVELS","Set","TelemetryLayer","config","rootLogger","currentLevel","initPromise","readTelemetryEnv","logLevel","tracingEnabled","initTelemetry","handle","context","next","logFormat","createLogger","container","register","LOGGER_TOKEN","useValue","ContextAwareLogger","TRACER_TOKEN","OTelTracer","NoopTracer","refreshLogLevelFromConfig","userId","extractUserId","request","auth","requestLogger","child","requestId","method","path","matchedRoute","clientIp","userAgent","logger","runWithLogger","requestStore","run","parentContext","extractTraceContext","otelContext","with","dispose","shutdownTelemetry","has","configService","resolve","key","value","get","setLevel","extractUserId","getLogger","container","resolve","LOGGER_TOKEN","getTracer","TRACER_TOKEN"]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }