@ciq-dev/neoiq-foundation-node 1.0.1-beta.0 → 1.0.1-beta.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/config.ts","../src/features/context.ts","../src/features/logging.ts","../src/features/tracing.ts","../src/features/metrics.ts","../src/integrations/fastify-plugin.ts","../src/integrations/http-client.ts","../src/foundation.ts"],"sourcesContent":null,"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/config.ts","../src/features/context.ts","../src/features/logging.ts","../src/features/tracing.ts","../src/features/metrics.ts","../src/integrations/fastify-plugin.ts","../src/integrations/http-client.ts","../src/foundation.ts"],"sourcesContent":null,"mappings":";;;;;;;;cAOa,iCAA+B,CAAA,CAAA;mCAchC,CAAA,CAAA;;;EAdC,OAAA,eAAA,aAcD,aAAA,CAAA,CAAA;EAAA,EAAA,eAAA,aAAA,aAAA,CAAA,CAAA;EAAA,KAAA,eAAA,aAAA,aAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEA,yBAAA,GAA4B,CAAA,CAAE,aAAa;cAG1C,sBAAoB,CAAA,CAAA;sCAOrB,CAAA,CAAA;SA1BgC,eAAA,aAAA,aAAA,CAAA,CAAA;EAAA,OAAA,eAAA,aAAA,aAAA,CAAA,CAAA;EAgBhC,mBAAA,eAAyB,aAAA,YAAA,CAAA;IAAA,IAAA,eAAA,aAAA,aAAA,CAAA,CAAA;IAAkB,OAAA,eAAA,aAAA,aAAA,CAAA,CAAA;IAAf,OAAE,eAAA,aAAA,aAAA,CAAA,CAAA;IAAK,OAAA,eAAA,aAAA,aAAA,CAAA,CAAA;IAGlC,EAAA,eAAA,aAOD,aAAA,CAAA,CAAA;IAAA,KAAA,eAAA,aAAA,aAAA,CAAA,CAAA;IAAA,KAAA,eAAA,aAAA,aAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAPqB,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;EASrB,OAAA,CAAA,EAAA,OAAc,GAAA,SAAA;EAAA,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;EAAA,mBAAkB,CAAA,EAAA;IAAf,IAAE,CAAA,EAAA,OAAA,GAAA,SAAA;IAAK,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAMvB,OAAA,CAAA,EAAA,OAMD,GAAA,SAAA;IAAA,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAA,EAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;;;;;;;;KAZA,cAAA,GAAiB,CAAA,CAAE,aAAa;AAMf,cAAhB,gBAAgB,EAAA,CAAA,CAAA,SAAA,CAAA;EAAA,QAAA,eAAA,aAAA,CAMjB,CAAA,CAAA,SANiB,CAAA,CAAA;EAQjB,iBAAU,eAAA,aAAA,YAAA,CAAA,CAAA;EAAA,eAAA,eAAA,aAAA,YAAA,CAAA,CAAA;CAAA,EAAA,OAAkB,cAAA,EAAA;EAAgB,QAA7B,CAAA,EAAA,MAAA,GAAA,SAAA;EAAK,iBAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAGnB,eAAA,CAAA,EAAA,MAKD,GAAA,SAAA;CAAA,EAAA;EAAA,QAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;;KARA,UAAA,GAAa,CAAA,CAAE,aAAa;cAG3B,qBAAmB,CAAA,CAAA;oCAKpB,CAAA,CAAA;aALoB,eAAA,cAAA,aAAA,CAAA,CAAA;AAAA,CAAA,EAAA,OAAA,cAAA,EAAA;EAOpB,KAAA,CAAA,EAAA,OAAA,GAAa,MAAA,GAAA,MAAA,GAAA,OAAA,GAAA,SAAA;EAAA,WAAA,CAAA,EAAA,OAAA,GAAA,SAAA;CAAA,EAAA;EAAqC,KAAhC,CAAA,EAAA,OAAA,GAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAAA,SAAA;EAAK,WAAA,CAAA,EAAA,OAAA,GAAA,SAAA;AAGnC,CAAA,CAAA;AAQY,KAXA,aAAA,GAAgB,CAAA,CAAE,KAWlB,CAAA,OAX+B,mBAW/B,CAAA;AAAA,cARC,0BAQD,EAR2B,CAAA,CAAA,SAQ3B,CAAA;yCAAA,CAAA,CAAA;;;;;;;;;;;;;;;;eAR2B,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;AAAA,CAAA,CAAA;AAU3B,KAAA,oBAAA,GAAuB,CAAA,CAAE,KAAL,CAAA,OAAkB,0BAAlB,CAAA;AAAA,cAGnB,sBAHmB,EAGG,CAAA,CAAA,SAHH,CAAA;EAAA,WAAkB,EAahD,CAAA,CAAA,SAbgD;EAA0B,cAAvC,cAAA,YAAA,CAAA;EAAK,WAAA,cAAA,UAAA,CAAA,CAAA,aAAA,EAAA,SAAA,EAAA,IAAA,EAAA,YAAA,CAAA,CAAA,CAAA;EAG7B,QAAA,cAAA,YAUX,CAAA;IAAA,OAAA,eAAA,aAAA,aAAA,CAAA,CAAA;IAAA,OAAA,eAAA,aAAA,aAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAViC,WAAA,CAAA,EAAA,OAAA,GAAA,SAAA;EAAA,CAAA,CAAA,CAAA;EAYvB,cAAA,cAAgB,YAAA,CAAA;IAAA,UAAA,eAAA,aAAA,aAAA,CAAA,CAAA;IAAkB,OAAA,eAAA,aAAA,aAAA,CAAA,CAAA;IAAf,eAAE,eAAA,aAAA,aAAA,CAAA,CAAA;IAAK,WAAA,eAAA,aAAA,YAAA,CAAA,CAAA;IAE1B,aAAA,eAAqB,cAAA,WAAA,YAAA,EAAA,MAAA,CAAA,CAAA,CAAA;EAAA,CAAA,EAAA,OAAA,cAAA,EAAA;IAAW,UAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAR,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAO,eAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;IAK3B,aAAW,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;EAAA,CAAA,EAAA;IAAQ,UAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAwB,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAgB,eAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;IAc3D,aAAA,CAAA,EAAA,MAAsB,EAAA,GAAA,SAAA;;;;;;;ECtGrB,WAAA,EAAA,MAAc;EAQd,cAAA,EAAA,MAAc;EAAA,WAAA,EAAA,aAAA,GAAA,SAAA,GAAA,IAAA,GAAA,YAAA;EAAA,QACf,EAAA;IACE,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAA0B,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAI,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAC1B,mBAAA,CAAA,EAAA;MAAqB,IAAA,CAAA,EAAA,OAAA,GAAA,SAAA;MAAI,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;MAAe,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;MACpC,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;MAAR,EAAA,CAAA,EAAA,OAAA,GAAA,SAAA;MAA0B,KAAA,CAAA,EAAA,OAAA,GAAA,SAAA;MAAc,KAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;MAI1C,IAAA,CAAA,EAAA,OAAA,GAAoB,SAAI;;;;ECdvB,CAAA;EASA,IAAA,EAAA;IAAM,QAAA,CAAA,EAAA,MAAA,GAAA,SAAA;IAKQ,iBAAA,CAAA,EAAA,MAAA,GAAA,SAAA;IACd,eAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAAU,CAAA;;IAIX,UAAA,CAAY,EAAA,OAAA,GAAA,SAAA;IAAA,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAU,eAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAgB,WAAA,CAAA,EAAA,MAAA,GAAA,SAAA;IAAM,aAAA,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;;AA8C5D,CAAA,EAAA;EA8BgB,WAAA,EAAA,MAAe;EAIf,OAAA,CAAA,EAAA;;;;EC/FC,cAAA,CAAA,EAAc,MAAA,GAAA,SAMP;;EAOR,QAAA,CAAA,EAAA;;IA4DM,OAAA,CAAA,EAAA,OAAe,GAAA,SAAI;IAWzB,OAAA,CAAS,EAAA,OAAA,GAAgB,SAAM;IAI/B,mBAAa,CAAA,EAAA;MAIb,IAAA,CAAA,EAAA,OAAe,GAAA,SAAA;MAOf,OAAA,CAAA,EAAA,OAAgB,GAAA,SAAA;;;;MCpGf,KAAA,CAAA,EAAA,OAAc,GAAA,SAAA;;MAYf,OAAY,CAAA,EAAA,OAAA,GAAU,SAAA;;MAgChB,EAAA,CAAA,EAAA,OAAe,GAAA,SAAI;MAWzB,GAAQ,CAAA,EAAA,OAAA,GAA2C,SAAK;IAIxD,CAAA,GAAA,SAAA;;;;IC1DN,iBAAA,CAAA,EAAoB,MAAA,GAAA,SAAA;IAQb,eAAA,CAAA,EAAA,MAAqB,GAAA,SAAA;EAQrB,CAAA,GAAA,SAAA;EAAoB,cAAA,CAAA,EAAA;IAE1B,UAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IACQ,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAKA,eAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAqB,WAAA,CAAA,EAAA,MAAA,GAAA,SAAA;IACvC,aAAA,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;EAAA,CAAA,GAAA,SAAA;CAAA,CAAA;AAKsB,KL6CX,gBAAA,GAAmB,CAAA,CAAE,KK7CV,CAAA,OL6CuB,sBK7CvB,CAAA;AAAoB,KL+C/B,qBAAA,GAAwB,OK/CO,CL+CC,gBK/CD,CAAA,GAAA;EAAA,WAAA,EAAA,MAAA;;AAwC3C;AAAyC,iBLYzB,WAAA,CKZyB,KAAA,ELYN,qBKZM,CAAA,ELYkB,gBKZlB;;AAA8B,iBL0BvD,sBAAA,CAAA,CK1BuD,EAAA,MAAA,CAAA;;;;;;;UJ5EtD,cAAA;;;;;EDCJ,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAA;;AAcD,UCPK,cAAA,CDOL;gBCNI;kBACE,0BAA0B,IAAI;sBAC1B,qBAAqB,IAAI,eAAe;kBAC5C,QAAQ,kBAAkB;;;iBAI5B,oBAAA,CAAA,GAAwB;;;;;UCdvB,aAAA;;;EFDJ,WAAA,EAAA,MAAA;EAcD,KAAA,EAAA,OAAA,GAAA,MAAA,GAAA,MAAA,GAAA,OAAA;EAAA,WAAA,EAAA,OAAA;mBEPO;;UAGF,MAAA;;;;;+BAKc;iBACd;;;iBAID,YAAA,UAAsB,gBAAgB;;iBA8CtC,oBAAA,wBAAuD;iBA8BvD,eAAA,SAAwB;iBAIxB,eAAA,CAAA,GAAmB;;;;;UC/FlB,cAAA;;;EHLJ,WAAA,EAAA,MAAA;EAcD,QAAA,CAAA,EAAA,MAAA;EAAA,UAAA,CAAA,EAAA,MAAA;wBGHY;;;iBAOR,YAAA,UAAsB;;iBA4DhB,eAAA,CAAA,GAAmB;iBAWzB,SAAA,gBAAyB;iBAIzB,aAAA,CAAA,GAAa,mBAAA,CAAA,IAAA;iBAIb,eAAA,CAAA;;;;iBAOA,gBAAA,CAAA;;;;UCpGC,cAAA;;;;EJJJ,QAAA,CAAA,EAAA,MAAA;EAcD,UAAA,CAAA,EAAA,MAAA;;;iBIEI,YAAA,UAAsB;;iBAgChB,eAAA,CAAA,GAAmB;iBAWzB,QAAA,kCAAmD;iBAInD,gBAAA,CAAA;;;;UC1DN,oBAAA;ELLG,aAAA,EAAA,MAAA;EAcD,OAAA,EAAA,MAAA;EAAA,MAAA,EAAA,MAAA;;;;UKDK,qBAAA;;;;;;;UAQA,oBAAA;;WAEN;mBACQ;;;;;mBAKA;;;;aAKN;uBACU;;;;iBAwCP,yBAAA,UAAmC,uBAAoB,mBAAA,QAAA;;;;UChEtD,iBAAA;;;ENXJ,OAAA,CAAA,EAAA,MAAA;EAcD,KAAA,CAAA,EAAA;IAAA,OAAA,CAAA,EAAA,MAAA;;;;;;;;;YMWA;eACG;;KAGH,UAAA,GAAa;;iBAGT,gBAAA,UAA0B,oBAAoB;;;;ANlBlD,UOsBK,YAAA,CPtBL;;;;;;;aO6BC;aACA;aACA;;;UAII,eAAA;;;;;UAOA,kBAAA;mBACE;mBACA;oBACC;mBACD;kBACD;0BACQ,kBAAkB;;;;;;gCAGZ;gDACgB;;;;;EPlEJ,aAAA,EAAA,GAAA,GOoErB,UPpEqB,CAAA,OOoEH,aPpEG,CAAA;EAgBhC,gBAAA,EAAA,CAAA,OAAA,EOqDkB,IPrDO,COqDF,iBPrDE,EAAA,YAAA,CAAA,EAAA,GOqDmC,UPrDnC;EAAA,QAAA,EAAA,GAAA,GOsDnB,OPtDmB,CAAA,IAAA,CAAA;EAAA,OAAkB,EAAA,GAAA,GAAA,OAAA;EAA+B,MAA5C,EAAA,GAAA,GO0D1B,YP1D0B;EAAK,KAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,GAAA,GO6DV,CP7DU,GO6DN,OP7DM,CO6DE,CP7DF,CAAA,EAAA,GO6DS,OP7DT,CO6DiB,CP7DjB,CAAA;EAGlC,OAAA,EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,GAAA,GO2DY,CPpDb,GOoDiB,OPpDjB,COoDyB,CPpDzB,CAAA,EAAA,QAAA,CAAA,EOoDwC,CPpDxC,EAAA,GOoD8C,OPpD9C,COoDsD,CPpDtD,GAAA,SAAA,CAAA;;;iBOwDI,gBAAA,QAAwB,wBAAwB;;cAgNnD,2BAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/config.ts","../src/features/context.ts","../src/features/logging.ts","../src/features/tracing.ts","../src/features/metrics.ts","../src/integrations/fastify-plugin.ts","../src/integrations/http-client.ts","../src/foundation.ts"],"sourcesContent":null,"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/config.ts","../src/features/context.ts","../src/features/logging.ts","../src/features/tracing.ts","../src/features/metrics.ts","../src/integrations/fastify-plugin.ts","../src/integrations/http-client.ts","../src/foundation.ts"],"sourcesContent":null,"mappings":"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"}
package/dist/index.js CHANGED
@@ -147,10 +147,13 @@ function createLogger(options) {
147
147
  const span = __opentelemetry_api.trace.getActiveSpan();
148
148
  const spanContext = span?.spanContext();
149
149
  const ctx = contextManager?.getContext();
150
+ const traceId = spanContext?.traceId || ctx?.traceId;
151
+ const spanId = spanContext?.spanId || ctx?.spanId;
152
+ const correlationId = ctx?.correlationId;
150
153
  return {
151
- traceId: spanContext?.traceId || ctx?.traceId,
152
- spanId: spanContext?.spanId || ctx?.spanId,
153
- correlationId: ctx?.correlationId
154
+ trace_id: traceId,
155
+ span_id: spanId,
156
+ correlation_id: correlationId
154
157
  };
155
158
  },
156
159
  formatters: { level: (label) => ({ level: label }) },
@@ -185,7 +188,10 @@ function createFallbackLogger(serviceName = "unknown") {
185
188
  ...obj,
186
189
  msg
187
190
  };
188
- console[level === "debug" ? "log" : level](JSON.stringify(logObj));
191
+ const payload = JSON.stringify(logObj);
192
+ if (level === "warn") console.warn(payload);
193
+ else if (level === "error") console.error(payload);
194
+ else console.log(payload);
189
195
  };
190
196
  const fallback = {
191
197
  debug: (obj, msg) => log("debug", obj, msg),
@@ -417,8 +423,9 @@ function createObservabilityPlugin(options) {
417
423
  request.__requestContext = requestContext;
418
424
  runInContext(requestContext, () => {
419
425
  const logData = {
420
- correlationId,
421
- traceId: traceId || void 0,
426
+ correlation_id: correlationId,
427
+ trace_id: traceId || void 0,
428
+ span_id: spanId || void 0,
422
429
  method: request.method,
423
430
  url: request.url,
424
431
  ip: request.ip,
@@ -437,7 +444,7 @@ function createObservabilityPlugin(options) {
437
444
  }
438
445
  runInContext(ctx, () => {
439
446
  logger.debug({
440
- correlationId: ctx.correlationId,
447
+ correlation_id: ctx.correlationId,
441
448
  body: truncateBody(request.body, maxBodySize)
442
449
  }, "Request body");
443
450
  done();
@@ -451,7 +458,7 @@ function createObservabilityPlugin(options) {
451
458
  }
452
459
  runInContext(ctx, () => {
453
460
  logger.debug({
454
- correlationId: ctx.correlationId,
461
+ correlation_id: ctx.correlationId,
455
462
  statusCode: reply.statusCode,
456
463
  body: truncateBody(payload, maxBodySize)
457
464
  }, "Response body");
@@ -474,7 +481,7 @@ function createObservabilityPlugin(options) {
474
481
  };
475
482
  runInContext(ctx, () => {
476
483
  logger.info({
477
- correlationId: ctx.correlationId,
484
+ correlation_id: ctx.correlationId,
478
485
  method: request.method,
479
486
  statusCode: reply.statusCode,
480
487
  durationMs
@@ -502,7 +509,7 @@ function createObservabilityPlugin(options) {
502
509
  }
503
510
  runInContext(ctx, () => {
504
511
  logger.error({
505
- correlationId: ctx.correlationId,
512
+ correlation_id: ctx.correlationId,
506
513
  method: request.method,
507
514
  url: request.url,
508
515
  error: error.message
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["input: FoundationConfigInput","context: RequestContext","fn: () => T","key: K","updates: Partial<RequestContext>","options: LoggerOptions","pinoLogger: PinoLogger","serviceName: string","level: string","obj: object","msg?: string","fallback: Logger","globalLogger: Logger | null","logger: Logger","sdk: NodeSDK | null","options: TracingOptions","config: AutoInstrumentationConfig","mapping: Record<string, string>","result: Record<string, { enabled: boolean }>","name: string","meterProvider: MeterProvider | null","options: MetricsOptions","name: string","version: string","headers: Record<string, unknown>","redactList: string[]","redacted: Record<string, unknown>","body: unknown","maxSize: number","options: FastifyPluginOptions","plugin: FastifyPluginAsync<Partial<FastifyPluginOptions>>","ctx: PluginRequestContext","fn: () => T","_ctx: PluginRequestContext","requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']>","requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']>","requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']>","request: FastifyRequest","reply: FastifyReply","span: Span | undefined","requestContext: PluginRequestContext","logData: Record<string, unknown>","_reply: FastifyReply","error: Error","options: HttpClientOptions","logger: Logger","requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null","requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']> | null","requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null","config: InternalAxiosRequestConfig","carrier: Record<string, string>","response: AxiosResponse","retryConfig: IAxiosRetryConfig","config: AxiosRequestConfig","input: FoundationConfigInput","logger: Logger","loggingError: string | undefined","tracerInstance: Tracer | null","tracingError: string | undefined","meterInstance: Meter | null","metricsError: string | undefined","foundation: FoundationInstance","name?: string","name: string","version?: string","promises: Promise<void>[]","fn: () => T | Promise<T>","fallback?: T"],"sources":["../src/config.ts","../src/features/context.ts","../src/features/logging.ts","../src/features/tracing.ts","../src/features/metrics.ts","../src/integrations/fastify-plugin.ts","../src/integrations/http-client.ts","../src/foundation.ts"],"sourcesContent":["/**\n * Foundation Configuration with Zod Validation\n */\n\nimport { z } from 'zod';\n\n// Auto-Instrumentation Config\nexport const AutoInstrumentationConfigSchema = z\n .object({\n http: z.boolean().default(true),\n fastify: z.boolean().default(true),\n express: z.boolean().default(true),\n mongodb: z.boolean().default(true),\n pg: z.boolean().default(true),\n mysql: z.boolean().default(true),\n redis: z.boolean().default(true),\n ioredis: z.boolean().default(true),\n grpc: z.boolean().default(true),\n fs: z.boolean().default(false),\n dns: z.boolean().default(false),\n })\n .partial();\n\nexport type AutoInstrumentationConfig = z.infer<typeof AutoInstrumentationConfigSchema>;\n\n// Features Config\nexport const FeaturesConfigSchema = z\n .object({\n tracing: z.boolean().default(true),\n metrics: z.boolean().default(true),\n logging: z.boolean().default(true),\n autoInstrumentation: AutoInstrumentationConfigSchema.default({}),\n })\n .partial();\n\nexport type FeaturesConfig = z.infer<typeof FeaturesConfigSchema>;\n\n// OTEL Config\nconst DEFAULT_OTEL_ENDPOINT =\n 'http://otel-stack-deployment-collector.observability.svc.cluster.local:4317';\n\nexport const OtelConfigSchema = z\n .object({\n endpoint: z.string().default(DEFAULT_OTEL_ENDPOINT),\n metricsIntervalMs: z.number().min(1000).default(5000),\n traceSampleRate: z.number().min(0).max(1).default(1.0),\n })\n .partial();\n\nexport type OtelConfig = z.infer<typeof OtelConfigSchema>;\n\n// Logging Config\nexport const LoggingConfigSchema = z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n prettyPrint: z.boolean().optional(),\n })\n .partial();\n\nexport type LoggingConfig = z.infer<typeof LoggingConfigSchema>;\n\n// Request Logging Config\nexport const RequestLoggingConfigSchema = z\n .object({\n logHeaders: z.boolean().default(true),\n logBody: z.boolean().default(false),\n logResponseBody: z.boolean().default(false),\n maxBodySize: z.number().default(10 * 1024),\n redactHeaders: z.array(z.string()).optional(),\n })\n .partial();\n\nexport type RequestLoggingConfig = z.infer<typeof RequestLoggingConfigSchema>;\n\n// Main Foundation Config\nexport const FoundationConfigSchema = z.object({\n serviceName: z.string().min(1, 'serviceName is required'),\n serviceVersion: z.string().default(process.env.SERVICE_VERSION || '1.0.0'),\n environment: z\n .enum(['development', 'staging', 'qa', 'production'])\n .default((process.env.NODE_ENV as 'development' | 'production') || 'development'),\n features: FeaturesConfigSchema.default({}),\n otel: OtelConfigSchema.default({}),\n logging: LoggingConfigSchema.default({}),\n requestLogging: RequestLoggingConfigSchema.default({}),\n});\n\nexport type FoundationConfig = z.infer<typeof FoundationConfigSchema>;\n\nexport type FoundationConfigInput = Partial<FoundationConfig> & {\n serviceName: string;\n};\n\n/** Parse and validate configuration */\nexport function parseConfig(input: FoundationConfigInput): FoundationConfig {\n const result = FoundationConfigSchema.safeParse(input);\n\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join('.')}: ${e.message}`)\n .join('\\n');\n throw new Error(`Invalid foundation configuration:\\n${errors}`);\n }\n\n return result.data;\n}\n\n/** Get default OTEL endpoint */\nexport function getDefaultOtelEndpoint(): string {\n return process.env.OTEL_EXPORTER_OTLP_ENDPOINT || DEFAULT_OTEL_ENDPOINT;\n}\n","/**\n * Context Manager - AsyncLocalStorage for request context propagation\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\n\nexport interface RequestContext {\n correlationId?: string;\n traceId?: string;\n spanId?: string;\n startTime?: number;\n [key: string]: unknown;\n}\n\nexport interface ContextManager {\n getContext(): RequestContext | undefined;\n run<T>(context: RequestContext, fn: () => T): T;\n get<K extends keyof RequestContext>(key: K): RequestContext[K] | undefined;\n update(updates: Partial<RequestContext>): RequestContext | undefined;\n}\n\n/** Create a new context manager instance */\nexport function createContextManager(): ContextManager {\n const als = new AsyncLocalStorage<RequestContext>();\n\n return {\n getContext: () => als.getStore(),\n\n run<T>(context: RequestContext, fn: () => T): T {\n return als.run(context, fn);\n },\n\n get<K extends keyof RequestContext>(key: K): RequestContext[K] | undefined {\n return als.getStore()?.[key];\n },\n\n update(updates: Partial<RequestContext>): RequestContext | undefined {\n const current = als.getStore();\n if (!current) return undefined;\n Object.assign(current, updates);\n return current;\n },\n };\n}\n","/**\n * Structured Logging with Pino\n */\n\nimport pino, { Logger as PinoLogger } from 'pino';\nimport { trace } from '@opentelemetry/api';\nimport { type ContextManager } from './context';\n\nexport interface LoggerOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n level: 'debug' | 'info' | 'warn' | 'error';\n prettyPrint: boolean;\n contextManager?: ContextManager;\n}\n\nexport interface Logger {\n debug: (obj: object, msg?: string) => void;\n info: (obj: object, msg?: string) => void;\n warn: (obj: object, msg?: string) => void;\n error: (obj: object, msg?: string) => void;\n child: (bindings: object) => Logger;\n readonly pino: PinoLogger;\n}\n\n/** Create a structured logger with automatic trace context injection */\nexport function createLogger(options: LoggerOptions): Logger {\n const { serviceName, serviceVersion, environment, level, prettyPrint, contextManager } = options;\n\n const pinoLogger = pino({\n level,\n base: { service: serviceName, version: serviceVersion, env: environment },\n mixin: () => {\n const span = trace.getActiveSpan();\n const spanContext = span?.spanContext();\n const ctx = contextManager?.getContext();\n\n return {\n traceId: spanContext?.traceId || ctx?.traceId,\n spanId: spanContext?.spanId || ctx?.spanId,\n correlationId: ctx?.correlationId,\n };\n },\n formatters: { level: (label) => ({ level: label }) },\n transport: prettyPrint\n ? {\n target: 'pino-pretty',\n options: { colorize: true, translateTime: 'SYS:standard', ignore: 'pid,hostname' },\n }\n : undefined,\n });\n\n return wrapPinoLogger(pinoLogger);\n}\n\nfunction wrapPinoLogger(pinoLogger: PinoLogger): Logger {\n return {\n debug: (obj, msg) => pinoLogger.debug(obj, msg),\n info: (obj, msg) => pinoLogger.info(obj, msg),\n warn: (obj, msg) => pinoLogger.warn(obj, msg),\n error: (obj, msg) => pinoLogger.error(obj, msg),\n child: (bindings) => wrapPinoLogger(pinoLogger.child(bindings)),\n pino: pinoLogger,\n };\n}\n\n/** Fallback logger when Pino is not available */\nexport function createFallbackLogger(serviceName: string = 'unknown'): Logger {\n const log = (level: string, obj: object, msg?: string) => {\n const logObj = {\n timestamp: new Date().toISOString(),\n level,\n service: serviceName,\n ...obj,\n msg,\n };\n console[level === 'debug' ? 'log' : (level as 'info' | 'warn' | 'error')](\n JSON.stringify(logObj)\n );\n };\n\n const fallback: Logger = {\n debug: (obj, msg) => log('debug', obj, msg),\n info: (obj, msg) => log('info', obj, msg),\n warn: (obj, msg) => log('warn', obj, msg),\n error: (obj, msg) => log('error', obj, msg),\n child: () => fallback,\n pino: null as unknown as PinoLogger,\n };\n\n return fallback;\n}\n\n// Global logger for standalone usage\nlet globalLogger: Logger | null = null;\n\nexport function setGlobalLogger(logger: Logger): void {\n globalLogger = logger;\n}\n\nexport function getGlobalLogger(): Logger {\n return globalLogger || createFallbackLogger();\n}\n","/**\n * OpenTelemetry Tracing Setup\n */\n\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { trace, context, propagation, SpanStatusCode, type Tracer } from '@opentelemetry/api';\nimport { type AutoInstrumentationConfig, getDefaultOtelEndpoint } from '../config';\n\nexport interface TracingOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n endpoint?: string;\n sampleRate?: number;\n autoInstrumentation?: AutoInstrumentationConfig;\n}\n\nlet sdk: NodeSDK | null = null;\nlet isInitialized = false;\n\n/** Initialize OpenTelemetry tracing */\nexport function setupTracing(options: TracingOptions): void {\n if (isInitialized) {\n console.warn('[neoiq-foundation] Tracing already initialized');\n return;\n }\n\n const {\n serviceName,\n serviceVersion,\n environment,\n endpoint = getDefaultOtelEndpoint(),\n autoInstrumentation = {},\n } = options;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: serviceVersion,\n 'deployment.environment': environment,\n });\n\n const traceExporter = new OTLPTraceExporter({ url: endpoint });\n const instrumentationConfig = buildInstrumentationConfig(autoInstrumentation);\n\n sdk = new NodeSDK({\n resource,\n traceExporter,\n instrumentations: [getNodeAutoInstrumentations(instrumentationConfig)],\n });\n\n sdk.start();\n isInitialized = true;\n}\n\nfunction buildInstrumentationConfig(\n config: AutoInstrumentationConfig\n): Record<string, { enabled: boolean }> {\n const mapping: Record<string, string> = {\n http: '@opentelemetry/instrumentation-http',\n fastify: '@opentelemetry/instrumentation-fastify',\n express: '@opentelemetry/instrumentation-express',\n mongodb: '@opentelemetry/instrumentation-mongodb',\n pg: '@opentelemetry/instrumentation-pg',\n mysql: '@opentelemetry/instrumentation-mysql',\n redis: '@opentelemetry/instrumentation-redis',\n ioredis: '@opentelemetry/instrumentation-ioredis',\n grpc: '@opentelemetry/instrumentation-grpc',\n fs: '@opentelemetry/instrumentation-fs',\n dns: '@opentelemetry/instrumentation-dns',\n };\n\n const result: Record<string, { enabled: boolean }> = {};\n for (const [key, instrumentationName] of Object.entries(mapping)) {\n const userSetting = config[key as keyof AutoInstrumentationConfig];\n const defaultValue = key !== 'fs' && key !== 'dns';\n result[instrumentationName] = { enabled: userSetting ?? defaultValue };\n }\n return result;\n}\n\n/** Shutdown tracing gracefully */\nexport async function shutdownTracing(): Promise<void> {\n if (!sdk) return;\n try {\n await sdk.shutdown();\n isInitialized = false;\n sdk = null;\n } catch (error) {\n console.error('[neoiq-foundation] Error shutting down tracing:', error);\n }\n}\n\nexport function getTracer(name: string): Tracer {\n return trace.getTracer(name);\n}\n\nexport function getActiveSpan() {\n return trace.getActiveSpan();\n}\n\nexport function getTraceContext(): { traceId?: string; spanId?: string } {\n const span = trace.getActiveSpan();\n if (!span) return {};\n const ctx = span.spanContext();\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n\nexport function isTracingEnabled(): boolean {\n return isInitialized;\n}\n\nexport { trace, context, propagation, SpanStatusCode };\nexport type { Tracer };\n","/**\n * OpenTelemetry Metrics Setup\n */\n\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc';\nimport { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { metrics, type Meter } from '@opentelemetry/api';\nimport { getDefaultOtelEndpoint } from '../config';\n\nexport interface MetricsOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n endpoint?: string;\n intervalMs?: number;\n}\n\nlet meterProvider: MeterProvider | null = null;\nlet isInitialized = false;\n\n/** Initialize OpenTelemetry metrics */\nexport function setupMetrics(options: MetricsOptions): void {\n if (isInitialized) {\n console.warn('[neoiq-foundation] Metrics already initialized');\n return;\n }\n\n const {\n serviceName,\n serviceVersion,\n environment,\n endpoint = getDefaultOtelEndpoint(),\n intervalMs = 5000,\n } = options;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: serviceVersion,\n 'deployment.environment': environment,\n });\n\n const metricExporter = new OTLPMetricExporter({ url: endpoint });\n const metricReader = new PeriodicExportingMetricReader({\n exporter: metricExporter,\n exportIntervalMillis: intervalMs,\n });\n\n meterProvider = new MeterProvider({ resource, readers: [metricReader] });\n metrics.setGlobalMeterProvider(meterProvider);\n isInitialized = true;\n}\n\n/** Shutdown metrics gracefully */\nexport async function shutdownMetrics(): Promise<void> {\n if (!meterProvider) return;\n try {\n await meterProvider.shutdown();\n isInitialized = false;\n meterProvider = null;\n } catch (error) {\n console.error('[neoiq-foundation] Error shutting down metrics:', error);\n }\n}\n\nexport function getMeter(name: string, version: string = '1.0.0'): Meter {\n return metrics.getMeter(name, version);\n}\n\nexport function isMetricsEnabled(): boolean {\n return isInitialized;\n}\n\nexport { metrics };\nexport type { Meter };\n","/**\n * Fastify Observability Plugin\n */\n\nimport { FastifyPluginAsync, FastifyRequest, FastifyReply } from 'fastify';\nimport fp from 'fastify-plugin';\nimport { randomUUID } from 'crypto';\nimport { trace, context, propagation, SpanStatusCode, Span } from '@opentelemetry/api';\nimport { type ContextManager } from '../features/context';\nimport { type Logger, getGlobalLogger } from '../features/logging';\nimport { getMeter } from '../features/metrics';\n\ninterface PluginRequestContext {\n correlationId: string;\n traceId: string;\n spanId: string;\n startTime: number;\n [key: string]: unknown;\n}\n\nexport interface RequestLoggingOptions {\n logHeaders?: boolean;\n logBody?: boolean;\n logResponseBody?: boolean;\n maxBodySize?: number;\n redactHeaders?: string[];\n}\n\nexport interface FastifyPluginOptions {\n serviceName: string;\n logger?: Logger;\n contextManager?: ContextManager;\n tracingEnabled?: boolean;\n metricsEnabled?: boolean;\n excludeRoutes?: string[];\n /** Request/response logging options */\n requestLogging?: RequestLoggingOptions;\n}\n\ndeclare module 'fastify' {\n interface FastifyRequest {\n __span?: Span;\n __requestContext?: PluginRequestContext;\n }\n}\n\n// Default headers to redact for security\nconst DEFAULT_REDACT_HEADERS = [\n 'authorization',\n 'cookie',\n 'x-api-key',\n 'x-auth-token',\n 'set-cookie',\n];\n\n/** Redact sensitive headers */\nfunction redactHeaders(\n headers: Record<string, unknown>,\n redactList: string[]\n): Record<string, unknown> {\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (redactList.includes(key.toLowerCase())) {\n redacted[key] = '[REDACTED]';\n } else {\n redacted[key] = value;\n }\n }\n return redacted;\n}\n\n/** Truncate body if too large */\nfunction truncateBody(body: unknown, maxSize: number): unknown {\n if (body === undefined || body === null) return undefined;\n const str = typeof body === 'string' ? body : JSON.stringify(body);\n if (str.length > maxSize) {\n return `[TRUNCATED - ${str.length} bytes]`;\n }\n return body;\n}\n\n/** Create a configured Fastify observability plugin */\nexport function createObservabilityPlugin(options: FastifyPluginOptions) {\n const plugin: FastifyPluginAsync<Partial<FastifyPluginOptions>> = async (fastify, pluginOpts) => {\n const {\n serviceName,\n logger = getGlobalLogger(),\n contextManager,\n tracingEnabled = true,\n metricsEnabled = true,\n excludeRoutes = ['/health', '/health/', '/healthz', '/ready', '/live'],\n requestLogging = {},\n } = { ...options, ...pluginOpts };\n\n // Request logging config\n const logHeaders = requestLogging.logHeaders ?? true;\n const logBody = requestLogging.logBody ?? false;\n const logResponseBody = requestLogging.logResponseBody ?? false;\n const maxBodySize = requestLogging.maxBodySize ?? 10 * 1024; // 10KB\n const headersToRedact = requestLogging.redactHeaders ?? DEFAULT_REDACT_HEADERS;\n\n const runInContext = contextManager\n ? <T>(ctx: PluginRequestContext, fn: () => T) => contextManager.run(ctx, fn)\n : <T>(_ctx: PluginRequestContext, fn: () => T) => fn();\n\n const tracer = tracingEnabled ? trace.getTracer('neoiq-foundation-node') : null;\n\n let requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']>;\n let requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']>;\n let requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']>;\n\n if (metricsEnabled) {\n const meter = getMeter(serviceName);\n requestCounter = meter.createCounter('http.server.requests.total');\n requestDuration = meter.createHistogram('http.server.request.duration', { unit: 'ms' });\n requestErrors = meter.createCounter('http.server.requests.errors');\n }\n\n // onRequest - Extract context, start span, log headers\n fastify.addHook('onRequest', (request: FastifyRequest, reply: FastifyReply, done) => {\n if (excludeRoutes.some((route) => request.url.startsWith(route))) {\n done();\n return;\n }\n\n const correlationId = (request.headers['x-request-id'] as string) || randomUUID();\n reply.header('x-request-id', correlationId);\n\n let span: Span | undefined;\n let traceId = '';\n let spanId = '';\n\n if (tracer) {\n const parentContext = propagation.extract(context.active(), request.headers);\n span = tracer.startSpan(\n `${request.method} ${request.routeOptions?.url || request.url}`,\n {\n kind: 1,\n attributes: {\n 'http.method': request.method,\n 'http.url': request.url,\n 'http.route': request.routeOptions?.url || request.url,\n 'http.user_agent': request.headers['user-agent'] || '',\n 'http.correlation_id': correlationId,\n },\n },\n parentContext\n );\n const spanContext = span.spanContext();\n traceId = spanContext.traceId;\n spanId = spanContext.spanId;\n }\n\n const requestContext: PluginRequestContext = {\n correlationId,\n traceId,\n spanId,\n startTime: Date.now(),\n };\n request.__span = span;\n request.__requestContext = requestContext;\n\n runInContext(requestContext, () => {\n const logData: Record<string, unknown> = {\n correlationId,\n traceId: traceId || undefined,\n method: request.method,\n url: request.url,\n ip: request.ip,\n userAgent: request.headers['user-agent'],\n };\n\n // Log headers (redacted)\n if (logHeaders) {\n logData.headers = redactHeaders(\n request.headers as Record<string, unknown>,\n headersToRedact\n );\n }\n\n logger.info(logData, 'Request received');\n done();\n });\n });\n\n // preHandler - Log request body (if enabled)\n if (logBody) {\n fastify.addHook('preHandler', (request: FastifyRequest, _reply: FastifyReply, done) => {\n const ctx = request.__requestContext;\n if (!ctx || !request.body) {\n done();\n return;\n }\n\n runInContext(ctx, () => {\n logger.debug(\n {\n correlationId: ctx.correlationId,\n body: truncateBody(request.body, maxBodySize),\n },\n 'Request body'\n );\n done();\n });\n });\n }\n\n // onSend - Log response body (if enabled)\n if (logResponseBody) {\n fastify.addHook('onSend', (request: FastifyRequest, reply: FastifyReply, payload, done) => {\n const ctx = request.__requestContext;\n if (!ctx) {\n done(null, payload);\n return;\n }\n\n runInContext(ctx, () => {\n logger.debug(\n {\n correlationId: ctx.correlationId,\n statusCode: reply.statusCode,\n body: truncateBody(payload, maxBodySize),\n },\n 'Response body'\n );\n done(null, payload);\n });\n });\n }\n\n // onResponse - End span, record metrics\n fastify.addHook('onResponse', (request: FastifyRequest, reply: FastifyReply, done) => {\n const ctx = request.__requestContext;\n const span = request.__span;\n if (!ctx) {\n done();\n return;\n }\n\n const durationMs = Date.now() - ctx.startTime;\n const route = request.routeOptions?.url || request.url;\n const labels = { method: request.method, route, status_code: String(reply.statusCode) };\n\n runInContext(ctx, () => {\n logger.info(\n {\n correlationId: ctx.correlationId,\n method: request.method,\n statusCode: reply.statusCode,\n durationMs,\n },\n 'Request completed'\n );\n\n if (metricsEnabled) {\n requestCounter.add(1, labels);\n requestDuration.record(durationMs, labels);\n if (reply.statusCode >= 400) requestErrors.add(1, labels);\n }\n\n if (span) {\n span.setStatus({\n code: reply.statusCode < 400 ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n });\n span.setAttribute('http.status_code', reply.statusCode);\n span.setAttribute('http.response_time_ms', durationMs);\n span.end();\n }\n\n done();\n });\n });\n\n // onError - Record exception on span\n fastify.addHook(\n 'onError',\n (request: FastifyRequest, _reply: FastifyReply, error: Error, done) => {\n const ctx = request.__requestContext;\n const span = request.__span;\n if (!ctx) {\n done();\n return;\n }\n\n runInContext(ctx, () => {\n logger.error(\n {\n correlationId: ctx.correlationId,\n method: request.method,\n url: request.url,\n error: error.message,\n },\n 'Request failed'\n );\n\n if (span) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n }\n\n done();\n });\n }\n );\n };\n\n return fp(plugin, { name: 'neoiq-observability', fastify: '>=4.x' });\n}\n","/**\n * HTTP Client with Observability\n */\n\nimport axios from 'axios';\nimport type {\n AxiosInstance,\n AxiosRequestConfig,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\nimport axiosRetry, { IAxiosRetryConfig } from 'axios-retry';\nimport CircuitBreaker from 'opossum';\nimport { context, propagation } from '@opentelemetry/api';\nimport type { FoundationInstance } from '../foundation';\nimport { getGlobalLogger, type Logger } from '../features/logging';\nimport { getMeter } from '../features/metrics';\n\nexport interface HttpClientOptions {\n baseURL: string;\n serviceName: string;\n timeout?: number;\n retry?: {\n retries?: number;\n retryDelay?: number;\n retryStatusCodes?: number[];\n };\n circuitBreaker?: {\n enabled?: boolean;\n resetTimeout?: number;\n errorThresholdPercentage?: number;\n };\n headers?: Record<string, string>;\n foundation?: FoundationInstance;\n}\n\nexport type HttpClient = AxiosInstance;\n\n/** Create a configured HTTP client with full observability */\nexport function createHttpClient(options: HttpClientOptions): HttpClient {\n const {\n baseURL,\n serviceName,\n timeout = 30000,\n retry = {},\n circuitBreaker: cbOptions = {},\n headers = {},\n foundation,\n } = options;\n\n const logger: Logger = foundation?.logger || getGlobalLogger();\n const getContext = () => foundation?.context.getContext();\n const metricsEnabled = foundation?.features.metrics ?? true;\n const tracingEnabled = foundation?.features.tracing ?? true;\n\n const client = axios.create({\n baseURL,\n timeout,\n headers: { 'Content-Type': 'application/json', ...headers },\n });\n\n // Metrics\n let requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null = null;\n let requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']> | null = null;\n let requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null = null;\n\n if (metricsEnabled) {\n const meter = getMeter(`http-client-${serviceName}`);\n requestCounter = meter.createCounter('http.client.requests.total');\n requestDuration = meter.createHistogram('http.client.request.duration', { unit: 'ms' });\n requestErrors = meter.createCounter('http.client.requests.errors');\n }\n\n // Request interceptor - Add trace context\n client.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n if (tracingEnabled) {\n const carrier: Record<string, string> = {};\n propagation.inject(context.active(), carrier);\n if (carrier.traceparent) config.headers.set('traceparent', carrier.traceparent);\n if (carrier.tracestate) config.headers.set('tracestate', carrier.tracestate);\n }\n\n const reqCtx = getContext();\n if (reqCtx?.correlationId) config.headers.set('x-request-id', reqCtx.correlationId);\n\n (config as InternalAxiosRequestConfig & { __startTime: number }).__startTime = Date.now();\n\n logger.debug(\n {\n method: config.method?.toUpperCase(),\n url: `${config.baseURL || ''}${config.url}`,\n targetService: serviceName,\n },\n 'Outbound HTTP request'\n );\n\n return config;\n });\n\n // Response interceptor - Log and record metrics\n client.interceptors.response.use(\n (response: AxiosResponse) => {\n const config = response.config as InternalAxiosRequestConfig & { __startTime?: number };\n const durationMs = Date.now() - (config.__startTime || Date.now());\n const labels = {\n target_service: serviceName,\n method: config.method?.toUpperCase() || 'GET',\n status_code: String(response.status),\n };\n\n logger.debug(\n {\n method: config.method?.toUpperCase(),\n statusCode: response.status,\n durationMs,\n targetService: serviceName,\n },\n 'Outbound HTTP response'\n );\n\n if (metricsEnabled) {\n requestCounter?.add(1, labels);\n requestDuration?.record(durationMs, labels);\n }\n\n return response;\n },\n (error) => {\n const config = error.config as\n | (InternalAxiosRequestConfig & { __startTime?: number })\n | undefined;\n const durationMs = config ? Date.now() - (config.__startTime || Date.now()) : 0;\n const statusCode = error.response?.status || 0;\n const labels = {\n target_service: serviceName,\n method: config?.method?.toUpperCase() || 'GET',\n status_code: String(statusCode),\n };\n\n logger.error(\n {\n method: config?.method?.toUpperCase(),\n statusCode,\n durationMs,\n error: error.message,\n targetService: serviceName,\n },\n 'Outbound HTTP error'\n );\n\n if (metricsEnabled) {\n requestCounter?.add(1, labels);\n requestDuration?.record(durationMs, labels);\n requestErrors?.add(1, labels);\n }\n\n return Promise.reject(error);\n }\n );\n\n // Retry config\n const retryConfig: IAxiosRetryConfig = {\n retries: retry.retries ?? 3,\n retryDelay: (retryCount) => (retry.retryDelay ?? 1000) * Math.pow(2, retryCount - 1),\n retryCondition: (error) => {\n const retryStatusCodes = retry.retryStatusCodes ?? [408, 429, 500, 502, 503, 504];\n return !error.response || retryStatusCodes.includes(error.response?.status || 0);\n },\n onRetry: (retryCount, error, requestConfig) => {\n logger.warn(\n {\n retryCount,\n url: `${requestConfig.baseURL || ''}${requestConfig.url}`,\n error: error.message,\n },\n 'Retrying request'\n );\n },\n };\n axiosRetry(client, retryConfig);\n\n // Circuit breaker\n if (cbOptions.enabled !== false) {\n const breaker = new CircuitBreaker(\n async (config: AxiosRequestConfig) => client.request(config),\n {\n timeout,\n resetTimeout: cbOptions.resetTimeout ?? 30000,\n errorThresholdPercentage: cbOptions.errorThresholdPercentage ?? 50,\n volumeThreshold: 10,\n }\n );\n breaker.on('open', () => logger.warn({ targetService: serviceName }, 'Circuit breaker OPEN'));\n breaker.on('halfOpen', () =>\n logger.info({ targetService: serviceName }, 'Circuit breaker HALF-OPEN')\n );\n breaker.on('close', () =>\n logger.info({ targetService: serviceName }, 'Circuit breaker CLOSED')\n );\n }\n\n return client;\n}\n\nexport type { AxiosInstance, AxiosRequestConfig, AxiosResponse };\n","/**\n * Foundation - Main Entry Point\n */\n\nimport {\n parseConfig,\n type FoundationConfig,\n type FoundationConfigInput,\n} from './config';\nimport {\n createContextManager,\n type ContextManager,\n type RequestContext,\n} from './features/context';\nimport { createLogger, setGlobalLogger, type Logger } from './features/logging';\nimport {\n setupTracing,\n shutdownTracing,\n getTracer,\n getActiveSpan,\n getTraceContext,\n isTracingEnabled,\n SpanStatusCode,\n type Tracer,\n} from './features/tracing';\nimport {\n setupMetrics,\n shutdownMetrics,\n getMeter,\n isMetricsEnabled,\n type Meter,\n} from './features/metrics';\nimport {\n createObservabilityPlugin,\n type FastifyPluginOptions,\n} from './integrations/fastify-plugin';\nimport {\n createHttpClient as createHttpClientInternal,\n type HttpClientOptions,\n type HttpClient,\n} from './integrations/http-client';\n\n// Health status types\nexport interface HealthStatus {\n status: 'healthy' | 'degraded' | 'unhealthy';\n timestamp: string;\n service: string;\n version: string;\n uptime: number;\n components: {\n tracing: ComponentHealth;\n metrics: ComponentHealth;\n logging: ComponentHealth;\n };\n}\n\nexport interface ComponentHealth {\n enabled: boolean;\n status: 'up' | 'down' | 'disabled';\n message?: string;\n}\n\n// Foundation instance interface\nexport interface FoundationInstance {\n readonly config: FoundationConfig;\n readonly logger: Logger;\n readonly context: ContextManager;\n readonly tracer: Tracer | null;\n readonly meter: Meter | null;\n readonly fastifyPlugin: ReturnType<typeof createObservabilityPlugin>;\n readonly features: { tracing: boolean; metrics: boolean; logging: boolean };\n\n getTracer: (name?: string) => Tracer;\n getMeter: (name: string, version?: string) => Meter;\n getTraceContext: () => { traceId?: string; spanId?: string };\n getActiveSpan: () => ReturnType<typeof getActiveSpan>;\n createHttpClient: (options: Omit<HttpClientOptions, 'foundation'>) => HttpClient;\n shutdown: () => Promise<void>;\n isReady: () => boolean;\n\n // Health check\n health: () => HealthStatus;\n\n // Error boundaries\n trace: <T>(name: string, fn: () => T | Promise<T>) => Promise<T>;\n safeRun: <T>(fn: () => T | Promise<T>, fallback?: T) => Promise<T | undefined>;\n}\n\n/** Create a fully configured observability foundation */\nexport function createFoundation(input: FoundationConfigInput): FoundationInstance {\n const startTime = Date.now();\n const config = parseConfig(input);\n const {\n serviceName,\n serviceVersion,\n environment,\n features: featuresConfig,\n otel,\n logging: loggingConfig,\n requestLogging: requestLoggingConfig,\n } = config;\n\n const features = {\n tracing: featuresConfig.tracing ?? true,\n metrics: featuresConfig.metrics ?? true,\n logging: featuresConfig.logging ?? true,\n };\n\n // Context manager\n const contextManager = createContextManager();\n\n // Logger (always created - has fallback)\n let logger: Logger;\n let loggingError: string | undefined;\n try {\n logger = createLogger({\n serviceName,\n serviceVersion,\n environment,\n level: loggingConfig.level ?? 'info',\n prettyPrint: loggingConfig.prettyPrint ?? environment === 'development',\n contextManager,\n });\n setGlobalLogger(logger);\n } catch (err) {\n loggingError = (err as Error).message;\n // Fallback to console\n logger = {\n debug: (obj, msg) => console.debug(JSON.stringify({ ...obj, msg })),\n info: (obj, msg) => console.info(JSON.stringify({ ...obj, msg })),\n warn: (obj, msg) => console.warn(JSON.stringify({ ...obj, msg })),\n error: (obj, msg) => console.error(JSON.stringify({ ...obj, msg })),\n child: () => logger,\n pino: null as never,\n };\n console.error('[neoiq-foundation] Logger setup failed, using console:', loggingError);\n }\n\n // Tracing (with error boundary)\n let tracerInstance: Tracer | null = null;\n let tracingError: string | undefined;\n if (features.tracing) {\n try {\n setupTracing({\n serviceName,\n serviceVersion,\n environment,\n endpoint: otel.endpoint,\n sampleRate: otel.traceSampleRate,\n autoInstrumentation: featuresConfig.autoInstrumentation,\n });\n tracerInstance = getTracer(serviceName);\n logger.info({ feature: 'tracing', endpoint: otel.endpoint }, 'Tracing enabled');\n } catch (err) {\n tracingError = (err as Error).message;\n logger.error({ error: tracingError }, 'Tracing setup failed - continuing without tracing');\n }\n }\n\n // Metrics (with error boundary)\n let meterInstance: Meter | null = null;\n let metricsError: string | undefined;\n if (features.metrics) {\n try {\n setupMetrics({\n serviceName,\n serviceVersion,\n environment,\n endpoint: otel.endpoint,\n intervalMs: otel.metricsIntervalMs,\n });\n meterInstance = getMeter(serviceName);\n logger.info({ feature: 'metrics', interval: `${otel.metricsIntervalMs}ms` }, 'Metrics enabled');\n } catch (err) {\n metricsError = (err as Error).message;\n logger.error({ error: metricsError }, 'Metrics setup failed - continuing without metrics');\n }\n }\n\n logger.info({ serviceName, serviceVersion, environment, features }, 'Foundation initialized');\n\n const foundation: FoundationInstance = {\n config,\n logger,\n context: contextManager,\n tracer: tracerInstance,\n meter: meterInstance,\n features,\n\n getTracer: (name?: string) => getTracer(name || serviceName),\n getMeter: (name: string, version?: string) => getMeter(name, version),\n getTraceContext,\n getActiveSpan,\n\n fastifyPlugin: createObservabilityPlugin({\n serviceName,\n logger,\n contextManager,\n tracingEnabled: features.tracing && !tracingError,\n metricsEnabled: features.metrics && !metricsError,\n requestLogging: requestLoggingConfig,\n }),\n\n createHttpClient: (options) => createHttpClientInternal({ ...options, foundation }),\n\n shutdown: async () => {\n logger.info({}, 'Shutting down foundation...');\n const promises: Promise<void>[] = [];\n if (features.tracing && isTracingEnabled()) promises.push(shutdownTracing());\n if (features.metrics && isMetricsEnabled()) promises.push(shutdownMetrics());\n await Promise.all(promises);\n logger.info({}, 'Foundation shutdown complete');\n },\n\n isReady: () => {\n if (features.tracing && !tracingError && !isTracingEnabled()) return false;\n if (features.metrics && !metricsError && !isMetricsEnabled()) return false;\n return true;\n },\n\n // Health check\n health: (): HealthStatus => {\n const tracingUp = !features.tracing || (!tracingError && isTracingEnabled());\n const metricsUp = !features.metrics || (!metricsError && isMetricsEnabled());\n const loggingUp = !loggingError;\n\n const allUp = tracingUp && metricsUp && loggingUp;\n const anyDown =\n (features.tracing && tracingError) ||\n (features.metrics && metricsError) ||\n loggingError;\n\n return {\n status: allUp ? 'healthy' : anyDown ? 'degraded' : 'unhealthy',\n timestamp: new Date().toISOString(),\n service: serviceName,\n version: serviceVersion,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n components: {\n tracing: {\n enabled: features.tracing,\n status: !features.tracing ? 'disabled' : tracingError ? 'down' : 'up',\n message: tracingError,\n },\n metrics: {\n enabled: features.metrics,\n status: !features.metrics ? 'disabled' : metricsError ? 'down' : 'up',\n message: metricsError,\n },\n logging: {\n enabled: features.logging,\n status: loggingError ? 'down' : 'up',\n message: loggingError,\n },\n },\n };\n },\n\n // Trace: Run code within a span (Datadog-style)\n trace: async <T>(name: string, fn: () => T | Promise<T>): Promise<T> => {\n const tracer = tracerInstance || getTracer(serviceName);\n\n return new Promise((resolve, reject) => {\n tracer.startActiveSpan(name, async (span) => {\n try {\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n resolve(result);\n } catch (err) {\n const error = err as Error;\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n logger.error({ span: name, error: error.message }, 'Span failed');\n reject(error);\n }\n });\n });\n },\n\n // Safe run: Execute with try-catch, return fallback on error\n safeRun: async <T>(fn: () => T | Promise<T>, fallback?: T): Promise<T | undefined> => {\n try {\n return await fn();\n } catch (err) {\n const error = err as Error;\n logger.error({ error: error.message, stack: error.stack }, 'safeRun caught error');\n return fallback;\n }\n },\n };\n\n return foundation;\n}\n\n/** Alias for createFoundation */\nexport const setupObservability = createFoundation;\n\nexport { SpanStatusCode };\nexport type { FoundationConfig, FoundationConfigInput };\nexport type { Logger };\nexport type { ContextManager, RequestContext };\nexport type { Tracer, Meter };\nexport type { FastifyPluginOptions };\nexport type { HttpClientOptions, HttpClient };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["input: FoundationConfigInput","context: RequestContext","fn: () => T","key: K","updates: Partial<RequestContext>","options: LoggerOptions","pinoLogger: PinoLogger","serviceName: string","level: string","obj: object","msg?: string","fallback: Logger","globalLogger: Logger | null","logger: Logger","sdk: NodeSDK | null","options: TracingOptions","config: AutoInstrumentationConfig","mapping: Record<string, string>","result: Record<string, { enabled: boolean }>","name: string","meterProvider: MeterProvider | null","options: MetricsOptions","name: string","version: string","headers: Record<string, unknown>","redactList: string[]","redacted: Record<string, unknown>","body: unknown","maxSize: number","options: FastifyPluginOptions","plugin: FastifyPluginAsync<Partial<FastifyPluginOptions>>","ctx: PluginRequestContext","fn: () => T","_ctx: PluginRequestContext","requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']>","requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']>","requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']>","request: FastifyRequest","reply: FastifyReply","span: Span | undefined","requestContext: PluginRequestContext","logData: Record<string, unknown>","_reply: FastifyReply","error: Error","options: HttpClientOptions","logger: Logger","requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null","requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']> | null","requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null","config: InternalAxiosRequestConfig","carrier: Record<string, string>","response: AxiosResponse","retryConfig: IAxiosRetryConfig","config: AxiosRequestConfig","input: FoundationConfigInput","logger: Logger","loggingError: string | undefined","tracerInstance: Tracer | null","tracingError: string | undefined","meterInstance: Meter | null","metricsError: string | undefined","foundation: FoundationInstance","name?: string","name: string","version?: string","promises: Promise<void>[]","fn: () => T | Promise<T>","fallback?: T"],"sources":["../src/config.ts","../src/features/context.ts","../src/features/logging.ts","../src/features/tracing.ts","../src/features/metrics.ts","../src/integrations/fastify-plugin.ts","../src/integrations/http-client.ts","../src/foundation.ts"],"sourcesContent":["/**\n * Foundation Configuration with Zod Validation\n */\n\nimport { z } from 'zod';\n\n// Auto-Instrumentation Config\nexport const AutoInstrumentationConfigSchema = z\n .object({\n http: z.boolean().default(true),\n fastify: z.boolean().default(true),\n express: z.boolean().default(true),\n mongodb: z.boolean().default(true),\n pg: z.boolean().default(true),\n mysql: z.boolean().default(true),\n redis: z.boolean().default(true),\n ioredis: z.boolean().default(true),\n grpc: z.boolean().default(true),\n fs: z.boolean().default(false),\n dns: z.boolean().default(false),\n })\n .partial();\n\nexport type AutoInstrumentationConfig = z.infer<typeof AutoInstrumentationConfigSchema>;\n\n// Features Config\nexport const FeaturesConfigSchema = z\n .object({\n tracing: z.boolean().default(true),\n metrics: z.boolean().default(true),\n logging: z.boolean().default(true),\n autoInstrumentation: AutoInstrumentationConfigSchema.default({}),\n })\n .partial();\n\nexport type FeaturesConfig = z.infer<typeof FeaturesConfigSchema>;\n\n// OTEL Config\nconst DEFAULT_OTEL_ENDPOINT =\n 'http://otel-stack-deployment-collector.observability.svc.cluster.local:4317';\n\nexport const OtelConfigSchema = z\n .object({\n endpoint: z.string().default(DEFAULT_OTEL_ENDPOINT),\n metricsIntervalMs: z.number().min(1000).default(5000),\n traceSampleRate: z.number().min(0).max(1).default(1.0),\n })\n .partial();\n\nexport type OtelConfig = z.infer<typeof OtelConfigSchema>;\n\n// Logging Config\nexport const LoggingConfigSchema = z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n prettyPrint: z.boolean().optional(),\n })\n .partial();\n\nexport type LoggingConfig = z.infer<typeof LoggingConfigSchema>;\n\n// Request Logging Config\nexport const RequestLoggingConfigSchema = z\n .object({\n logHeaders: z.boolean().default(true),\n logBody: z.boolean().default(false),\n logResponseBody: z.boolean().default(false),\n maxBodySize: z.number().default(10 * 1024),\n redactHeaders: z.array(z.string()).optional(),\n })\n .partial();\n\nexport type RequestLoggingConfig = z.infer<typeof RequestLoggingConfigSchema>;\n\n// Main Foundation Config\nexport const FoundationConfigSchema = z.object({\n serviceName: z.string().min(1, 'serviceName is required'),\n serviceVersion: z.string().default(process.env.SERVICE_VERSION || '1.0.0'),\n environment: z\n .enum(['development', 'staging', 'qa', 'production'])\n .default((process.env.NODE_ENV as 'development' | 'production') || 'development'),\n features: FeaturesConfigSchema.default({}),\n otel: OtelConfigSchema.default({}),\n logging: LoggingConfigSchema.default({}),\n requestLogging: RequestLoggingConfigSchema.default({}),\n});\n\nexport type FoundationConfig = z.infer<typeof FoundationConfigSchema>;\n\nexport type FoundationConfigInput = Partial<FoundationConfig> & {\n serviceName: string;\n};\n\n/** Parse and validate configuration */\nexport function parseConfig(input: FoundationConfigInput): FoundationConfig {\n const result = FoundationConfigSchema.safeParse(input);\n\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join('.')}: ${e.message}`)\n .join('\\n');\n throw new Error(`Invalid foundation configuration:\\n${errors}`);\n }\n\n return result.data;\n}\n\n/** Get default OTEL endpoint */\nexport function getDefaultOtelEndpoint(): string {\n return process.env.OTEL_EXPORTER_OTLP_ENDPOINT || DEFAULT_OTEL_ENDPOINT;\n}\n","/**\n * Context Manager - AsyncLocalStorage for request context propagation\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\n\nexport interface RequestContext {\n correlationId?: string;\n traceId?: string;\n spanId?: string;\n startTime?: number;\n [key: string]: unknown;\n}\n\nexport interface ContextManager {\n getContext(): RequestContext | undefined;\n run<T>(context: RequestContext, fn: () => T): T;\n get<K extends keyof RequestContext>(key: K): RequestContext[K] | undefined;\n update(updates: Partial<RequestContext>): RequestContext | undefined;\n}\n\n/** Create a new context manager instance */\nexport function createContextManager(): ContextManager {\n const als = new AsyncLocalStorage<RequestContext>();\n\n return {\n getContext: () => als.getStore(),\n\n run<T>(context: RequestContext, fn: () => T): T {\n return als.run(context, fn);\n },\n\n get<K extends keyof RequestContext>(key: K): RequestContext[K] | undefined {\n return als.getStore()?.[key];\n },\n\n update(updates: Partial<RequestContext>): RequestContext | undefined {\n const current = als.getStore();\n if (!current) return undefined;\n Object.assign(current, updates);\n return current;\n },\n };\n}\n","/**\n * Structured Logging with Pino\n */\n\nimport pino, { Logger as PinoLogger } from 'pino';\nimport { trace } from '@opentelemetry/api';\nimport { type ContextManager } from './context';\n\nexport interface LoggerOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n level: 'debug' | 'info' | 'warn' | 'error';\n prettyPrint: boolean;\n contextManager?: ContextManager;\n}\n\nexport interface Logger {\n debug: (obj: object, msg?: string) => void;\n info: (obj: object, msg?: string) => void;\n warn: (obj: object, msg?: string) => void;\n error: (obj: object, msg?: string) => void;\n child: (bindings: object) => Logger;\n readonly pino: PinoLogger;\n}\n\n/** Create a structured logger with automatic trace context injection */\nexport function createLogger(options: LoggerOptions): Logger {\n const { serviceName, serviceVersion, environment, level, prettyPrint, contextManager } = options;\n\n const pinoLogger = pino({\n level,\n base: { service: serviceName, version: serviceVersion, env: environment },\n mixin: () => {\n const span = trace.getActiveSpan();\n const spanContext = span?.spanContext();\n const ctx = contextManager?.getContext();\n\n const traceId = spanContext?.traceId || ctx?.traceId;\n const spanId = spanContext?.spanId || ctx?.spanId;\n const correlationId = ctx?.correlationId;\n\n // Industry-standard field names for correlation in most log backends (incl. Groundcover)\n return {\n trace_id: traceId,\n span_id: spanId,\n correlation_id: correlationId,\n };\n },\n formatters: { level: (label) => ({ level: label }) },\n transport: prettyPrint\n ? {\n target: 'pino-pretty',\n options: { colorize: true, translateTime: 'SYS:standard', ignore: 'pid,hostname' },\n }\n : undefined,\n });\n\n return wrapPinoLogger(pinoLogger);\n}\n\nfunction wrapPinoLogger(pinoLogger: PinoLogger): Logger {\n return {\n debug: (obj, msg) => pinoLogger.debug(obj, msg),\n info: (obj, msg) => pinoLogger.info(obj, msg),\n warn: (obj, msg) => pinoLogger.warn(obj, msg),\n error: (obj, msg) => pinoLogger.error(obj, msg),\n child: (bindings) => wrapPinoLogger(pinoLogger.child(bindings)),\n pino: pinoLogger,\n };\n}\n\n/** Fallback logger when Pino is not available */\nexport function createFallbackLogger(serviceName: string = 'unknown'): Logger {\n const log = (level: string, obj: object, msg?: string) => {\n const logObj = {\n timestamp: new Date().toISOString(),\n level,\n service: serviceName,\n ...obj,\n msg,\n };\n const payload = JSON.stringify(logObj);\n if (level === 'warn') console.warn(payload);\n else if (level === 'error') console.error(payload);\n else console.log(payload);\n };\n\n const fallback: Logger = {\n debug: (obj, msg) => log('debug', obj, msg),\n info: (obj, msg) => log('info', obj, msg),\n warn: (obj, msg) => log('warn', obj, msg),\n error: (obj, msg) => log('error', obj, msg),\n child: () => fallback,\n pino: null as unknown as PinoLogger,\n };\n\n return fallback;\n}\n\n// Global logger for standalone usage\nlet globalLogger: Logger | null = null;\n\nexport function setGlobalLogger(logger: Logger): void {\n globalLogger = logger;\n}\n\nexport function getGlobalLogger(): Logger {\n return globalLogger || createFallbackLogger();\n}\n","/**\n * OpenTelemetry Tracing Setup\n */\n\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { trace, context, propagation, SpanStatusCode, type Tracer } from '@opentelemetry/api';\nimport { type AutoInstrumentationConfig, getDefaultOtelEndpoint } from '../config';\n\nexport interface TracingOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n endpoint?: string;\n sampleRate?: number;\n autoInstrumentation?: AutoInstrumentationConfig;\n}\n\nlet sdk: NodeSDK | null = null;\nlet isInitialized = false;\n\n/** Initialize OpenTelemetry tracing */\nexport function setupTracing(options: TracingOptions): void {\n if (isInitialized) {\n console.warn('[neoiq-foundation] Tracing already initialized');\n return;\n }\n\n const {\n serviceName,\n serviceVersion,\n environment,\n endpoint = getDefaultOtelEndpoint(),\n autoInstrumentation = {},\n } = options;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: serviceVersion,\n 'deployment.environment': environment,\n });\n\n const traceExporter = new OTLPTraceExporter({ url: endpoint });\n const instrumentationConfig = buildInstrumentationConfig(autoInstrumentation);\n\n sdk = new NodeSDK({\n resource,\n traceExporter,\n instrumentations: [getNodeAutoInstrumentations(instrumentationConfig)],\n });\n\n sdk.start();\n isInitialized = true;\n}\n\nfunction buildInstrumentationConfig(\n config: AutoInstrumentationConfig\n): Record<string, { enabled: boolean }> {\n const mapping: Record<string, string> = {\n http: '@opentelemetry/instrumentation-http',\n fastify: '@opentelemetry/instrumentation-fastify',\n express: '@opentelemetry/instrumentation-express',\n mongodb: '@opentelemetry/instrumentation-mongodb',\n pg: '@opentelemetry/instrumentation-pg',\n mysql: '@opentelemetry/instrumentation-mysql',\n redis: '@opentelemetry/instrumentation-redis',\n ioredis: '@opentelemetry/instrumentation-ioredis',\n grpc: '@opentelemetry/instrumentation-grpc',\n fs: '@opentelemetry/instrumentation-fs',\n dns: '@opentelemetry/instrumentation-dns',\n };\n\n const result: Record<string, { enabled: boolean }> = {};\n for (const [key, instrumentationName] of Object.entries(mapping)) {\n const userSetting = config[key as keyof AutoInstrumentationConfig];\n const defaultValue = key !== 'fs' && key !== 'dns';\n result[instrumentationName] = { enabled: userSetting ?? defaultValue };\n }\n return result;\n}\n\n/** Shutdown tracing gracefully */\nexport async function shutdownTracing(): Promise<void> {\n if (!sdk) return;\n try {\n await sdk.shutdown();\n isInitialized = false;\n sdk = null;\n } catch (error) {\n console.error('[neoiq-foundation] Error shutting down tracing:', error);\n }\n}\n\nexport function getTracer(name: string): Tracer {\n return trace.getTracer(name);\n}\n\nexport function getActiveSpan() {\n return trace.getActiveSpan();\n}\n\nexport function getTraceContext(): { traceId?: string; spanId?: string } {\n const span = trace.getActiveSpan();\n if (!span) return {};\n const ctx = span.spanContext();\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n\nexport function isTracingEnabled(): boolean {\n return isInitialized;\n}\n\nexport { trace, context, propagation, SpanStatusCode };\nexport type { Tracer };\n","/**\n * OpenTelemetry Metrics Setup\n */\n\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc';\nimport { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { metrics, type Meter } from '@opentelemetry/api';\nimport { getDefaultOtelEndpoint } from '../config';\n\nexport interface MetricsOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n endpoint?: string;\n intervalMs?: number;\n}\n\nlet meterProvider: MeterProvider | null = null;\nlet isInitialized = false;\n\n/** Initialize OpenTelemetry metrics */\nexport function setupMetrics(options: MetricsOptions): void {\n if (isInitialized) {\n console.warn('[neoiq-foundation] Metrics already initialized');\n return;\n }\n\n const {\n serviceName,\n serviceVersion,\n environment,\n endpoint = getDefaultOtelEndpoint(),\n intervalMs = 5000,\n } = options;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: serviceVersion,\n 'deployment.environment': environment,\n });\n\n const metricExporter = new OTLPMetricExporter({ url: endpoint });\n const metricReader = new PeriodicExportingMetricReader({\n exporter: metricExporter,\n exportIntervalMillis: intervalMs,\n });\n\n meterProvider = new MeterProvider({ resource, readers: [metricReader] });\n metrics.setGlobalMeterProvider(meterProvider);\n isInitialized = true;\n}\n\n/** Shutdown metrics gracefully */\nexport async function shutdownMetrics(): Promise<void> {\n if (!meterProvider) return;\n try {\n await meterProvider.shutdown();\n isInitialized = false;\n meterProvider = null;\n } catch (error) {\n console.error('[neoiq-foundation] Error shutting down metrics:', error);\n }\n}\n\nexport function getMeter(name: string, version: string = '1.0.0'): Meter {\n return metrics.getMeter(name, version);\n}\n\nexport function isMetricsEnabled(): boolean {\n return isInitialized;\n}\n\nexport { metrics };\nexport type { Meter };\n","/**\n * Fastify Observability Plugin\n */\n\nimport { FastifyPluginAsync, FastifyRequest, FastifyReply } from 'fastify';\nimport fp from 'fastify-plugin';\nimport { randomUUID } from 'crypto';\nimport { trace, context, propagation, SpanStatusCode, Span } from '@opentelemetry/api';\nimport { type ContextManager } from '../features/context';\nimport { type Logger, getGlobalLogger } from '../features/logging';\nimport { getMeter } from '../features/metrics';\n\ninterface PluginRequestContext {\n correlationId: string;\n traceId: string;\n spanId: string;\n startTime: number;\n [key: string]: unknown;\n}\n\nexport interface RequestLoggingOptions {\n logHeaders?: boolean;\n logBody?: boolean;\n logResponseBody?: boolean;\n maxBodySize?: number;\n redactHeaders?: string[];\n}\n\nexport interface FastifyPluginOptions {\n serviceName: string;\n logger?: Logger;\n contextManager?: ContextManager;\n tracingEnabled?: boolean;\n metricsEnabled?: boolean;\n excludeRoutes?: string[];\n /** Request/response logging options */\n requestLogging?: RequestLoggingOptions;\n}\n\ndeclare module 'fastify' {\n interface FastifyRequest {\n __span?: Span;\n __requestContext?: PluginRequestContext;\n }\n}\n\n// Default headers to redact for security\nconst DEFAULT_REDACT_HEADERS = [\n 'authorization',\n 'cookie',\n 'x-api-key',\n 'x-auth-token',\n 'set-cookie',\n];\n\n/** Redact sensitive headers */\nfunction redactHeaders(\n headers: Record<string, unknown>,\n redactList: string[]\n): Record<string, unknown> {\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (redactList.includes(key.toLowerCase())) {\n redacted[key] = '[REDACTED]';\n } else {\n redacted[key] = value;\n }\n }\n return redacted;\n}\n\n/** Truncate body if too large */\nfunction truncateBody(body: unknown, maxSize: number): unknown {\n if (body === undefined || body === null) return undefined;\n const str = typeof body === 'string' ? body : JSON.stringify(body);\n if (str.length > maxSize) {\n return `[TRUNCATED - ${str.length} bytes]`;\n }\n return body;\n}\n\n/** Create a configured Fastify observability plugin */\nexport function createObservabilityPlugin(options: FastifyPluginOptions) {\n const plugin: FastifyPluginAsync<Partial<FastifyPluginOptions>> = async (fastify, pluginOpts) => {\n const {\n serviceName,\n logger = getGlobalLogger(),\n contextManager,\n tracingEnabled = true,\n metricsEnabled = true,\n excludeRoutes = ['/health', '/health/', '/healthz', '/ready', '/live'],\n requestLogging = {},\n } = { ...options, ...pluginOpts };\n\n // Request logging config\n const logHeaders = requestLogging.logHeaders ?? true;\n const logBody = requestLogging.logBody ?? false;\n const logResponseBody = requestLogging.logResponseBody ?? false;\n const maxBodySize = requestLogging.maxBodySize ?? 10 * 1024; // 10KB\n const headersToRedact = requestLogging.redactHeaders ?? DEFAULT_REDACT_HEADERS;\n\n const runInContext = contextManager\n ? <T>(ctx: PluginRequestContext, fn: () => T) => contextManager.run(ctx, fn)\n : <T>(_ctx: PluginRequestContext, fn: () => T) => fn();\n\n const tracer = tracingEnabled ? trace.getTracer('neoiq-foundation-node') : null;\n\n let requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']>;\n let requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']>;\n let requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']>;\n\n if (metricsEnabled) {\n const meter = getMeter(serviceName);\n requestCounter = meter.createCounter('http.server.requests.total');\n requestDuration = meter.createHistogram('http.server.request.duration', { unit: 'ms' });\n requestErrors = meter.createCounter('http.server.requests.errors');\n }\n\n // onRequest - Extract context, start span, log headers\n fastify.addHook('onRequest', (request: FastifyRequest, reply: FastifyReply, done) => {\n if (excludeRoutes.some((route) => request.url.startsWith(route))) {\n done();\n return;\n }\n\n const correlationId = (request.headers['x-request-id'] as string) || randomUUID();\n reply.header('x-request-id', correlationId);\n\n let span: Span | undefined;\n let traceId = '';\n let spanId = '';\n\n if (tracer) {\n const parentContext = propagation.extract(context.active(), request.headers);\n span = tracer.startSpan(\n `${request.method} ${request.routeOptions?.url || request.url}`,\n {\n kind: 1,\n attributes: {\n 'http.method': request.method,\n 'http.url': request.url,\n 'http.route': request.routeOptions?.url || request.url,\n 'http.user_agent': request.headers['user-agent'] || '',\n 'http.correlation_id': correlationId,\n },\n },\n parentContext\n );\n const spanContext = span.spanContext();\n traceId = spanContext.traceId;\n spanId = spanContext.spanId;\n }\n\n const requestContext: PluginRequestContext = {\n correlationId,\n traceId,\n spanId,\n startTime: Date.now(),\n };\n request.__span = span;\n request.__requestContext = requestContext;\n\n runInContext(requestContext, () => {\n const logData: Record<string, unknown> = {\n correlation_id: correlationId,\n trace_id: traceId || undefined,\n span_id: spanId || undefined,\n method: request.method,\n url: request.url,\n ip: request.ip,\n userAgent: request.headers['user-agent'],\n };\n\n // Log headers (redacted)\n if (logHeaders) {\n logData.headers = redactHeaders(\n request.headers as Record<string, unknown>,\n headersToRedact\n );\n }\n\n logger.info(logData, 'Request received');\n done();\n });\n });\n\n // preHandler - Log request body (if enabled)\n if (logBody) {\n fastify.addHook('preHandler', (request: FastifyRequest, _reply: FastifyReply, done) => {\n const ctx = request.__requestContext;\n if (!ctx || !request.body) {\n done();\n return;\n }\n\n runInContext(ctx, () => {\n logger.debug(\n {\n correlation_id: ctx.correlationId,\n body: truncateBody(request.body, maxBodySize),\n },\n 'Request body'\n );\n done();\n });\n });\n }\n\n // onSend - Log response body (if enabled)\n if (logResponseBody) {\n fastify.addHook('onSend', (request: FastifyRequest, reply: FastifyReply, payload, done) => {\n const ctx = request.__requestContext;\n if (!ctx) {\n done(null, payload);\n return;\n }\n\n runInContext(ctx, () => {\n logger.debug(\n {\n correlation_id: ctx.correlationId,\n statusCode: reply.statusCode,\n body: truncateBody(payload, maxBodySize),\n },\n 'Response body'\n );\n done(null, payload);\n });\n });\n }\n\n // onResponse - End span, record metrics\n fastify.addHook('onResponse', (request: FastifyRequest, reply: FastifyReply, done) => {\n const ctx = request.__requestContext;\n const span = request.__span;\n if (!ctx) {\n done();\n return;\n }\n\n const durationMs = Date.now() - ctx.startTime;\n const route = request.routeOptions?.url || request.url;\n const labels = { method: request.method, route, status_code: String(reply.statusCode) };\n\n runInContext(ctx, () => {\n logger.info(\n {\n correlation_id: ctx.correlationId,\n method: request.method,\n statusCode: reply.statusCode,\n durationMs,\n },\n 'Request completed'\n );\n\n if (metricsEnabled) {\n requestCounter.add(1, labels);\n requestDuration.record(durationMs, labels);\n if (reply.statusCode >= 400) requestErrors.add(1, labels);\n }\n\n if (span) {\n span.setStatus({\n code: reply.statusCode < 400 ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n });\n span.setAttribute('http.status_code', reply.statusCode);\n span.setAttribute('http.response_time_ms', durationMs);\n span.end();\n }\n\n done();\n });\n });\n\n // onError - Record exception on span\n fastify.addHook(\n 'onError',\n (request: FastifyRequest, _reply: FastifyReply, error: Error, done) => {\n const ctx = request.__requestContext;\n const span = request.__span;\n if (!ctx) {\n done();\n return;\n }\n\n runInContext(ctx, () => {\n logger.error(\n {\n correlation_id: ctx.correlationId,\n method: request.method,\n url: request.url,\n error: error.message,\n },\n 'Request failed'\n );\n\n if (span) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n }\n\n done();\n });\n }\n );\n };\n\n return fp(plugin, { name: 'neoiq-observability', fastify: '>=4.x' });\n}\n","/**\n * HTTP Client with Observability\n */\n\nimport axios from 'axios';\nimport type {\n AxiosInstance,\n AxiosRequestConfig,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\nimport axiosRetry, { IAxiosRetryConfig } from 'axios-retry';\nimport CircuitBreaker from 'opossum';\nimport { context, propagation } from '@opentelemetry/api';\nimport type { FoundationInstance } from '../foundation';\nimport { getGlobalLogger, type Logger } from '../features/logging';\nimport { getMeter } from '../features/metrics';\n\nexport interface HttpClientOptions {\n baseURL: string;\n serviceName: string;\n timeout?: number;\n retry?: {\n retries?: number;\n retryDelay?: number;\n retryStatusCodes?: number[];\n };\n circuitBreaker?: {\n enabled?: boolean;\n resetTimeout?: number;\n errorThresholdPercentage?: number;\n };\n headers?: Record<string, string>;\n foundation?: FoundationInstance;\n}\n\nexport type HttpClient = AxiosInstance;\n\n/** Create a configured HTTP client with full observability */\nexport function createHttpClient(options: HttpClientOptions): HttpClient {\n const {\n baseURL,\n serviceName,\n timeout = 30000,\n retry = {},\n circuitBreaker: cbOptions = {},\n headers = {},\n foundation,\n } = options;\n\n const logger: Logger = foundation?.logger || getGlobalLogger();\n const getContext = () => foundation?.context.getContext();\n const metricsEnabled = foundation?.features.metrics ?? true;\n const tracingEnabled = foundation?.features.tracing ?? true;\n\n const client = axios.create({\n baseURL,\n timeout,\n headers: { 'Content-Type': 'application/json', ...headers },\n });\n\n // Metrics\n let requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null = null;\n let requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']> | null = null;\n let requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null = null;\n\n if (metricsEnabled) {\n const meter = getMeter(`http-client-${serviceName}`);\n requestCounter = meter.createCounter('http.client.requests.total');\n requestDuration = meter.createHistogram('http.client.request.duration', { unit: 'ms' });\n requestErrors = meter.createCounter('http.client.requests.errors');\n }\n\n // Request interceptor - Add trace context\n client.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n if (tracingEnabled) {\n const carrier: Record<string, string> = {};\n propagation.inject(context.active(), carrier);\n if (carrier.traceparent) config.headers.set('traceparent', carrier.traceparent);\n if (carrier.tracestate) config.headers.set('tracestate', carrier.tracestate);\n }\n\n const reqCtx = getContext();\n if (reqCtx?.correlationId) config.headers.set('x-request-id', reqCtx.correlationId);\n\n (config as InternalAxiosRequestConfig & { __startTime: number }).__startTime = Date.now();\n\n logger.debug(\n {\n method: config.method?.toUpperCase(),\n url: `${config.baseURL || ''}${config.url}`,\n targetService: serviceName,\n },\n 'Outbound HTTP request'\n );\n\n return config;\n });\n\n // Response interceptor - Log and record metrics\n client.interceptors.response.use(\n (response: AxiosResponse) => {\n const config = response.config as InternalAxiosRequestConfig & { __startTime?: number };\n const durationMs = Date.now() - (config.__startTime || Date.now());\n const labels = {\n target_service: serviceName,\n method: config.method?.toUpperCase() || 'GET',\n status_code: String(response.status),\n };\n\n logger.debug(\n {\n method: config.method?.toUpperCase(),\n statusCode: response.status,\n durationMs,\n targetService: serviceName,\n },\n 'Outbound HTTP response'\n );\n\n if (metricsEnabled) {\n requestCounter?.add(1, labels);\n requestDuration?.record(durationMs, labels);\n }\n\n return response;\n },\n (error) => {\n const config = error.config as\n | (InternalAxiosRequestConfig & { __startTime?: number })\n | undefined;\n const durationMs = config ? Date.now() - (config.__startTime || Date.now()) : 0;\n const statusCode = error.response?.status || 0;\n const labels = {\n target_service: serviceName,\n method: config?.method?.toUpperCase() || 'GET',\n status_code: String(statusCode),\n };\n\n logger.error(\n {\n method: config?.method?.toUpperCase(),\n statusCode,\n durationMs,\n error: error.message,\n targetService: serviceName,\n },\n 'Outbound HTTP error'\n );\n\n if (metricsEnabled) {\n requestCounter?.add(1, labels);\n requestDuration?.record(durationMs, labels);\n requestErrors?.add(1, labels);\n }\n\n return Promise.reject(error);\n }\n );\n\n // Retry config\n const retryConfig: IAxiosRetryConfig = {\n retries: retry.retries ?? 3,\n retryDelay: (retryCount) => (retry.retryDelay ?? 1000) * Math.pow(2, retryCount - 1),\n retryCondition: (error) => {\n const retryStatusCodes = retry.retryStatusCodes ?? [408, 429, 500, 502, 503, 504];\n return !error.response || retryStatusCodes.includes(error.response?.status || 0);\n },\n onRetry: (retryCount, error, requestConfig) => {\n logger.warn(\n {\n retryCount,\n url: `${requestConfig.baseURL || ''}${requestConfig.url}`,\n error: error.message,\n },\n 'Retrying request'\n );\n },\n };\n axiosRetry(client, retryConfig);\n\n // Circuit breaker\n if (cbOptions.enabled !== false) {\n const breaker = new CircuitBreaker(\n async (config: AxiosRequestConfig) => client.request(config),\n {\n timeout,\n resetTimeout: cbOptions.resetTimeout ?? 30000,\n errorThresholdPercentage: cbOptions.errorThresholdPercentage ?? 50,\n volumeThreshold: 10,\n }\n );\n breaker.on('open', () => logger.warn({ targetService: serviceName }, 'Circuit breaker OPEN'));\n breaker.on('halfOpen', () =>\n logger.info({ targetService: serviceName }, 'Circuit breaker HALF-OPEN')\n );\n breaker.on('close', () =>\n logger.info({ targetService: serviceName }, 'Circuit breaker CLOSED')\n );\n }\n\n return client;\n}\n\nexport type { AxiosInstance, AxiosRequestConfig, AxiosResponse };\n","/**\n * Foundation - Main Entry Point\n */\n\nimport {\n parseConfig,\n type FoundationConfig,\n type FoundationConfigInput,\n} from './config';\nimport {\n createContextManager,\n type ContextManager,\n type RequestContext,\n} from './features/context';\nimport { createLogger, setGlobalLogger, type Logger } from './features/logging';\nimport {\n setupTracing,\n shutdownTracing,\n getTracer,\n getActiveSpan,\n getTraceContext,\n isTracingEnabled,\n SpanStatusCode,\n type Tracer,\n} from './features/tracing';\nimport {\n setupMetrics,\n shutdownMetrics,\n getMeter,\n isMetricsEnabled,\n type Meter,\n} from './features/metrics';\nimport {\n createObservabilityPlugin,\n type FastifyPluginOptions,\n} from './integrations/fastify-plugin';\nimport {\n createHttpClient as createHttpClientInternal,\n type HttpClientOptions,\n type HttpClient,\n} from './integrations/http-client';\n\n// Health status types\nexport interface HealthStatus {\n status: 'healthy' | 'degraded' | 'unhealthy';\n timestamp: string;\n service: string;\n version: string;\n uptime: number;\n components: {\n tracing: ComponentHealth;\n metrics: ComponentHealth;\n logging: ComponentHealth;\n };\n}\n\nexport interface ComponentHealth {\n enabled: boolean;\n status: 'up' | 'down' | 'disabled';\n message?: string;\n}\n\n// Foundation instance interface\nexport interface FoundationInstance {\n readonly config: FoundationConfig;\n readonly logger: Logger;\n readonly context: ContextManager;\n readonly tracer: Tracer | null;\n readonly meter: Meter | null;\n readonly fastifyPlugin: ReturnType<typeof createObservabilityPlugin>;\n readonly features: { tracing: boolean; metrics: boolean; logging: boolean };\n\n getTracer: (name?: string) => Tracer;\n getMeter: (name: string, version?: string) => Meter;\n getTraceContext: () => { traceId?: string; spanId?: string };\n getActiveSpan: () => ReturnType<typeof getActiveSpan>;\n createHttpClient: (options: Omit<HttpClientOptions, 'foundation'>) => HttpClient;\n shutdown: () => Promise<void>;\n isReady: () => boolean;\n\n // Health check\n health: () => HealthStatus;\n\n // Error boundaries\n trace: <T>(name: string, fn: () => T | Promise<T>) => Promise<T>;\n safeRun: <T>(fn: () => T | Promise<T>, fallback?: T) => Promise<T | undefined>;\n}\n\n/** Create a fully configured observability foundation */\nexport function createFoundation(input: FoundationConfigInput): FoundationInstance {\n const startTime = Date.now();\n const config = parseConfig(input);\n const {\n serviceName,\n serviceVersion,\n environment,\n features: featuresConfig,\n otel,\n logging: loggingConfig,\n requestLogging: requestLoggingConfig,\n } = config;\n\n const features = {\n tracing: featuresConfig.tracing ?? true,\n metrics: featuresConfig.metrics ?? true,\n logging: featuresConfig.logging ?? true,\n };\n\n // Context manager\n const contextManager = createContextManager();\n\n // Logger (always created - has fallback)\n let logger: Logger;\n let loggingError: string | undefined;\n try {\n logger = createLogger({\n serviceName,\n serviceVersion,\n environment,\n level: loggingConfig.level ?? 'info',\n prettyPrint: loggingConfig.prettyPrint ?? environment === 'development',\n contextManager,\n });\n setGlobalLogger(logger);\n } catch (err) {\n loggingError = (err as Error).message;\n // Fallback to console\n logger = {\n debug: (obj, msg) => console.debug(JSON.stringify({ ...obj, msg })),\n info: (obj, msg) => console.info(JSON.stringify({ ...obj, msg })),\n warn: (obj, msg) => console.warn(JSON.stringify({ ...obj, msg })),\n error: (obj, msg) => console.error(JSON.stringify({ ...obj, msg })),\n child: () => logger,\n pino: null as never,\n };\n console.error('[neoiq-foundation] Logger setup failed, using console:', loggingError);\n }\n\n // Tracing (with error boundary)\n let tracerInstance: Tracer | null = null;\n let tracingError: string | undefined;\n if (features.tracing) {\n try {\n setupTracing({\n serviceName,\n serviceVersion,\n environment,\n endpoint: otel.endpoint,\n sampleRate: otel.traceSampleRate,\n autoInstrumentation: featuresConfig.autoInstrumentation,\n });\n tracerInstance = getTracer(serviceName);\n logger.info({ feature: 'tracing', endpoint: otel.endpoint }, 'Tracing enabled');\n } catch (err) {\n tracingError = (err as Error).message;\n logger.error({ error: tracingError }, 'Tracing setup failed - continuing without tracing');\n }\n }\n\n // Metrics (with error boundary)\n let meterInstance: Meter | null = null;\n let metricsError: string | undefined;\n if (features.metrics) {\n try {\n setupMetrics({\n serviceName,\n serviceVersion,\n environment,\n endpoint: otel.endpoint,\n intervalMs: otel.metricsIntervalMs,\n });\n meterInstance = getMeter(serviceName);\n logger.info({ feature: 'metrics', interval: `${otel.metricsIntervalMs}ms` }, 'Metrics enabled');\n } catch (err) {\n metricsError = (err as Error).message;\n logger.error({ error: metricsError }, 'Metrics setup failed - continuing without metrics');\n }\n }\n\n logger.info({ serviceName, serviceVersion, environment, features }, 'Foundation initialized');\n\n const foundation: FoundationInstance = {\n config,\n logger,\n context: contextManager,\n tracer: tracerInstance,\n meter: meterInstance,\n features,\n\n getTracer: (name?: string) => getTracer(name || serviceName),\n getMeter: (name: string, version?: string) => getMeter(name, version),\n getTraceContext,\n getActiveSpan,\n\n fastifyPlugin: createObservabilityPlugin({\n serviceName,\n logger,\n contextManager,\n tracingEnabled: features.tracing && !tracingError,\n metricsEnabled: features.metrics && !metricsError,\n requestLogging: requestLoggingConfig,\n }),\n\n createHttpClient: (options) => createHttpClientInternal({ ...options, foundation }),\n\n shutdown: async () => {\n logger.info({}, 'Shutting down foundation...');\n const promises: Promise<void>[] = [];\n if (features.tracing && isTracingEnabled()) promises.push(shutdownTracing());\n if (features.metrics && isMetricsEnabled()) promises.push(shutdownMetrics());\n await Promise.all(promises);\n logger.info({}, 'Foundation shutdown complete');\n },\n\n isReady: () => {\n if (features.tracing && !tracingError && !isTracingEnabled()) return false;\n if (features.metrics && !metricsError && !isMetricsEnabled()) return false;\n return true;\n },\n\n // Health check\n health: (): HealthStatus => {\n const tracingUp = !features.tracing || (!tracingError && isTracingEnabled());\n const metricsUp = !features.metrics || (!metricsError && isMetricsEnabled());\n const loggingUp = !loggingError;\n\n const allUp = tracingUp && metricsUp && loggingUp;\n const anyDown =\n (features.tracing && tracingError) ||\n (features.metrics && metricsError) ||\n loggingError;\n\n return {\n status: allUp ? 'healthy' : anyDown ? 'degraded' : 'unhealthy',\n timestamp: new Date().toISOString(),\n service: serviceName,\n version: serviceVersion,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n components: {\n tracing: {\n enabled: features.tracing,\n status: !features.tracing ? 'disabled' : tracingError ? 'down' : 'up',\n message: tracingError,\n },\n metrics: {\n enabled: features.metrics,\n status: !features.metrics ? 'disabled' : metricsError ? 'down' : 'up',\n message: metricsError,\n },\n logging: {\n enabled: features.logging,\n status: loggingError ? 'down' : 'up',\n message: loggingError,\n },\n },\n };\n },\n\n // Trace: Run code within a span (Datadog-style)\n trace: async <T>(name: string, fn: () => T | Promise<T>): Promise<T> => {\n const tracer = tracerInstance || getTracer(serviceName);\n\n return new Promise((resolve, reject) => {\n tracer.startActiveSpan(name, async (span) => {\n try {\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n resolve(result);\n } catch (err) {\n const error = err as Error;\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n logger.error({ span: name, error: error.message }, 'Span failed');\n reject(error);\n }\n });\n });\n },\n\n // Safe run: Execute with try-catch, return fallback on error\n safeRun: async <T>(fn: () => T | Promise<T>, fallback?: T): Promise<T | undefined> => {\n try {\n return await fn();\n } catch (err) {\n const error = err as Error;\n logger.error({ error: error.message, stack: error.stack }, 'safeRun caught error');\n return fallback;\n }\n },\n };\n\n return foundation;\n}\n\n/** Alias for createFoundation */\nexport const setupObservability = createFoundation;\n\nexport { SpanStatusCode };\nexport type { FoundationConfig, FoundationConfigInput };\nexport type { Logger };\nexport type { ContextManager, RequestContext };\nexport type { Tracer, Meter };\nexport type { FastifyPluginOptions };\nexport type { HttpClientOptions, HttpClient };\n"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -123,10 +123,13 @@ function createLogger(options) {
123
123
  const span = trace$1.getActiveSpan();
124
124
  const spanContext = span?.spanContext();
125
125
  const ctx = contextManager?.getContext();
126
+ const traceId = spanContext?.traceId || ctx?.traceId;
127
+ const spanId = spanContext?.spanId || ctx?.spanId;
128
+ const correlationId = ctx?.correlationId;
126
129
  return {
127
- traceId: spanContext?.traceId || ctx?.traceId,
128
- spanId: spanContext?.spanId || ctx?.spanId,
129
- correlationId: ctx?.correlationId
130
+ trace_id: traceId,
131
+ span_id: spanId,
132
+ correlation_id: correlationId
130
133
  };
131
134
  },
132
135
  formatters: { level: (label) => ({ level: label }) },
@@ -161,7 +164,10 @@ function createFallbackLogger(serviceName = "unknown") {
161
164
  ...obj,
162
165
  msg
163
166
  };
164
- console[level === "debug" ? "log" : level](JSON.stringify(logObj));
167
+ const payload = JSON.stringify(logObj);
168
+ if (level === "warn") console.warn(payload);
169
+ else if (level === "error") console.error(payload);
170
+ else console.log(payload);
165
171
  };
166
172
  const fallback = {
167
173
  debug: (obj, msg) => log("debug", obj, msg),
@@ -393,8 +399,9 @@ function createObservabilityPlugin(options) {
393
399
  request.__requestContext = requestContext;
394
400
  runInContext(requestContext, () => {
395
401
  const logData = {
396
- correlationId,
397
- traceId: traceId || void 0,
402
+ correlation_id: correlationId,
403
+ trace_id: traceId || void 0,
404
+ span_id: spanId || void 0,
398
405
  method: request.method,
399
406
  url: request.url,
400
407
  ip: request.ip,
@@ -413,7 +420,7 @@ function createObservabilityPlugin(options) {
413
420
  }
414
421
  runInContext(ctx, () => {
415
422
  logger.debug({
416
- correlationId: ctx.correlationId,
423
+ correlation_id: ctx.correlationId,
417
424
  body: truncateBody(request.body, maxBodySize)
418
425
  }, "Request body");
419
426
  done();
@@ -427,7 +434,7 @@ function createObservabilityPlugin(options) {
427
434
  }
428
435
  runInContext(ctx, () => {
429
436
  logger.debug({
430
- correlationId: ctx.correlationId,
437
+ correlation_id: ctx.correlationId,
431
438
  statusCode: reply.statusCode,
432
439
  body: truncateBody(payload, maxBodySize)
433
440
  }, "Response body");
@@ -450,7 +457,7 @@ function createObservabilityPlugin(options) {
450
457
  };
451
458
  runInContext(ctx, () => {
452
459
  logger.info({
453
- correlationId: ctx.correlationId,
460
+ correlation_id: ctx.correlationId,
454
461
  method: request.method,
455
462
  statusCode: reply.statusCode,
456
463
  durationMs
@@ -478,7 +485,7 @@ function createObservabilityPlugin(options) {
478
485
  }
479
486
  runInContext(ctx, () => {
480
487
  logger.error({
481
- correlationId: ctx.correlationId,
488
+ correlation_id: ctx.correlationId,
482
489
  method: request.method,
483
490
  url: request.url,
484
491
  error: error.message
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["input: FoundationConfigInput","context: RequestContext","fn: () => T","key: K","updates: Partial<RequestContext>","options: LoggerOptions","pinoLogger: PinoLogger","serviceName: string","level: string","obj: object","msg?: string","fallback: Logger","globalLogger: Logger | null","logger: Logger","sdk: NodeSDK | null","options: TracingOptions","config: AutoInstrumentationConfig","mapping: Record<string, string>","result: Record<string, { enabled: boolean }>","name: string","meterProvider: MeterProvider | null","options: MetricsOptions","name: string","version: string","headers: Record<string, unknown>","redactList: string[]","redacted: Record<string, unknown>","body: unknown","maxSize: number","options: FastifyPluginOptions","plugin: FastifyPluginAsync<Partial<FastifyPluginOptions>>","ctx: PluginRequestContext","fn: () => T","_ctx: PluginRequestContext","requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']>","requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']>","requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']>","request: FastifyRequest","reply: FastifyReply","span: Span | undefined","requestContext: PluginRequestContext","logData: Record<string, unknown>","_reply: FastifyReply","error: Error","options: HttpClientOptions","logger: Logger","requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null","requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']> | null","requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null","config: InternalAxiosRequestConfig","carrier: Record<string, string>","response: AxiosResponse","retryConfig: IAxiosRetryConfig","config: AxiosRequestConfig","input: FoundationConfigInput","logger: Logger","loggingError: string | undefined","tracerInstance: Tracer | null","tracingError: string | undefined","meterInstance: Meter | null","metricsError: string | undefined","foundation: FoundationInstance","name?: string","name: string","version?: string","promises: Promise<void>[]","fn: () => T | Promise<T>","fallback?: T"],"sources":["../src/config.ts","../src/features/context.ts","../src/features/logging.ts","../src/features/tracing.ts","../src/features/metrics.ts","../src/integrations/fastify-plugin.ts","../src/integrations/http-client.ts","../src/foundation.ts"],"sourcesContent":["/**\n * Foundation Configuration with Zod Validation\n */\n\nimport { z } from 'zod';\n\n// Auto-Instrumentation Config\nexport const AutoInstrumentationConfigSchema = z\n .object({\n http: z.boolean().default(true),\n fastify: z.boolean().default(true),\n express: z.boolean().default(true),\n mongodb: z.boolean().default(true),\n pg: z.boolean().default(true),\n mysql: z.boolean().default(true),\n redis: z.boolean().default(true),\n ioredis: z.boolean().default(true),\n grpc: z.boolean().default(true),\n fs: z.boolean().default(false),\n dns: z.boolean().default(false),\n })\n .partial();\n\nexport type AutoInstrumentationConfig = z.infer<typeof AutoInstrumentationConfigSchema>;\n\n// Features Config\nexport const FeaturesConfigSchema = z\n .object({\n tracing: z.boolean().default(true),\n metrics: z.boolean().default(true),\n logging: z.boolean().default(true),\n autoInstrumentation: AutoInstrumentationConfigSchema.default({}),\n })\n .partial();\n\nexport type FeaturesConfig = z.infer<typeof FeaturesConfigSchema>;\n\n// OTEL Config\nconst DEFAULT_OTEL_ENDPOINT =\n 'http://otel-stack-deployment-collector.observability.svc.cluster.local:4317';\n\nexport const OtelConfigSchema = z\n .object({\n endpoint: z.string().default(DEFAULT_OTEL_ENDPOINT),\n metricsIntervalMs: z.number().min(1000).default(5000),\n traceSampleRate: z.number().min(0).max(1).default(1.0),\n })\n .partial();\n\nexport type OtelConfig = z.infer<typeof OtelConfigSchema>;\n\n// Logging Config\nexport const LoggingConfigSchema = z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n prettyPrint: z.boolean().optional(),\n })\n .partial();\n\nexport type LoggingConfig = z.infer<typeof LoggingConfigSchema>;\n\n// Request Logging Config\nexport const RequestLoggingConfigSchema = z\n .object({\n logHeaders: z.boolean().default(true),\n logBody: z.boolean().default(false),\n logResponseBody: z.boolean().default(false),\n maxBodySize: z.number().default(10 * 1024),\n redactHeaders: z.array(z.string()).optional(),\n })\n .partial();\n\nexport type RequestLoggingConfig = z.infer<typeof RequestLoggingConfigSchema>;\n\n// Main Foundation Config\nexport const FoundationConfigSchema = z.object({\n serviceName: z.string().min(1, 'serviceName is required'),\n serviceVersion: z.string().default(process.env.SERVICE_VERSION || '1.0.0'),\n environment: z\n .enum(['development', 'staging', 'qa', 'production'])\n .default((process.env.NODE_ENV as 'development' | 'production') || 'development'),\n features: FeaturesConfigSchema.default({}),\n otel: OtelConfigSchema.default({}),\n logging: LoggingConfigSchema.default({}),\n requestLogging: RequestLoggingConfigSchema.default({}),\n});\n\nexport type FoundationConfig = z.infer<typeof FoundationConfigSchema>;\n\nexport type FoundationConfigInput = Partial<FoundationConfig> & {\n serviceName: string;\n};\n\n/** Parse and validate configuration */\nexport function parseConfig(input: FoundationConfigInput): FoundationConfig {\n const result = FoundationConfigSchema.safeParse(input);\n\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join('.')}: ${e.message}`)\n .join('\\n');\n throw new Error(`Invalid foundation configuration:\\n${errors}`);\n }\n\n return result.data;\n}\n\n/** Get default OTEL endpoint */\nexport function getDefaultOtelEndpoint(): string {\n return process.env.OTEL_EXPORTER_OTLP_ENDPOINT || DEFAULT_OTEL_ENDPOINT;\n}\n","/**\n * Context Manager - AsyncLocalStorage for request context propagation\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\n\nexport interface RequestContext {\n correlationId?: string;\n traceId?: string;\n spanId?: string;\n startTime?: number;\n [key: string]: unknown;\n}\n\nexport interface ContextManager {\n getContext(): RequestContext | undefined;\n run<T>(context: RequestContext, fn: () => T): T;\n get<K extends keyof RequestContext>(key: K): RequestContext[K] | undefined;\n update(updates: Partial<RequestContext>): RequestContext | undefined;\n}\n\n/** Create a new context manager instance */\nexport function createContextManager(): ContextManager {\n const als = new AsyncLocalStorage<RequestContext>();\n\n return {\n getContext: () => als.getStore(),\n\n run<T>(context: RequestContext, fn: () => T): T {\n return als.run(context, fn);\n },\n\n get<K extends keyof RequestContext>(key: K): RequestContext[K] | undefined {\n return als.getStore()?.[key];\n },\n\n update(updates: Partial<RequestContext>): RequestContext | undefined {\n const current = als.getStore();\n if (!current) return undefined;\n Object.assign(current, updates);\n return current;\n },\n };\n}\n","/**\n * Structured Logging with Pino\n */\n\nimport pino, { Logger as PinoLogger } from 'pino';\nimport { trace } from '@opentelemetry/api';\nimport { type ContextManager } from './context';\n\nexport interface LoggerOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n level: 'debug' | 'info' | 'warn' | 'error';\n prettyPrint: boolean;\n contextManager?: ContextManager;\n}\n\nexport interface Logger {\n debug: (obj: object, msg?: string) => void;\n info: (obj: object, msg?: string) => void;\n warn: (obj: object, msg?: string) => void;\n error: (obj: object, msg?: string) => void;\n child: (bindings: object) => Logger;\n readonly pino: PinoLogger;\n}\n\n/** Create a structured logger with automatic trace context injection */\nexport function createLogger(options: LoggerOptions): Logger {\n const { serviceName, serviceVersion, environment, level, prettyPrint, contextManager } = options;\n\n const pinoLogger = pino({\n level,\n base: { service: serviceName, version: serviceVersion, env: environment },\n mixin: () => {\n const span = trace.getActiveSpan();\n const spanContext = span?.spanContext();\n const ctx = contextManager?.getContext();\n\n return {\n traceId: spanContext?.traceId || ctx?.traceId,\n spanId: spanContext?.spanId || ctx?.spanId,\n correlationId: ctx?.correlationId,\n };\n },\n formatters: { level: (label) => ({ level: label }) },\n transport: prettyPrint\n ? {\n target: 'pino-pretty',\n options: { colorize: true, translateTime: 'SYS:standard', ignore: 'pid,hostname' },\n }\n : undefined,\n });\n\n return wrapPinoLogger(pinoLogger);\n}\n\nfunction wrapPinoLogger(pinoLogger: PinoLogger): Logger {\n return {\n debug: (obj, msg) => pinoLogger.debug(obj, msg),\n info: (obj, msg) => pinoLogger.info(obj, msg),\n warn: (obj, msg) => pinoLogger.warn(obj, msg),\n error: (obj, msg) => pinoLogger.error(obj, msg),\n child: (bindings) => wrapPinoLogger(pinoLogger.child(bindings)),\n pino: pinoLogger,\n };\n}\n\n/** Fallback logger when Pino is not available */\nexport function createFallbackLogger(serviceName: string = 'unknown'): Logger {\n const log = (level: string, obj: object, msg?: string) => {\n const logObj = {\n timestamp: new Date().toISOString(),\n level,\n service: serviceName,\n ...obj,\n msg,\n };\n console[level === 'debug' ? 'log' : (level as 'info' | 'warn' | 'error')](\n JSON.stringify(logObj)\n );\n };\n\n const fallback: Logger = {\n debug: (obj, msg) => log('debug', obj, msg),\n info: (obj, msg) => log('info', obj, msg),\n warn: (obj, msg) => log('warn', obj, msg),\n error: (obj, msg) => log('error', obj, msg),\n child: () => fallback,\n pino: null as unknown as PinoLogger,\n };\n\n return fallback;\n}\n\n// Global logger for standalone usage\nlet globalLogger: Logger | null = null;\n\nexport function setGlobalLogger(logger: Logger): void {\n globalLogger = logger;\n}\n\nexport function getGlobalLogger(): Logger {\n return globalLogger || createFallbackLogger();\n}\n","/**\n * OpenTelemetry Tracing Setup\n */\n\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { trace, context, propagation, SpanStatusCode, type Tracer } from '@opentelemetry/api';\nimport { type AutoInstrumentationConfig, getDefaultOtelEndpoint } from '../config';\n\nexport interface TracingOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n endpoint?: string;\n sampleRate?: number;\n autoInstrumentation?: AutoInstrumentationConfig;\n}\n\nlet sdk: NodeSDK | null = null;\nlet isInitialized = false;\n\n/** Initialize OpenTelemetry tracing */\nexport function setupTracing(options: TracingOptions): void {\n if (isInitialized) {\n console.warn('[neoiq-foundation] Tracing already initialized');\n return;\n }\n\n const {\n serviceName,\n serviceVersion,\n environment,\n endpoint = getDefaultOtelEndpoint(),\n autoInstrumentation = {},\n } = options;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: serviceVersion,\n 'deployment.environment': environment,\n });\n\n const traceExporter = new OTLPTraceExporter({ url: endpoint });\n const instrumentationConfig = buildInstrumentationConfig(autoInstrumentation);\n\n sdk = new NodeSDK({\n resource,\n traceExporter,\n instrumentations: [getNodeAutoInstrumentations(instrumentationConfig)],\n });\n\n sdk.start();\n isInitialized = true;\n}\n\nfunction buildInstrumentationConfig(\n config: AutoInstrumentationConfig\n): Record<string, { enabled: boolean }> {\n const mapping: Record<string, string> = {\n http: '@opentelemetry/instrumentation-http',\n fastify: '@opentelemetry/instrumentation-fastify',\n express: '@opentelemetry/instrumentation-express',\n mongodb: '@opentelemetry/instrumentation-mongodb',\n pg: '@opentelemetry/instrumentation-pg',\n mysql: '@opentelemetry/instrumentation-mysql',\n redis: '@opentelemetry/instrumentation-redis',\n ioredis: '@opentelemetry/instrumentation-ioredis',\n grpc: '@opentelemetry/instrumentation-grpc',\n fs: '@opentelemetry/instrumentation-fs',\n dns: '@opentelemetry/instrumentation-dns',\n };\n\n const result: Record<string, { enabled: boolean }> = {};\n for (const [key, instrumentationName] of Object.entries(mapping)) {\n const userSetting = config[key as keyof AutoInstrumentationConfig];\n const defaultValue = key !== 'fs' && key !== 'dns';\n result[instrumentationName] = { enabled: userSetting ?? defaultValue };\n }\n return result;\n}\n\n/** Shutdown tracing gracefully */\nexport async function shutdownTracing(): Promise<void> {\n if (!sdk) return;\n try {\n await sdk.shutdown();\n isInitialized = false;\n sdk = null;\n } catch (error) {\n console.error('[neoiq-foundation] Error shutting down tracing:', error);\n }\n}\n\nexport function getTracer(name: string): Tracer {\n return trace.getTracer(name);\n}\n\nexport function getActiveSpan() {\n return trace.getActiveSpan();\n}\n\nexport function getTraceContext(): { traceId?: string; spanId?: string } {\n const span = trace.getActiveSpan();\n if (!span) return {};\n const ctx = span.spanContext();\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n\nexport function isTracingEnabled(): boolean {\n return isInitialized;\n}\n\nexport { trace, context, propagation, SpanStatusCode };\nexport type { Tracer };\n","/**\n * OpenTelemetry Metrics Setup\n */\n\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc';\nimport { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { metrics, type Meter } from '@opentelemetry/api';\nimport { getDefaultOtelEndpoint } from '../config';\n\nexport interface MetricsOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n endpoint?: string;\n intervalMs?: number;\n}\n\nlet meterProvider: MeterProvider | null = null;\nlet isInitialized = false;\n\n/** Initialize OpenTelemetry metrics */\nexport function setupMetrics(options: MetricsOptions): void {\n if (isInitialized) {\n console.warn('[neoiq-foundation] Metrics already initialized');\n return;\n }\n\n const {\n serviceName,\n serviceVersion,\n environment,\n endpoint = getDefaultOtelEndpoint(),\n intervalMs = 5000,\n } = options;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: serviceVersion,\n 'deployment.environment': environment,\n });\n\n const metricExporter = new OTLPMetricExporter({ url: endpoint });\n const metricReader = new PeriodicExportingMetricReader({\n exporter: metricExporter,\n exportIntervalMillis: intervalMs,\n });\n\n meterProvider = new MeterProvider({ resource, readers: [metricReader] });\n metrics.setGlobalMeterProvider(meterProvider);\n isInitialized = true;\n}\n\n/** Shutdown metrics gracefully */\nexport async function shutdownMetrics(): Promise<void> {\n if (!meterProvider) return;\n try {\n await meterProvider.shutdown();\n isInitialized = false;\n meterProvider = null;\n } catch (error) {\n console.error('[neoiq-foundation] Error shutting down metrics:', error);\n }\n}\n\nexport function getMeter(name: string, version: string = '1.0.0'): Meter {\n return metrics.getMeter(name, version);\n}\n\nexport function isMetricsEnabled(): boolean {\n return isInitialized;\n}\n\nexport { metrics };\nexport type { Meter };\n","/**\n * Fastify Observability Plugin\n */\n\nimport { FastifyPluginAsync, FastifyRequest, FastifyReply } from 'fastify';\nimport fp from 'fastify-plugin';\nimport { randomUUID } from 'crypto';\nimport { trace, context, propagation, SpanStatusCode, Span } from '@opentelemetry/api';\nimport { type ContextManager } from '../features/context';\nimport { type Logger, getGlobalLogger } from '../features/logging';\nimport { getMeter } from '../features/metrics';\n\ninterface PluginRequestContext {\n correlationId: string;\n traceId: string;\n spanId: string;\n startTime: number;\n [key: string]: unknown;\n}\n\nexport interface RequestLoggingOptions {\n logHeaders?: boolean;\n logBody?: boolean;\n logResponseBody?: boolean;\n maxBodySize?: number;\n redactHeaders?: string[];\n}\n\nexport interface FastifyPluginOptions {\n serviceName: string;\n logger?: Logger;\n contextManager?: ContextManager;\n tracingEnabled?: boolean;\n metricsEnabled?: boolean;\n excludeRoutes?: string[];\n /** Request/response logging options */\n requestLogging?: RequestLoggingOptions;\n}\n\ndeclare module 'fastify' {\n interface FastifyRequest {\n __span?: Span;\n __requestContext?: PluginRequestContext;\n }\n}\n\n// Default headers to redact for security\nconst DEFAULT_REDACT_HEADERS = [\n 'authorization',\n 'cookie',\n 'x-api-key',\n 'x-auth-token',\n 'set-cookie',\n];\n\n/** Redact sensitive headers */\nfunction redactHeaders(\n headers: Record<string, unknown>,\n redactList: string[]\n): Record<string, unknown> {\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (redactList.includes(key.toLowerCase())) {\n redacted[key] = '[REDACTED]';\n } else {\n redacted[key] = value;\n }\n }\n return redacted;\n}\n\n/** Truncate body if too large */\nfunction truncateBody(body: unknown, maxSize: number): unknown {\n if (body === undefined || body === null) return undefined;\n const str = typeof body === 'string' ? body : JSON.stringify(body);\n if (str.length > maxSize) {\n return `[TRUNCATED - ${str.length} bytes]`;\n }\n return body;\n}\n\n/** Create a configured Fastify observability plugin */\nexport function createObservabilityPlugin(options: FastifyPluginOptions) {\n const plugin: FastifyPluginAsync<Partial<FastifyPluginOptions>> = async (fastify, pluginOpts) => {\n const {\n serviceName,\n logger = getGlobalLogger(),\n contextManager,\n tracingEnabled = true,\n metricsEnabled = true,\n excludeRoutes = ['/health', '/health/', '/healthz', '/ready', '/live'],\n requestLogging = {},\n } = { ...options, ...pluginOpts };\n\n // Request logging config\n const logHeaders = requestLogging.logHeaders ?? true;\n const logBody = requestLogging.logBody ?? false;\n const logResponseBody = requestLogging.logResponseBody ?? false;\n const maxBodySize = requestLogging.maxBodySize ?? 10 * 1024; // 10KB\n const headersToRedact = requestLogging.redactHeaders ?? DEFAULT_REDACT_HEADERS;\n\n const runInContext = contextManager\n ? <T>(ctx: PluginRequestContext, fn: () => T) => contextManager.run(ctx, fn)\n : <T>(_ctx: PluginRequestContext, fn: () => T) => fn();\n\n const tracer = tracingEnabled ? trace.getTracer('neoiq-foundation-node') : null;\n\n let requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']>;\n let requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']>;\n let requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']>;\n\n if (metricsEnabled) {\n const meter = getMeter(serviceName);\n requestCounter = meter.createCounter('http.server.requests.total');\n requestDuration = meter.createHistogram('http.server.request.duration', { unit: 'ms' });\n requestErrors = meter.createCounter('http.server.requests.errors');\n }\n\n // onRequest - Extract context, start span, log headers\n fastify.addHook('onRequest', (request: FastifyRequest, reply: FastifyReply, done) => {\n if (excludeRoutes.some((route) => request.url.startsWith(route))) {\n done();\n return;\n }\n\n const correlationId = (request.headers['x-request-id'] as string) || randomUUID();\n reply.header('x-request-id', correlationId);\n\n let span: Span | undefined;\n let traceId = '';\n let spanId = '';\n\n if (tracer) {\n const parentContext = propagation.extract(context.active(), request.headers);\n span = tracer.startSpan(\n `${request.method} ${request.routeOptions?.url || request.url}`,\n {\n kind: 1,\n attributes: {\n 'http.method': request.method,\n 'http.url': request.url,\n 'http.route': request.routeOptions?.url || request.url,\n 'http.user_agent': request.headers['user-agent'] || '',\n 'http.correlation_id': correlationId,\n },\n },\n parentContext\n );\n const spanContext = span.spanContext();\n traceId = spanContext.traceId;\n spanId = spanContext.spanId;\n }\n\n const requestContext: PluginRequestContext = {\n correlationId,\n traceId,\n spanId,\n startTime: Date.now(),\n };\n request.__span = span;\n request.__requestContext = requestContext;\n\n runInContext(requestContext, () => {\n const logData: Record<string, unknown> = {\n correlationId,\n traceId: traceId || undefined,\n method: request.method,\n url: request.url,\n ip: request.ip,\n userAgent: request.headers['user-agent'],\n };\n\n // Log headers (redacted)\n if (logHeaders) {\n logData.headers = redactHeaders(\n request.headers as Record<string, unknown>,\n headersToRedact\n );\n }\n\n logger.info(logData, 'Request received');\n done();\n });\n });\n\n // preHandler - Log request body (if enabled)\n if (logBody) {\n fastify.addHook('preHandler', (request: FastifyRequest, _reply: FastifyReply, done) => {\n const ctx = request.__requestContext;\n if (!ctx || !request.body) {\n done();\n return;\n }\n\n runInContext(ctx, () => {\n logger.debug(\n {\n correlationId: ctx.correlationId,\n body: truncateBody(request.body, maxBodySize),\n },\n 'Request body'\n );\n done();\n });\n });\n }\n\n // onSend - Log response body (if enabled)\n if (logResponseBody) {\n fastify.addHook('onSend', (request: FastifyRequest, reply: FastifyReply, payload, done) => {\n const ctx = request.__requestContext;\n if (!ctx) {\n done(null, payload);\n return;\n }\n\n runInContext(ctx, () => {\n logger.debug(\n {\n correlationId: ctx.correlationId,\n statusCode: reply.statusCode,\n body: truncateBody(payload, maxBodySize),\n },\n 'Response body'\n );\n done(null, payload);\n });\n });\n }\n\n // onResponse - End span, record metrics\n fastify.addHook('onResponse', (request: FastifyRequest, reply: FastifyReply, done) => {\n const ctx = request.__requestContext;\n const span = request.__span;\n if (!ctx) {\n done();\n return;\n }\n\n const durationMs = Date.now() - ctx.startTime;\n const route = request.routeOptions?.url || request.url;\n const labels = { method: request.method, route, status_code: String(reply.statusCode) };\n\n runInContext(ctx, () => {\n logger.info(\n {\n correlationId: ctx.correlationId,\n method: request.method,\n statusCode: reply.statusCode,\n durationMs,\n },\n 'Request completed'\n );\n\n if (metricsEnabled) {\n requestCounter.add(1, labels);\n requestDuration.record(durationMs, labels);\n if (reply.statusCode >= 400) requestErrors.add(1, labels);\n }\n\n if (span) {\n span.setStatus({\n code: reply.statusCode < 400 ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n });\n span.setAttribute('http.status_code', reply.statusCode);\n span.setAttribute('http.response_time_ms', durationMs);\n span.end();\n }\n\n done();\n });\n });\n\n // onError - Record exception on span\n fastify.addHook(\n 'onError',\n (request: FastifyRequest, _reply: FastifyReply, error: Error, done) => {\n const ctx = request.__requestContext;\n const span = request.__span;\n if (!ctx) {\n done();\n return;\n }\n\n runInContext(ctx, () => {\n logger.error(\n {\n correlationId: ctx.correlationId,\n method: request.method,\n url: request.url,\n error: error.message,\n },\n 'Request failed'\n );\n\n if (span) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n }\n\n done();\n });\n }\n );\n };\n\n return fp(plugin, { name: 'neoiq-observability', fastify: '>=4.x' });\n}\n","/**\n * HTTP Client with Observability\n */\n\nimport axios from 'axios';\nimport type {\n AxiosInstance,\n AxiosRequestConfig,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\nimport axiosRetry, { IAxiosRetryConfig } from 'axios-retry';\nimport CircuitBreaker from 'opossum';\nimport { context, propagation } from '@opentelemetry/api';\nimport type { FoundationInstance } from '../foundation';\nimport { getGlobalLogger, type Logger } from '../features/logging';\nimport { getMeter } from '../features/metrics';\n\nexport interface HttpClientOptions {\n baseURL: string;\n serviceName: string;\n timeout?: number;\n retry?: {\n retries?: number;\n retryDelay?: number;\n retryStatusCodes?: number[];\n };\n circuitBreaker?: {\n enabled?: boolean;\n resetTimeout?: number;\n errorThresholdPercentage?: number;\n };\n headers?: Record<string, string>;\n foundation?: FoundationInstance;\n}\n\nexport type HttpClient = AxiosInstance;\n\n/** Create a configured HTTP client with full observability */\nexport function createHttpClient(options: HttpClientOptions): HttpClient {\n const {\n baseURL,\n serviceName,\n timeout = 30000,\n retry = {},\n circuitBreaker: cbOptions = {},\n headers = {},\n foundation,\n } = options;\n\n const logger: Logger = foundation?.logger || getGlobalLogger();\n const getContext = () => foundation?.context.getContext();\n const metricsEnabled = foundation?.features.metrics ?? true;\n const tracingEnabled = foundation?.features.tracing ?? true;\n\n const client = axios.create({\n baseURL,\n timeout,\n headers: { 'Content-Type': 'application/json', ...headers },\n });\n\n // Metrics\n let requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null = null;\n let requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']> | null = null;\n let requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null = null;\n\n if (metricsEnabled) {\n const meter = getMeter(`http-client-${serviceName}`);\n requestCounter = meter.createCounter('http.client.requests.total');\n requestDuration = meter.createHistogram('http.client.request.duration', { unit: 'ms' });\n requestErrors = meter.createCounter('http.client.requests.errors');\n }\n\n // Request interceptor - Add trace context\n client.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n if (tracingEnabled) {\n const carrier: Record<string, string> = {};\n propagation.inject(context.active(), carrier);\n if (carrier.traceparent) config.headers.set('traceparent', carrier.traceparent);\n if (carrier.tracestate) config.headers.set('tracestate', carrier.tracestate);\n }\n\n const reqCtx = getContext();\n if (reqCtx?.correlationId) config.headers.set('x-request-id', reqCtx.correlationId);\n\n (config as InternalAxiosRequestConfig & { __startTime: number }).__startTime = Date.now();\n\n logger.debug(\n {\n method: config.method?.toUpperCase(),\n url: `${config.baseURL || ''}${config.url}`,\n targetService: serviceName,\n },\n 'Outbound HTTP request'\n );\n\n return config;\n });\n\n // Response interceptor - Log and record metrics\n client.interceptors.response.use(\n (response: AxiosResponse) => {\n const config = response.config as InternalAxiosRequestConfig & { __startTime?: number };\n const durationMs = Date.now() - (config.__startTime || Date.now());\n const labels = {\n target_service: serviceName,\n method: config.method?.toUpperCase() || 'GET',\n status_code: String(response.status),\n };\n\n logger.debug(\n {\n method: config.method?.toUpperCase(),\n statusCode: response.status,\n durationMs,\n targetService: serviceName,\n },\n 'Outbound HTTP response'\n );\n\n if (metricsEnabled) {\n requestCounter?.add(1, labels);\n requestDuration?.record(durationMs, labels);\n }\n\n return response;\n },\n (error) => {\n const config = error.config as\n | (InternalAxiosRequestConfig & { __startTime?: number })\n | undefined;\n const durationMs = config ? Date.now() - (config.__startTime || Date.now()) : 0;\n const statusCode = error.response?.status || 0;\n const labels = {\n target_service: serviceName,\n method: config?.method?.toUpperCase() || 'GET',\n status_code: String(statusCode),\n };\n\n logger.error(\n {\n method: config?.method?.toUpperCase(),\n statusCode,\n durationMs,\n error: error.message,\n targetService: serviceName,\n },\n 'Outbound HTTP error'\n );\n\n if (metricsEnabled) {\n requestCounter?.add(1, labels);\n requestDuration?.record(durationMs, labels);\n requestErrors?.add(1, labels);\n }\n\n return Promise.reject(error);\n }\n );\n\n // Retry config\n const retryConfig: IAxiosRetryConfig = {\n retries: retry.retries ?? 3,\n retryDelay: (retryCount) => (retry.retryDelay ?? 1000) * Math.pow(2, retryCount - 1),\n retryCondition: (error) => {\n const retryStatusCodes = retry.retryStatusCodes ?? [408, 429, 500, 502, 503, 504];\n return !error.response || retryStatusCodes.includes(error.response?.status || 0);\n },\n onRetry: (retryCount, error, requestConfig) => {\n logger.warn(\n {\n retryCount,\n url: `${requestConfig.baseURL || ''}${requestConfig.url}`,\n error: error.message,\n },\n 'Retrying request'\n );\n },\n };\n axiosRetry(client, retryConfig);\n\n // Circuit breaker\n if (cbOptions.enabled !== false) {\n const breaker = new CircuitBreaker(\n async (config: AxiosRequestConfig) => client.request(config),\n {\n timeout,\n resetTimeout: cbOptions.resetTimeout ?? 30000,\n errorThresholdPercentage: cbOptions.errorThresholdPercentage ?? 50,\n volumeThreshold: 10,\n }\n );\n breaker.on('open', () => logger.warn({ targetService: serviceName }, 'Circuit breaker OPEN'));\n breaker.on('halfOpen', () =>\n logger.info({ targetService: serviceName }, 'Circuit breaker HALF-OPEN')\n );\n breaker.on('close', () =>\n logger.info({ targetService: serviceName }, 'Circuit breaker CLOSED')\n );\n }\n\n return client;\n}\n\nexport type { AxiosInstance, AxiosRequestConfig, AxiosResponse };\n","/**\n * Foundation - Main Entry Point\n */\n\nimport {\n parseConfig,\n type FoundationConfig,\n type FoundationConfigInput,\n} from './config';\nimport {\n createContextManager,\n type ContextManager,\n type RequestContext,\n} from './features/context';\nimport { createLogger, setGlobalLogger, type Logger } from './features/logging';\nimport {\n setupTracing,\n shutdownTracing,\n getTracer,\n getActiveSpan,\n getTraceContext,\n isTracingEnabled,\n SpanStatusCode,\n type Tracer,\n} from './features/tracing';\nimport {\n setupMetrics,\n shutdownMetrics,\n getMeter,\n isMetricsEnabled,\n type Meter,\n} from './features/metrics';\nimport {\n createObservabilityPlugin,\n type FastifyPluginOptions,\n} from './integrations/fastify-plugin';\nimport {\n createHttpClient as createHttpClientInternal,\n type HttpClientOptions,\n type HttpClient,\n} from './integrations/http-client';\n\n// Health status types\nexport interface HealthStatus {\n status: 'healthy' | 'degraded' | 'unhealthy';\n timestamp: string;\n service: string;\n version: string;\n uptime: number;\n components: {\n tracing: ComponentHealth;\n metrics: ComponentHealth;\n logging: ComponentHealth;\n };\n}\n\nexport interface ComponentHealth {\n enabled: boolean;\n status: 'up' | 'down' | 'disabled';\n message?: string;\n}\n\n// Foundation instance interface\nexport interface FoundationInstance {\n readonly config: FoundationConfig;\n readonly logger: Logger;\n readonly context: ContextManager;\n readonly tracer: Tracer | null;\n readonly meter: Meter | null;\n readonly fastifyPlugin: ReturnType<typeof createObservabilityPlugin>;\n readonly features: { tracing: boolean; metrics: boolean; logging: boolean };\n\n getTracer: (name?: string) => Tracer;\n getMeter: (name: string, version?: string) => Meter;\n getTraceContext: () => { traceId?: string; spanId?: string };\n getActiveSpan: () => ReturnType<typeof getActiveSpan>;\n createHttpClient: (options: Omit<HttpClientOptions, 'foundation'>) => HttpClient;\n shutdown: () => Promise<void>;\n isReady: () => boolean;\n\n // Health check\n health: () => HealthStatus;\n\n // Error boundaries\n trace: <T>(name: string, fn: () => T | Promise<T>) => Promise<T>;\n safeRun: <T>(fn: () => T | Promise<T>, fallback?: T) => Promise<T | undefined>;\n}\n\n/** Create a fully configured observability foundation */\nexport function createFoundation(input: FoundationConfigInput): FoundationInstance {\n const startTime = Date.now();\n const config = parseConfig(input);\n const {\n serviceName,\n serviceVersion,\n environment,\n features: featuresConfig,\n otel,\n logging: loggingConfig,\n requestLogging: requestLoggingConfig,\n } = config;\n\n const features = {\n tracing: featuresConfig.tracing ?? true,\n metrics: featuresConfig.metrics ?? true,\n logging: featuresConfig.logging ?? true,\n };\n\n // Context manager\n const contextManager = createContextManager();\n\n // Logger (always created - has fallback)\n let logger: Logger;\n let loggingError: string | undefined;\n try {\n logger = createLogger({\n serviceName,\n serviceVersion,\n environment,\n level: loggingConfig.level ?? 'info',\n prettyPrint: loggingConfig.prettyPrint ?? environment === 'development',\n contextManager,\n });\n setGlobalLogger(logger);\n } catch (err) {\n loggingError = (err as Error).message;\n // Fallback to console\n logger = {\n debug: (obj, msg) => console.debug(JSON.stringify({ ...obj, msg })),\n info: (obj, msg) => console.info(JSON.stringify({ ...obj, msg })),\n warn: (obj, msg) => console.warn(JSON.stringify({ ...obj, msg })),\n error: (obj, msg) => console.error(JSON.stringify({ ...obj, msg })),\n child: () => logger,\n pino: null as never,\n };\n console.error('[neoiq-foundation] Logger setup failed, using console:', loggingError);\n }\n\n // Tracing (with error boundary)\n let tracerInstance: Tracer | null = null;\n let tracingError: string | undefined;\n if (features.tracing) {\n try {\n setupTracing({\n serviceName,\n serviceVersion,\n environment,\n endpoint: otel.endpoint,\n sampleRate: otel.traceSampleRate,\n autoInstrumentation: featuresConfig.autoInstrumentation,\n });\n tracerInstance = getTracer(serviceName);\n logger.info({ feature: 'tracing', endpoint: otel.endpoint }, 'Tracing enabled');\n } catch (err) {\n tracingError = (err as Error).message;\n logger.error({ error: tracingError }, 'Tracing setup failed - continuing without tracing');\n }\n }\n\n // Metrics (with error boundary)\n let meterInstance: Meter | null = null;\n let metricsError: string | undefined;\n if (features.metrics) {\n try {\n setupMetrics({\n serviceName,\n serviceVersion,\n environment,\n endpoint: otel.endpoint,\n intervalMs: otel.metricsIntervalMs,\n });\n meterInstance = getMeter(serviceName);\n logger.info({ feature: 'metrics', interval: `${otel.metricsIntervalMs}ms` }, 'Metrics enabled');\n } catch (err) {\n metricsError = (err as Error).message;\n logger.error({ error: metricsError }, 'Metrics setup failed - continuing without metrics');\n }\n }\n\n logger.info({ serviceName, serviceVersion, environment, features }, 'Foundation initialized');\n\n const foundation: FoundationInstance = {\n config,\n logger,\n context: contextManager,\n tracer: tracerInstance,\n meter: meterInstance,\n features,\n\n getTracer: (name?: string) => getTracer(name || serviceName),\n getMeter: (name: string, version?: string) => getMeter(name, version),\n getTraceContext,\n getActiveSpan,\n\n fastifyPlugin: createObservabilityPlugin({\n serviceName,\n logger,\n contextManager,\n tracingEnabled: features.tracing && !tracingError,\n metricsEnabled: features.metrics && !metricsError,\n requestLogging: requestLoggingConfig,\n }),\n\n createHttpClient: (options) => createHttpClientInternal({ ...options, foundation }),\n\n shutdown: async () => {\n logger.info({}, 'Shutting down foundation...');\n const promises: Promise<void>[] = [];\n if (features.tracing && isTracingEnabled()) promises.push(shutdownTracing());\n if (features.metrics && isMetricsEnabled()) promises.push(shutdownMetrics());\n await Promise.all(promises);\n logger.info({}, 'Foundation shutdown complete');\n },\n\n isReady: () => {\n if (features.tracing && !tracingError && !isTracingEnabled()) return false;\n if (features.metrics && !metricsError && !isMetricsEnabled()) return false;\n return true;\n },\n\n // Health check\n health: (): HealthStatus => {\n const tracingUp = !features.tracing || (!tracingError && isTracingEnabled());\n const metricsUp = !features.metrics || (!metricsError && isMetricsEnabled());\n const loggingUp = !loggingError;\n\n const allUp = tracingUp && metricsUp && loggingUp;\n const anyDown =\n (features.tracing && tracingError) ||\n (features.metrics && metricsError) ||\n loggingError;\n\n return {\n status: allUp ? 'healthy' : anyDown ? 'degraded' : 'unhealthy',\n timestamp: new Date().toISOString(),\n service: serviceName,\n version: serviceVersion,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n components: {\n tracing: {\n enabled: features.tracing,\n status: !features.tracing ? 'disabled' : tracingError ? 'down' : 'up',\n message: tracingError,\n },\n metrics: {\n enabled: features.metrics,\n status: !features.metrics ? 'disabled' : metricsError ? 'down' : 'up',\n message: metricsError,\n },\n logging: {\n enabled: features.logging,\n status: loggingError ? 'down' : 'up',\n message: loggingError,\n },\n },\n };\n },\n\n // Trace: Run code within a span (Datadog-style)\n trace: async <T>(name: string, fn: () => T | Promise<T>): Promise<T> => {\n const tracer = tracerInstance || getTracer(serviceName);\n\n return new Promise((resolve, reject) => {\n tracer.startActiveSpan(name, async (span) => {\n try {\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n resolve(result);\n } catch (err) {\n const error = err as Error;\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n logger.error({ span: name, error: error.message }, 'Span failed');\n reject(error);\n }\n });\n });\n },\n\n // Safe run: Execute with try-catch, return fallback on error\n safeRun: async <T>(fn: () => T | Promise<T>, fallback?: T): Promise<T | undefined> => {\n try {\n return await fn();\n } catch (err) {\n const error = err as Error;\n logger.error({ error: error.message, stack: error.stack }, 'safeRun caught error');\n return fallback;\n }\n },\n };\n\n return foundation;\n}\n\n/** Alias for createFoundation */\nexport const setupObservability = createFoundation;\n\nexport { SpanStatusCode };\nexport type { FoundationConfig, FoundationConfigInput };\nexport type { Logger };\nexport type { ContextManager, RequestContext };\nexport type { Tracer, Meter };\nexport type { FastifyPluginOptions };\nexport type { HttpClientOptions, HttpClient };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["input: FoundationConfigInput","context: RequestContext","fn: () => T","key: K","updates: Partial<RequestContext>","options: LoggerOptions","pinoLogger: PinoLogger","serviceName: string","level: string","obj: object","msg?: string","fallback: Logger","globalLogger: Logger | null","logger: Logger","sdk: NodeSDK | null","options: TracingOptions","config: AutoInstrumentationConfig","mapping: Record<string, string>","result: Record<string, { enabled: boolean }>","name: string","meterProvider: MeterProvider | null","options: MetricsOptions","name: string","version: string","headers: Record<string, unknown>","redactList: string[]","redacted: Record<string, unknown>","body: unknown","maxSize: number","options: FastifyPluginOptions","plugin: FastifyPluginAsync<Partial<FastifyPluginOptions>>","ctx: PluginRequestContext","fn: () => T","_ctx: PluginRequestContext","requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']>","requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']>","requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']>","request: FastifyRequest","reply: FastifyReply","span: Span | undefined","requestContext: PluginRequestContext","logData: Record<string, unknown>","_reply: FastifyReply","error: Error","options: HttpClientOptions","logger: Logger","requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null","requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']> | null","requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null","config: InternalAxiosRequestConfig","carrier: Record<string, string>","response: AxiosResponse","retryConfig: IAxiosRetryConfig","config: AxiosRequestConfig","input: FoundationConfigInput","logger: Logger","loggingError: string | undefined","tracerInstance: Tracer | null","tracingError: string | undefined","meterInstance: Meter | null","metricsError: string | undefined","foundation: FoundationInstance","name?: string","name: string","version?: string","promises: Promise<void>[]","fn: () => T | Promise<T>","fallback?: T"],"sources":["../src/config.ts","../src/features/context.ts","../src/features/logging.ts","../src/features/tracing.ts","../src/features/metrics.ts","../src/integrations/fastify-plugin.ts","../src/integrations/http-client.ts","../src/foundation.ts"],"sourcesContent":["/**\n * Foundation Configuration with Zod Validation\n */\n\nimport { z } from 'zod';\n\n// Auto-Instrumentation Config\nexport const AutoInstrumentationConfigSchema = z\n .object({\n http: z.boolean().default(true),\n fastify: z.boolean().default(true),\n express: z.boolean().default(true),\n mongodb: z.boolean().default(true),\n pg: z.boolean().default(true),\n mysql: z.boolean().default(true),\n redis: z.boolean().default(true),\n ioredis: z.boolean().default(true),\n grpc: z.boolean().default(true),\n fs: z.boolean().default(false),\n dns: z.boolean().default(false),\n })\n .partial();\n\nexport type AutoInstrumentationConfig = z.infer<typeof AutoInstrumentationConfigSchema>;\n\n// Features Config\nexport const FeaturesConfigSchema = z\n .object({\n tracing: z.boolean().default(true),\n metrics: z.boolean().default(true),\n logging: z.boolean().default(true),\n autoInstrumentation: AutoInstrumentationConfigSchema.default({}),\n })\n .partial();\n\nexport type FeaturesConfig = z.infer<typeof FeaturesConfigSchema>;\n\n// OTEL Config\nconst DEFAULT_OTEL_ENDPOINT =\n 'http://otel-stack-deployment-collector.observability.svc.cluster.local:4317';\n\nexport const OtelConfigSchema = z\n .object({\n endpoint: z.string().default(DEFAULT_OTEL_ENDPOINT),\n metricsIntervalMs: z.number().min(1000).default(5000),\n traceSampleRate: z.number().min(0).max(1).default(1.0),\n })\n .partial();\n\nexport type OtelConfig = z.infer<typeof OtelConfigSchema>;\n\n// Logging Config\nexport const LoggingConfigSchema = z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n prettyPrint: z.boolean().optional(),\n })\n .partial();\n\nexport type LoggingConfig = z.infer<typeof LoggingConfigSchema>;\n\n// Request Logging Config\nexport const RequestLoggingConfigSchema = z\n .object({\n logHeaders: z.boolean().default(true),\n logBody: z.boolean().default(false),\n logResponseBody: z.boolean().default(false),\n maxBodySize: z.number().default(10 * 1024),\n redactHeaders: z.array(z.string()).optional(),\n })\n .partial();\n\nexport type RequestLoggingConfig = z.infer<typeof RequestLoggingConfigSchema>;\n\n// Main Foundation Config\nexport const FoundationConfigSchema = z.object({\n serviceName: z.string().min(1, 'serviceName is required'),\n serviceVersion: z.string().default(process.env.SERVICE_VERSION || '1.0.0'),\n environment: z\n .enum(['development', 'staging', 'qa', 'production'])\n .default((process.env.NODE_ENV as 'development' | 'production') || 'development'),\n features: FeaturesConfigSchema.default({}),\n otel: OtelConfigSchema.default({}),\n logging: LoggingConfigSchema.default({}),\n requestLogging: RequestLoggingConfigSchema.default({}),\n});\n\nexport type FoundationConfig = z.infer<typeof FoundationConfigSchema>;\n\nexport type FoundationConfigInput = Partial<FoundationConfig> & {\n serviceName: string;\n};\n\n/** Parse and validate configuration */\nexport function parseConfig(input: FoundationConfigInput): FoundationConfig {\n const result = FoundationConfigSchema.safeParse(input);\n\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join('.')}: ${e.message}`)\n .join('\\n');\n throw new Error(`Invalid foundation configuration:\\n${errors}`);\n }\n\n return result.data;\n}\n\n/** Get default OTEL endpoint */\nexport function getDefaultOtelEndpoint(): string {\n return process.env.OTEL_EXPORTER_OTLP_ENDPOINT || DEFAULT_OTEL_ENDPOINT;\n}\n","/**\n * Context Manager - AsyncLocalStorage for request context propagation\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\n\nexport interface RequestContext {\n correlationId?: string;\n traceId?: string;\n spanId?: string;\n startTime?: number;\n [key: string]: unknown;\n}\n\nexport interface ContextManager {\n getContext(): RequestContext | undefined;\n run<T>(context: RequestContext, fn: () => T): T;\n get<K extends keyof RequestContext>(key: K): RequestContext[K] | undefined;\n update(updates: Partial<RequestContext>): RequestContext | undefined;\n}\n\n/** Create a new context manager instance */\nexport function createContextManager(): ContextManager {\n const als = new AsyncLocalStorage<RequestContext>();\n\n return {\n getContext: () => als.getStore(),\n\n run<T>(context: RequestContext, fn: () => T): T {\n return als.run(context, fn);\n },\n\n get<K extends keyof RequestContext>(key: K): RequestContext[K] | undefined {\n return als.getStore()?.[key];\n },\n\n update(updates: Partial<RequestContext>): RequestContext | undefined {\n const current = als.getStore();\n if (!current) return undefined;\n Object.assign(current, updates);\n return current;\n },\n };\n}\n","/**\n * Structured Logging with Pino\n */\n\nimport pino, { Logger as PinoLogger } from 'pino';\nimport { trace } from '@opentelemetry/api';\nimport { type ContextManager } from './context';\n\nexport interface LoggerOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n level: 'debug' | 'info' | 'warn' | 'error';\n prettyPrint: boolean;\n contextManager?: ContextManager;\n}\n\nexport interface Logger {\n debug: (obj: object, msg?: string) => void;\n info: (obj: object, msg?: string) => void;\n warn: (obj: object, msg?: string) => void;\n error: (obj: object, msg?: string) => void;\n child: (bindings: object) => Logger;\n readonly pino: PinoLogger;\n}\n\n/** Create a structured logger with automatic trace context injection */\nexport function createLogger(options: LoggerOptions): Logger {\n const { serviceName, serviceVersion, environment, level, prettyPrint, contextManager } = options;\n\n const pinoLogger = pino({\n level,\n base: { service: serviceName, version: serviceVersion, env: environment },\n mixin: () => {\n const span = trace.getActiveSpan();\n const spanContext = span?.spanContext();\n const ctx = contextManager?.getContext();\n\n const traceId = spanContext?.traceId || ctx?.traceId;\n const spanId = spanContext?.spanId || ctx?.spanId;\n const correlationId = ctx?.correlationId;\n\n // Industry-standard field names for correlation in most log backends (incl. Groundcover)\n return {\n trace_id: traceId,\n span_id: spanId,\n correlation_id: correlationId,\n };\n },\n formatters: { level: (label) => ({ level: label }) },\n transport: prettyPrint\n ? {\n target: 'pino-pretty',\n options: { colorize: true, translateTime: 'SYS:standard', ignore: 'pid,hostname' },\n }\n : undefined,\n });\n\n return wrapPinoLogger(pinoLogger);\n}\n\nfunction wrapPinoLogger(pinoLogger: PinoLogger): Logger {\n return {\n debug: (obj, msg) => pinoLogger.debug(obj, msg),\n info: (obj, msg) => pinoLogger.info(obj, msg),\n warn: (obj, msg) => pinoLogger.warn(obj, msg),\n error: (obj, msg) => pinoLogger.error(obj, msg),\n child: (bindings) => wrapPinoLogger(pinoLogger.child(bindings)),\n pino: pinoLogger,\n };\n}\n\n/** Fallback logger when Pino is not available */\nexport function createFallbackLogger(serviceName: string = 'unknown'): Logger {\n const log = (level: string, obj: object, msg?: string) => {\n const logObj = {\n timestamp: new Date().toISOString(),\n level,\n service: serviceName,\n ...obj,\n msg,\n };\n const payload = JSON.stringify(logObj);\n if (level === 'warn') console.warn(payload);\n else if (level === 'error') console.error(payload);\n else console.log(payload);\n };\n\n const fallback: Logger = {\n debug: (obj, msg) => log('debug', obj, msg),\n info: (obj, msg) => log('info', obj, msg),\n warn: (obj, msg) => log('warn', obj, msg),\n error: (obj, msg) => log('error', obj, msg),\n child: () => fallback,\n pino: null as unknown as PinoLogger,\n };\n\n return fallback;\n}\n\n// Global logger for standalone usage\nlet globalLogger: Logger | null = null;\n\nexport function setGlobalLogger(logger: Logger): void {\n globalLogger = logger;\n}\n\nexport function getGlobalLogger(): Logger {\n return globalLogger || createFallbackLogger();\n}\n","/**\n * OpenTelemetry Tracing Setup\n */\n\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { trace, context, propagation, SpanStatusCode, type Tracer } from '@opentelemetry/api';\nimport { type AutoInstrumentationConfig, getDefaultOtelEndpoint } from '../config';\n\nexport interface TracingOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n endpoint?: string;\n sampleRate?: number;\n autoInstrumentation?: AutoInstrumentationConfig;\n}\n\nlet sdk: NodeSDK | null = null;\nlet isInitialized = false;\n\n/** Initialize OpenTelemetry tracing */\nexport function setupTracing(options: TracingOptions): void {\n if (isInitialized) {\n console.warn('[neoiq-foundation] Tracing already initialized');\n return;\n }\n\n const {\n serviceName,\n serviceVersion,\n environment,\n endpoint = getDefaultOtelEndpoint(),\n autoInstrumentation = {},\n } = options;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: serviceVersion,\n 'deployment.environment': environment,\n });\n\n const traceExporter = new OTLPTraceExporter({ url: endpoint });\n const instrumentationConfig = buildInstrumentationConfig(autoInstrumentation);\n\n sdk = new NodeSDK({\n resource,\n traceExporter,\n instrumentations: [getNodeAutoInstrumentations(instrumentationConfig)],\n });\n\n sdk.start();\n isInitialized = true;\n}\n\nfunction buildInstrumentationConfig(\n config: AutoInstrumentationConfig\n): Record<string, { enabled: boolean }> {\n const mapping: Record<string, string> = {\n http: '@opentelemetry/instrumentation-http',\n fastify: '@opentelemetry/instrumentation-fastify',\n express: '@opentelemetry/instrumentation-express',\n mongodb: '@opentelemetry/instrumentation-mongodb',\n pg: '@opentelemetry/instrumentation-pg',\n mysql: '@opentelemetry/instrumentation-mysql',\n redis: '@opentelemetry/instrumentation-redis',\n ioredis: '@opentelemetry/instrumentation-ioredis',\n grpc: '@opentelemetry/instrumentation-grpc',\n fs: '@opentelemetry/instrumentation-fs',\n dns: '@opentelemetry/instrumentation-dns',\n };\n\n const result: Record<string, { enabled: boolean }> = {};\n for (const [key, instrumentationName] of Object.entries(mapping)) {\n const userSetting = config[key as keyof AutoInstrumentationConfig];\n const defaultValue = key !== 'fs' && key !== 'dns';\n result[instrumentationName] = { enabled: userSetting ?? defaultValue };\n }\n return result;\n}\n\n/** Shutdown tracing gracefully */\nexport async function shutdownTracing(): Promise<void> {\n if (!sdk) return;\n try {\n await sdk.shutdown();\n isInitialized = false;\n sdk = null;\n } catch (error) {\n console.error('[neoiq-foundation] Error shutting down tracing:', error);\n }\n}\n\nexport function getTracer(name: string): Tracer {\n return trace.getTracer(name);\n}\n\nexport function getActiveSpan() {\n return trace.getActiveSpan();\n}\n\nexport function getTraceContext(): { traceId?: string; spanId?: string } {\n const span = trace.getActiveSpan();\n if (!span) return {};\n const ctx = span.spanContext();\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n\nexport function isTracingEnabled(): boolean {\n return isInitialized;\n}\n\nexport { trace, context, propagation, SpanStatusCode };\nexport type { Tracer };\n","/**\n * OpenTelemetry Metrics Setup\n */\n\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc';\nimport { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { metrics, type Meter } from '@opentelemetry/api';\nimport { getDefaultOtelEndpoint } from '../config';\n\nexport interface MetricsOptions {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n endpoint?: string;\n intervalMs?: number;\n}\n\nlet meterProvider: MeterProvider | null = null;\nlet isInitialized = false;\n\n/** Initialize OpenTelemetry metrics */\nexport function setupMetrics(options: MetricsOptions): void {\n if (isInitialized) {\n console.warn('[neoiq-foundation] Metrics already initialized');\n return;\n }\n\n const {\n serviceName,\n serviceVersion,\n environment,\n endpoint = getDefaultOtelEndpoint(),\n intervalMs = 5000,\n } = options;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: serviceVersion,\n 'deployment.environment': environment,\n });\n\n const metricExporter = new OTLPMetricExporter({ url: endpoint });\n const metricReader = new PeriodicExportingMetricReader({\n exporter: metricExporter,\n exportIntervalMillis: intervalMs,\n });\n\n meterProvider = new MeterProvider({ resource, readers: [metricReader] });\n metrics.setGlobalMeterProvider(meterProvider);\n isInitialized = true;\n}\n\n/** Shutdown metrics gracefully */\nexport async function shutdownMetrics(): Promise<void> {\n if (!meterProvider) return;\n try {\n await meterProvider.shutdown();\n isInitialized = false;\n meterProvider = null;\n } catch (error) {\n console.error('[neoiq-foundation] Error shutting down metrics:', error);\n }\n}\n\nexport function getMeter(name: string, version: string = '1.0.0'): Meter {\n return metrics.getMeter(name, version);\n}\n\nexport function isMetricsEnabled(): boolean {\n return isInitialized;\n}\n\nexport { metrics };\nexport type { Meter };\n","/**\n * Fastify Observability Plugin\n */\n\nimport { FastifyPluginAsync, FastifyRequest, FastifyReply } from 'fastify';\nimport fp from 'fastify-plugin';\nimport { randomUUID } from 'crypto';\nimport { trace, context, propagation, SpanStatusCode, Span } from '@opentelemetry/api';\nimport { type ContextManager } from '../features/context';\nimport { type Logger, getGlobalLogger } from '../features/logging';\nimport { getMeter } from '../features/metrics';\n\ninterface PluginRequestContext {\n correlationId: string;\n traceId: string;\n spanId: string;\n startTime: number;\n [key: string]: unknown;\n}\n\nexport interface RequestLoggingOptions {\n logHeaders?: boolean;\n logBody?: boolean;\n logResponseBody?: boolean;\n maxBodySize?: number;\n redactHeaders?: string[];\n}\n\nexport interface FastifyPluginOptions {\n serviceName: string;\n logger?: Logger;\n contextManager?: ContextManager;\n tracingEnabled?: boolean;\n metricsEnabled?: boolean;\n excludeRoutes?: string[];\n /** Request/response logging options */\n requestLogging?: RequestLoggingOptions;\n}\n\ndeclare module 'fastify' {\n interface FastifyRequest {\n __span?: Span;\n __requestContext?: PluginRequestContext;\n }\n}\n\n// Default headers to redact for security\nconst DEFAULT_REDACT_HEADERS = [\n 'authorization',\n 'cookie',\n 'x-api-key',\n 'x-auth-token',\n 'set-cookie',\n];\n\n/** Redact sensitive headers */\nfunction redactHeaders(\n headers: Record<string, unknown>,\n redactList: string[]\n): Record<string, unknown> {\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (redactList.includes(key.toLowerCase())) {\n redacted[key] = '[REDACTED]';\n } else {\n redacted[key] = value;\n }\n }\n return redacted;\n}\n\n/** Truncate body if too large */\nfunction truncateBody(body: unknown, maxSize: number): unknown {\n if (body === undefined || body === null) return undefined;\n const str = typeof body === 'string' ? body : JSON.stringify(body);\n if (str.length > maxSize) {\n return `[TRUNCATED - ${str.length} bytes]`;\n }\n return body;\n}\n\n/** Create a configured Fastify observability plugin */\nexport function createObservabilityPlugin(options: FastifyPluginOptions) {\n const plugin: FastifyPluginAsync<Partial<FastifyPluginOptions>> = async (fastify, pluginOpts) => {\n const {\n serviceName,\n logger = getGlobalLogger(),\n contextManager,\n tracingEnabled = true,\n metricsEnabled = true,\n excludeRoutes = ['/health', '/health/', '/healthz', '/ready', '/live'],\n requestLogging = {},\n } = { ...options, ...pluginOpts };\n\n // Request logging config\n const logHeaders = requestLogging.logHeaders ?? true;\n const logBody = requestLogging.logBody ?? false;\n const logResponseBody = requestLogging.logResponseBody ?? false;\n const maxBodySize = requestLogging.maxBodySize ?? 10 * 1024; // 10KB\n const headersToRedact = requestLogging.redactHeaders ?? DEFAULT_REDACT_HEADERS;\n\n const runInContext = contextManager\n ? <T>(ctx: PluginRequestContext, fn: () => T) => contextManager.run(ctx, fn)\n : <T>(_ctx: PluginRequestContext, fn: () => T) => fn();\n\n const tracer = tracingEnabled ? trace.getTracer('neoiq-foundation-node') : null;\n\n let requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']>;\n let requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']>;\n let requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']>;\n\n if (metricsEnabled) {\n const meter = getMeter(serviceName);\n requestCounter = meter.createCounter('http.server.requests.total');\n requestDuration = meter.createHistogram('http.server.request.duration', { unit: 'ms' });\n requestErrors = meter.createCounter('http.server.requests.errors');\n }\n\n // onRequest - Extract context, start span, log headers\n fastify.addHook('onRequest', (request: FastifyRequest, reply: FastifyReply, done) => {\n if (excludeRoutes.some((route) => request.url.startsWith(route))) {\n done();\n return;\n }\n\n const correlationId = (request.headers['x-request-id'] as string) || randomUUID();\n reply.header('x-request-id', correlationId);\n\n let span: Span | undefined;\n let traceId = '';\n let spanId = '';\n\n if (tracer) {\n const parentContext = propagation.extract(context.active(), request.headers);\n span = tracer.startSpan(\n `${request.method} ${request.routeOptions?.url || request.url}`,\n {\n kind: 1,\n attributes: {\n 'http.method': request.method,\n 'http.url': request.url,\n 'http.route': request.routeOptions?.url || request.url,\n 'http.user_agent': request.headers['user-agent'] || '',\n 'http.correlation_id': correlationId,\n },\n },\n parentContext\n );\n const spanContext = span.spanContext();\n traceId = spanContext.traceId;\n spanId = spanContext.spanId;\n }\n\n const requestContext: PluginRequestContext = {\n correlationId,\n traceId,\n spanId,\n startTime: Date.now(),\n };\n request.__span = span;\n request.__requestContext = requestContext;\n\n runInContext(requestContext, () => {\n const logData: Record<string, unknown> = {\n correlation_id: correlationId,\n trace_id: traceId || undefined,\n span_id: spanId || undefined,\n method: request.method,\n url: request.url,\n ip: request.ip,\n userAgent: request.headers['user-agent'],\n };\n\n // Log headers (redacted)\n if (logHeaders) {\n logData.headers = redactHeaders(\n request.headers as Record<string, unknown>,\n headersToRedact\n );\n }\n\n logger.info(logData, 'Request received');\n done();\n });\n });\n\n // preHandler - Log request body (if enabled)\n if (logBody) {\n fastify.addHook('preHandler', (request: FastifyRequest, _reply: FastifyReply, done) => {\n const ctx = request.__requestContext;\n if (!ctx || !request.body) {\n done();\n return;\n }\n\n runInContext(ctx, () => {\n logger.debug(\n {\n correlation_id: ctx.correlationId,\n body: truncateBody(request.body, maxBodySize),\n },\n 'Request body'\n );\n done();\n });\n });\n }\n\n // onSend - Log response body (if enabled)\n if (logResponseBody) {\n fastify.addHook('onSend', (request: FastifyRequest, reply: FastifyReply, payload, done) => {\n const ctx = request.__requestContext;\n if (!ctx) {\n done(null, payload);\n return;\n }\n\n runInContext(ctx, () => {\n logger.debug(\n {\n correlation_id: ctx.correlationId,\n statusCode: reply.statusCode,\n body: truncateBody(payload, maxBodySize),\n },\n 'Response body'\n );\n done(null, payload);\n });\n });\n }\n\n // onResponse - End span, record metrics\n fastify.addHook('onResponse', (request: FastifyRequest, reply: FastifyReply, done) => {\n const ctx = request.__requestContext;\n const span = request.__span;\n if (!ctx) {\n done();\n return;\n }\n\n const durationMs = Date.now() - ctx.startTime;\n const route = request.routeOptions?.url || request.url;\n const labels = { method: request.method, route, status_code: String(reply.statusCode) };\n\n runInContext(ctx, () => {\n logger.info(\n {\n correlation_id: ctx.correlationId,\n method: request.method,\n statusCode: reply.statusCode,\n durationMs,\n },\n 'Request completed'\n );\n\n if (metricsEnabled) {\n requestCounter.add(1, labels);\n requestDuration.record(durationMs, labels);\n if (reply.statusCode >= 400) requestErrors.add(1, labels);\n }\n\n if (span) {\n span.setStatus({\n code: reply.statusCode < 400 ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n });\n span.setAttribute('http.status_code', reply.statusCode);\n span.setAttribute('http.response_time_ms', durationMs);\n span.end();\n }\n\n done();\n });\n });\n\n // onError - Record exception on span\n fastify.addHook(\n 'onError',\n (request: FastifyRequest, _reply: FastifyReply, error: Error, done) => {\n const ctx = request.__requestContext;\n const span = request.__span;\n if (!ctx) {\n done();\n return;\n }\n\n runInContext(ctx, () => {\n logger.error(\n {\n correlation_id: ctx.correlationId,\n method: request.method,\n url: request.url,\n error: error.message,\n },\n 'Request failed'\n );\n\n if (span) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n }\n\n done();\n });\n }\n );\n };\n\n return fp(plugin, { name: 'neoiq-observability', fastify: '>=4.x' });\n}\n","/**\n * HTTP Client with Observability\n */\n\nimport axios from 'axios';\nimport type {\n AxiosInstance,\n AxiosRequestConfig,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\nimport axiosRetry, { IAxiosRetryConfig } from 'axios-retry';\nimport CircuitBreaker from 'opossum';\nimport { context, propagation } from '@opentelemetry/api';\nimport type { FoundationInstance } from '../foundation';\nimport { getGlobalLogger, type Logger } from '../features/logging';\nimport { getMeter } from '../features/metrics';\n\nexport interface HttpClientOptions {\n baseURL: string;\n serviceName: string;\n timeout?: number;\n retry?: {\n retries?: number;\n retryDelay?: number;\n retryStatusCodes?: number[];\n };\n circuitBreaker?: {\n enabled?: boolean;\n resetTimeout?: number;\n errorThresholdPercentage?: number;\n };\n headers?: Record<string, string>;\n foundation?: FoundationInstance;\n}\n\nexport type HttpClient = AxiosInstance;\n\n/** Create a configured HTTP client with full observability */\nexport function createHttpClient(options: HttpClientOptions): HttpClient {\n const {\n baseURL,\n serviceName,\n timeout = 30000,\n retry = {},\n circuitBreaker: cbOptions = {},\n headers = {},\n foundation,\n } = options;\n\n const logger: Logger = foundation?.logger || getGlobalLogger();\n const getContext = () => foundation?.context.getContext();\n const metricsEnabled = foundation?.features.metrics ?? true;\n const tracingEnabled = foundation?.features.tracing ?? true;\n\n const client = axios.create({\n baseURL,\n timeout,\n headers: { 'Content-Type': 'application/json', ...headers },\n });\n\n // Metrics\n let requestCounter: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null = null;\n let requestDuration: ReturnType<ReturnType<typeof getMeter>['createHistogram']> | null = null;\n let requestErrors: ReturnType<ReturnType<typeof getMeter>['createCounter']> | null = null;\n\n if (metricsEnabled) {\n const meter = getMeter(`http-client-${serviceName}`);\n requestCounter = meter.createCounter('http.client.requests.total');\n requestDuration = meter.createHistogram('http.client.request.duration', { unit: 'ms' });\n requestErrors = meter.createCounter('http.client.requests.errors');\n }\n\n // Request interceptor - Add trace context\n client.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n if (tracingEnabled) {\n const carrier: Record<string, string> = {};\n propagation.inject(context.active(), carrier);\n if (carrier.traceparent) config.headers.set('traceparent', carrier.traceparent);\n if (carrier.tracestate) config.headers.set('tracestate', carrier.tracestate);\n }\n\n const reqCtx = getContext();\n if (reqCtx?.correlationId) config.headers.set('x-request-id', reqCtx.correlationId);\n\n (config as InternalAxiosRequestConfig & { __startTime: number }).__startTime = Date.now();\n\n logger.debug(\n {\n method: config.method?.toUpperCase(),\n url: `${config.baseURL || ''}${config.url}`,\n targetService: serviceName,\n },\n 'Outbound HTTP request'\n );\n\n return config;\n });\n\n // Response interceptor - Log and record metrics\n client.interceptors.response.use(\n (response: AxiosResponse) => {\n const config = response.config as InternalAxiosRequestConfig & { __startTime?: number };\n const durationMs = Date.now() - (config.__startTime || Date.now());\n const labels = {\n target_service: serviceName,\n method: config.method?.toUpperCase() || 'GET',\n status_code: String(response.status),\n };\n\n logger.debug(\n {\n method: config.method?.toUpperCase(),\n statusCode: response.status,\n durationMs,\n targetService: serviceName,\n },\n 'Outbound HTTP response'\n );\n\n if (metricsEnabled) {\n requestCounter?.add(1, labels);\n requestDuration?.record(durationMs, labels);\n }\n\n return response;\n },\n (error) => {\n const config = error.config as\n | (InternalAxiosRequestConfig & { __startTime?: number })\n | undefined;\n const durationMs = config ? Date.now() - (config.__startTime || Date.now()) : 0;\n const statusCode = error.response?.status || 0;\n const labels = {\n target_service: serviceName,\n method: config?.method?.toUpperCase() || 'GET',\n status_code: String(statusCode),\n };\n\n logger.error(\n {\n method: config?.method?.toUpperCase(),\n statusCode,\n durationMs,\n error: error.message,\n targetService: serviceName,\n },\n 'Outbound HTTP error'\n );\n\n if (metricsEnabled) {\n requestCounter?.add(1, labels);\n requestDuration?.record(durationMs, labels);\n requestErrors?.add(1, labels);\n }\n\n return Promise.reject(error);\n }\n );\n\n // Retry config\n const retryConfig: IAxiosRetryConfig = {\n retries: retry.retries ?? 3,\n retryDelay: (retryCount) => (retry.retryDelay ?? 1000) * Math.pow(2, retryCount - 1),\n retryCondition: (error) => {\n const retryStatusCodes = retry.retryStatusCodes ?? [408, 429, 500, 502, 503, 504];\n return !error.response || retryStatusCodes.includes(error.response?.status || 0);\n },\n onRetry: (retryCount, error, requestConfig) => {\n logger.warn(\n {\n retryCount,\n url: `${requestConfig.baseURL || ''}${requestConfig.url}`,\n error: error.message,\n },\n 'Retrying request'\n );\n },\n };\n axiosRetry(client, retryConfig);\n\n // Circuit breaker\n if (cbOptions.enabled !== false) {\n const breaker = new CircuitBreaker(\n async (config: AxiosRequestConfig) => client.request(config),\n {\n timeout,\n resetTimeout: cbOptions.resetTimeout ?? 30000,\n errorThresholdPercentage: cbOptions.errorThresholdPercentage ?? 50,\n volumeThreshold: 10,\n }\n );\n breaker.on('open', () => logger.warn({ targetService: serviceName }, 'Circuit breaker OPEN'));\n breaker.on('halfOpen', () =>\n logger.info({ targetService: serviceName }, 'Circuit breaker HALF-OPEN')\n );\n breaker.on('close', () =>\n logger.info({ targetService: serviceName }, 'Circuit breaker CLOSED')\n );\n }\n\n return client;\n}\n\nexport type { AxiosInstance, AxiosRequestConfig, AxiosResponse };\n","/**\n * Foundation - Main Entry Point\n */\n\nimport {\n parseConfig,\n type FoundationConfig,\n type FoundationConfigInput,\n} from './config';\nimport {\n createContextManager,\n type ContextManager,\n type RequestContext,\n} from './features/context';\nimport { createLogger, setGlobalLogger, type Logger } from './features/logging';\nimport {\n setupTracing,\n shutdownTracing,\n getTracer,\n getActiveSpan,\n getTraceContext,\n isTracingEnabled,\n SpanStatusCode,\n type Tracer,\n} from './features/tracing';\nimport {\n setupMetrics,\n shutdownMetrics,\n getMeter,\n isMetricsEnabled,\n type Meter,\n} from './features/metrics';\nimport {\n createObservabilityPlugin,\n type FastifyPluginOptions,\n} from './integrations/fastify-plugin';\nimport {\n createHttpClient as createHttpClientInternal,\n type HttpClientOptions,\n type HttpClient,\n} from './integrations/http-client';\n\n// Health status types\nexport interface HealthStatus {\n status: 'healthy' | 'degraded' | 'unhealthy';\n timestamp: string;\n service: string;\n version: string;\n uptime: number;\n components: {\n tracing: ComponentHealth;\n metrics: ComponentHealth;\n logging: ComponentHealth;\n };\n}\n\nexport interface ComponentHealth {\n enabled: boolean;\n status: 'up' | 'down' | 'disabled';\n message?: string;\n}\n\n// Foundation instance interface\nexport interface FoundationInstance {\n readonly config: FoundationConfig;\n readonly logger: Logger;\n readonly context: ContextManager;\n readonly tracer: Tracer | null;\n readonly meter: Meter | null;\n readonly fastifyPlugin: ReturnType<typeof createObservabilityPlugin>;\n readonly features: { tracing: boolean; metrics: boolean; logging: boolean };\n\n getTracer: (name?: string) => Tracer;\n getMeter: (name: string, version?: string) => Meter;\n getTraceContext: () => { traceId?: string; spanId?: string };\n getActiveSpan: () => ReturnType<typeof getActiveSpan>;\n createHttpClient: (options: Omit<HttpClientOptions, 'foundation'>) => HttpClient;\n shutdown: () => Promise<void>;\n isReady: () => boolean;\n\n // Health check\n health: () => HealthStatus;\n\n // Error boundaries\n trace: <T>(name: string, fn: () => T | Promise<T>) => Promise<T>;\n safeRun: <T>(fn: () => T | Promise<T>, fallback?: T) => Promise<T | undefined>;\n}\n\n/** Create a fully configured observability foundation */\nexport function createFoundation(input: FoundationConfigInput): FoundationInstance {\n const startTime = Date.now();\n const config = parseConfig(input);\n const {\n serviceName,\n serviceVersion,\n environment,\n features: featuresConfig,\n otel,\n logging: loggingConfig,\n requestLogging: requestLoggingConfig,\n } = config;\n\n const features = {\n tracing: featuresConfig.tracing ?? true,\n metrics: featuresConfig.metrics ?? true,\n logging: featuresConfig.logging ?? true,\n };\n\n // Context manager\n const contextManager = createContextManager();\n\n // Logger (always created - has fallback)\n let logger: Logger;\n let loggingError: string | undefined;\n try {\n logger = createLogger({\n serviceName,\n serviceVersion,\n environment,\n level: loggingConfig.level ?? 'info',\n prettyPrint: loggingConfig.prettyPrint ?? environment === 'development',\n contextManager,\n });\n setGlobalLogger(logger);\n } catch (err) {\n loggingError = (err as Error).message;\n // Fallback to console\n logger = {\n debug: (obj, msg) => console.debug(JSON.stringify({ ...obj, msg })),\n info: (obj, msg) => console.info(JSON.stringify({ ...obj, msg })),\n warn: (obj, msg) => console.warn(JSON.stringify({ ...obj, msg })),\n error: (obj, msg) => console.error(JSON.stringify({ ...obj, msg })),\n child: () => logger,\n pino: null as never,\n };\n console.error('[neoiq-foundation] Logger setup failed, using console:', loggingError);\n }\n\n // Tracing (with error boundary)\n let tracerInstance: Tracer | null = null;\n let tracingError: string | undefined;\n if (features.tracing) {\n try {\n setupTracing({\n serviceName,\n serviceVersion,\n environment,\n endpoint: otel.endpoint,\n sampleRate: otel.traceSampleRate,\n autoInstrumentation: featuresConfig.autoInstrumentation,\n });\n tracerInstance = getTracer(serviceName);\n logger.info({ feature: 'tracing', endpoint: otel.endpoint }, 'Tracing enabled');\n } catch (err) {\n tracingError = (err as Error).message;\n logger.error({ error: tracingError }, 'Tracing setup failed - continuing without tracing');\n }\n }\n\n // Metrics (with error boundary)\n let meterInstance: Meter | null = null;\n let metricsError: string | undefined;\n if (features.metrics) {\n try {\n setupMetrics({\n serviceName,\n serviceVersion,\n environment,\n endpoint: otel.endpoint,\n intervalMs: otel.metricsIntervalMs,\n });\n meterInstance = getMeter(serviceName);\n logger.info({ feature: 'metrics', interval: `${otel.metricsIntervalMs}ms` }, 'Metrics enabled');\n } catch (err) {\n metricsError = (err as Error).message;\n logger.error({ error: metricsError }, 'Metrics setup failed - continuing without metrics');\n }\n }\n\n logger.info({ serviceName, serviceVersion, environment, features }, 'Foundation initialized');\n\n const foundation: FoundationInstance = {\n config,\n logger,\n context: contextManager,\n tracer: tracerInstance,\n meter: meterInstance,\n features,\n\n getTracer: (name?: string) => getTracer(name || serviceName),\n getMeter: (name: string, version?: string) => getMeter(name, version),\n getTraceContext,\n getActiveSpan,\n\n fastifyPlugin: createObservabilityPlugin({\n serviceName,\n logger,\n contextManager,\n tracingEnabled: features.tracing && !tracingError,\n metricsEnabled: features.metrics && !metricsError,\n requestLogging: requestLoggingConfig,\n }),\n\n createHttpClient: (options) => createHttpClientInternal({ ...options, foundation }),\n\n shutdown: async () => {\n logger.info({}, 'Shutting down foundation...');\n const promises: Promise<void>[] = [];\n if (features.tracing && isTracingEnabled()) promises.push(shutdownTracing());\n if (features.metrics && isMetricsEnabled()) promises.push(shutdownMetrics());\n await Promise.all(promises);\n logger.info({}, 'Foundation shutdown complete');\n },\n\n isReady: () => {\n if (features.tracing && !tracingError && !isTracingEnabled()) return false;\n if (features.metrics && !metricsError && !isMetricsEnabled()) return false;\n return true;\n },\n\n // Health check\n health: (): HealthStatus => {\n const tracingUp = !features.tracing || (!tracingError && isTracingEnabled());\n const metricsUp = !features.metrics || (!metricsError && isMetricsEnabled());\n const loggingUp = !loggingError;\n\n const allUp = tracingUp && metricsUp && loggingUp;\n const anyDown =\n (features.tracing && tracingError) ||\n (features.metrics && metricsError) ||\n loggingError;\n\n return {\n status: allUp ? 'healthy' : anyDown ? 'degraded' : 'unhealthy',\n timestamp: new Date().toISOString(),\n service: serviceName,\n version: serviceVersion,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n components: {\n tracing: {\n enabled: features.tracing,\n status: !features.tracing ? 'disabled' : tracingError ? 'down' : 'up',\n message: tracingError,\n },\n metrics: {\n enabled: features.metrics,\n status: !features.metrics ? 'disabled' : metricsError ? 'down' : 'up',\n message: metricsError,\n },\n logging: {\n enabled: features.logging,\n status: loggingError ? 'down' : 'up',\n message: loggingError,\n },\n },\n };\n },\n\n // Trace: Run code within a span (Datadog-style)\n trace: async <T>(name: string, fn: () => T | Promise<T>): Promise<T> => {\n const tracer = tracerInstance || getTracer(serviceName);\n\n return new Promise((resolve, reject) => {\n tracer.startActiveSpan(name, async (span) => {\n try {\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n resolve(result);\n } catch (err) {\n const error = err as Error;\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n logger.error({ span: name, error: error.message }, 'Span failed');\n reject(error);\n }\n });\n });\n },\n\n // Safe run: Execute with try-catch, return fallback on error\n safeRun: async <T>(fn: () => T | Promise<T>, fallback?: T): Promise<T | undefined> => {\n try {\n return await fn();\n } catch (err) {\n const error = err as Error;\n logger.error({ error: error.message, stack: error.stack }, 'safeRun caught error');\n return fallback;\n }\n },\n };\n\n return foundation;\n}\n\n/** Alias for createFoundation */\nexport const setupObservability = createFoundation;\n\nexport { SpanStatusCode };\nexport type { FoundationConfig, FoundationConfigInput };\nexport type { Logger };\nexport type { ContextManager, RequestContext };\nexport type { Tracer, Meter };\nexport type { FastifyPluginOptions };\nexport type { HttpClientOptions, HttpClient };\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciq-dev/neoiq-foundation-node",
3
- "version": "1.0.1-beta.0",
3
+ "version": "1.0.1-beta.1",
4
4
  "description": "Node.js observability foundation for CommerceIQ services. Integrates with Groundcover via OpenTelemetry.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",