@observantic/sdk 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +12 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/package.json +70 -70
package/dist/index.cjs
CHANGED
|
@@ -287,7 +287,7 @@ function initObservantic(options = {}) {
|
|
|
287
287
|
import_api2.diag.setLogger(new import_api2.DiagConsoleLogger(), import_api2.DiagLogLevel.DEBUG);
|
|
288
288
|
}
|
|
289
289
|
if (config.disabled) {
|
|
290
|
-
import_api2.diag.info("[@observantic/
|
|
290
|
+
import_api2.diag.info("[@observantic/sdk] Telemetry is disabled via configuration.");
|
|
291
291
|
return {
|
|
292
292
|
sdk: null,
|
|
293
293
|
config,
|
|
@@ -300,11 +300,13 @@ function initObservantic(options = {}) {
|
|
|
300
300
|
}
|
|
301
301
|
if (!config.apiKey) {
|
|
302
302
|
console.warn(
|
|
303
|
-
"[@observantic/
|
|
303
|
+
"[@observantic/sdk] Warning: No apiKey provided. Please provide an apiKey in initObservantic({ apiKey }) or set the OBSERVANTIC_API_KEY environment variable."
|
|
304
304
|
);
|
|
305
305
|
}
|
|
306
306
|
if (isInitialized) {
|
|
307
|
-
import_api2.diag.warn(
|
|
307
|
+
import_api2.diag.warn(
|
|
308
|
+
"[@observantic/sdk] initObservantic was called multiple times. Returning existing client."
|
|
309
|
+
);
|
|
308
310
|
return {
|
|
309
311
|
sdk: null,
|
|
310
312
|
config,
|
|
@@ -340,14 +342,19 @@ function initObservantic(options = {}) {
|
|
|
340
342
|
try {
|
|
341
343
|
sdk.start();
|
|
342
344
|
isInitialized = true;
|
|
343
|
-
import_api2.diag.info(
|
|
345
|
+
import_api2.diag.info(
|
|
346
|
+
`[@observantic/sdk] Initialized successfully for service: "${config.serviceName}" [${config.environment}]`
|
|
347
|
+
);
|
|
344
348
|
if (config.autoShutdown) {
|
|
345
349
|
installShutdownHooks(sdk);
|
|
346
350
|
} else {
|
|
347
351
|
registerSdk(sdk);
|
|
348
352
|
}
|
|
349
353
|
} catch (err) {
|
|
350
|
-
import_api2.diag.error(
|
|
354
|
+
import_api2.diag.error(
|
|
355
|
+
"[@observantic/sdk] Failed to start OpenTelemetry NodeSDK:",
|
|
356
|
+
err
|
|
357
|
+
);
|
|
351
358
|
throw err;
|
|
352
359
|
}
|
|
353
360
|
return {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/resource.ts","../src/tracing.ts","../src/metrics.ts","../src/logging.ts","../src/instrumentation.ts","../src/shutdown.ts"],"sourcesContent":["import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport {\n diag,\n DiagConsoleLogger,\n DiagLogLevel,\n trace,\n context,\n metrics,\n SpanStatusCode,\n SpanKind,\n Tracer,\n Meter,\n} from \"@opentelemetry/api\";\nimport { logs, Logger } from \"@opentelemetry/api-logs\";\n\nimport {\n ObservanticOptions,\n ResolvedObservanticConfig,\n resolveConfig,\n normalizeEndpoints,\n} from \"./config.js\";\nimport { createResource } from \"./resource.js\";\nimport {\n createTraceExporter,\n createSpanProcessor,\n createSampler,\n} from \"./tracing.js\";\nimport { createMetricExporter, createMetricReader } from \"./metrics.js\";\nimport { createLogExporter, createLogRecordProcessor } from \"./logging.js\";\nimport { createInstrumentations } from \"./instrumentation.js\";\nimport {\n shutdownObservantic,\n installShutdownHooks,\n registerSdk,\n} from \"./shutdown.js\";\n\nexport interface ObservanticClient {\n sdk: NodeSDK | null;\n config: ResolvedObservanticConfig;\n shutdown: () => Promise<void>;\n getTracer: (name?: string, version?: string) => Tracer;\n getMeter: (name?: string, version?: string) => Meter;\n getLogger: (name?: string, version?: string) => Logger;\n}\n\nlet isInitialized = false;\n\n/**\n * Initializes Observantic OpenTelemetry instrumentation for Node.js and Express.\n *\n * @example\n * ```ts\n * import { initObservantic } from \"@observantic/node\";\n *\n * initObservantic({\n * apiKey: \"cw_live_sec_xxxxx\",\n * endpoint: \"https://api.observantic.com\",\n * serviceName: \"my-express-app\"\n * });\n * ```\n */\nexport function initObservantic(options: ObservanticOptions = {}): ObservanticClient {\n const config = resolveConfig(options);\n\n if (config.debug) {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n\n if (config.disabled) {\n diag.info(\"[@observantic/node] Telemetry is disabled via configuration.\");\n return {\n sdk: null,\n config,\n shutdown: async () => {},\n getTracer: (name = \"observantic\", version = \"1.0.0\") => trace.getTracer(name, version),\n getMeter: (name = \"observantic\", version = \"1.0.0\") => metrics.getMeter(name, version),\n getLogger: (name = \"observantic\", version = \"1.0.0\") => logs.getLogger(name, version),\n };\n }\n\n if (!config.apiKey) {\n console.warn(\n \"[@observantic/node] Warning: No apiKey provided. Please provide an apiKey in initObservantic({ apiKey }) or set the OBSERVANTIC_API_KEY environment variable.\"\n );\n }\n\n if (isInitialized) {\n diag.warn(\"[@observantic/node] initObservantic was called multiple times. Returning existing client.\");\n return {\n sdk: null,\n config,\n shutdown: shutdownObservantic,\n getTracer: (name = \"observantic\", version = \"1.0.0\") => trace.getTracer(name, version),\n getMeter: (name = \"observantic\", version = \"1.0.0\") => metrics.getMeter(name, version),\n getLogger: (name = \"observantic\", version = \"1.0.0\") => logs.getLogger(name, version),\n };\n }\n\n const resource = createResource(config);\n\n const sdkConfig: any = {\n resource,\n instrumentations: createInstrumentations(config),\n };\n\n // Configure Tracing\n if (config.signals.traces) {\n const traceExporter = createTraceExporter(config);\n const spanProcessor = createSpanProcessor(traceExporter, config);\n const sampler = createSampler(config.traceSampleRate);\n\n sdkConfig.spanProcessor = spanProcessor;\n sdkConfig.sampler = sampler;\n }\n\n // Configure Metrics\n if (config.signals.metrics) {\n const metricExporter = createMetricExporter(config);\n const metricReader = createMetricReader(metricExporter, config);\n sdkConfig.metricReader = metricReader;\n }\n\n // Configure Logs\n if (config.signals.logs) {\n const logExporter = createLogExporter(config);\n const logRecordProcessor = createLogRecordProcessor(logExporter, config);\n sdkConfig.logRecordProcessor = logRecordProcessor;\n }\n\n const sdk = new NodeSDK(sdkConfig);\n\n try {\n sdk.start();\n isInitialized = true;\n diag.info(`[@observantic/node] Initialized successfully for service: \"${config.serviceName}\" [${config.environment}]`);\n\n if (config.autoShutdown) {\n installShutdownHooks(sdk);\n } else {\n registerSdk(sdk);\n }\n } catch (err) {\n diag.error(\"[@observantic/node] Failed to start OpenTelemetry NodeSDK:\", err);\n throw err;\n }\n\n return {\n sdk,\n config,\n shutdown: shutdownObservantic,\n getTracer: (name = config.serviceName, version = config.serviceVersion) =>\n trace.getTracer(name, version),\n getMeter: (name = config.serviceName, version = config.serviceVersion) =>\n metrics.getMeter(name, version),\n getLogger: (name = config.serviceName, version = config.serviceVersion) =>\n logs.getLogger(name, version),\n };\n}\n\n// Export lifecycle methods\nexport { shutdownObservantic };\n\n// Export configuration helpers & types\nexport type { ObservanticOptions, ResolvedObservanticConfig };\nexport { resolveConfig, normalizeEndpoints };\n\n// Re-export standard OpenTelemetry APIs for convenience\nexport {\n trace,\n context,\n metrics,\n SpanStatusCode,\n SpanKind,\n};\nexport { logs } from \"@opentelemetry/api-logs\";\n\n","export interface ObservanticOptions {\n /**\n * Ingestion API key for your Observantic workspace.\n * Defaults to process.env.OBSERVANTIC_API_KEY.\n */\n apiKey?: string;\n\n /**\n * Observantic ingestion base endpoint URL.\n * Defaults to process.env.OBSERVANTIC_ENDPOINT or \"https://api.observantic.com\".\n */\n endpoint?: string;\n\n /**\n * Name of your application service.\n * Defaults to process.env.OBSERVANTIC_SERVICE_NAME, process.env.OTEL_SERVICE_NAME,\n * process.env.npm_package_name, or \"node-service\".\n */\n serviceName?: string;\n\n /**\n * Deployment environment (e.g., \"production\", \"staging\", \"development\").\n * Defaults to process.env.OBSERVANTIC_ENVIRONMENT, process.env.NODE_ENV, or \"development\".\n */\n environment?: string;\n\n /**\n * Version of your application.\n * Defaults to process.env.OBSERVANTIC_SERVICE_VERSION, process.env.npm_package_version, or \"1.0.0\".\n */\n serviceVersion?: string;\n\n /**\n * Custom resource attributes to attach to all telemetry (traces, metrics, logs).\n */\n resourceAttributes?: Record<string, string | number | boolean>;\n\n /**\n * Additional HTTP headers to attach to OTLP export requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Disable telemetry collection entirely (useful in test or CI environments).\n * Defaults to process.env.OBSERVANTIC_DISABLED === \"true\".\n */\n disabled?: boolean;\n\n /**\n * Enable verbose OpenTelemetry internal diagnostic logging.\n * Defaults to process.env.OBSERVANTIC_DEBUG === \"true\".\n */\n debug?: boolean;\n\n /**\n * Automatically install graceful shutdown hooks for SIGINT and SIGTERM.\n * Defaults to true.\n */\n autoShutdown?: boolean;\n\n /**\n * Sampling ratio for traces from 0.0 (0%) to 1.0 (100%).\n * Defaults to 1.0.\n */\n traceSampleRate?: number;\n\n /**\n * Batch span export timeout in milliseconds.\n * Defaults to 5000ms.\n */\n batchTimeoutMillis?: number;\n\n /**\n * Maximum queue size for spans and logs waiting to be exported.\n * Defaults to 2048.\n */\n maxQueueSize?: number;\n\n /**\n * Maximum batch size per export request.\n * Defaults to 512.\n */\n maxExportBatchSize?: number;\n\n /**\n * Metrics periodic export interval in milliseconds.\n * Defaults to 60000ms (60s).\n */\n metricExportIntervalMillis?: number;\n\n /**\n * Enable or disable individual telemetry signals.\n */\n signals?: {\n traces?: boolean;\n metrics?: boolean;\n logs?: boolean;\n };\n}\n\nexport interface ResolvedObservanticConfig {\n apiKey: string;\n endpoint: string;\n tracesEndpoint: string;\n metricsEndpoint: string;\n logsEndpoint: string;\n serviceName: string;\n environment: string;\n serviceVersion: string;\n resourceAttributes: Record<string, string | number | boolean>;\n headers: Record<string, string>;\n disabled: boolean;\n debug: boolean;\n autoShutdown: boolean;\n traceSampleRate: number;\n batchTimeoutMillis: number;\n maxQueueSize: number;\n maxExportBatchSize: number;\n metricExportIntervalMillis: number;\n signals: {\n traces: boolean;\n metrics: boolean;\n logs: boolean;\n };\n}\n\n/**\n * Normalizes an endpoint URL and constructs signal-specific paths.\n */\nexport function normalizeEndpoints(baseEndpoint: string) {\n let cleaned = (baseEndpoint || \"https://api.observantic.com\").trim();\n // Strip trailing slashes\n cleaned = cleaned.replace(/\\/+$/, \"\");\n\n // If user passed specific /v1/traces URL directly as endpoint, handle gracefully\n if (cleaned.endsWith(\"/v1/traces\")) {\n const root = cleaned.slice(0, -\"/v1/traces\".length);\n return {\n endpoint: root,\n tracesEndpoint: cleaned,\n metricsEndpoint: `${root}/v1/metrics`,\n logsEndpoint: `${root}/v1/logs`,\n };\n }\n\n // If user passed /v1 at the end\n if (cleaned.endsWith(\"/v1\")) {\n return {\n endpoint: cleaned,\n tracesEndpoint: `${cleaned}/traces`,\n metricsEndpoint: `${cleaned}/metrics`,\n logsEndpoint: `${cleaned}/logs`,\n };\n }\n\n return {\n endpoint: cleaned,\n tracesEndpoint: `${cleaned}/v1/traces`,\n metricsEndpoint: `${cleaned}/v1/metrics`,\n logsEndpoint: `${cleaned}/v1/logs`,\n };\n}\n\n/**\n * Parses comma-delimited key=value headers often used in OTEL_EXPORTER_OTLP_HEADERS.\n */\nexport function parseOtelHeaders(headerStr?: string): Record<string, string> {\n if (!headerStr) return {};\n const headers: Record<string, string> = {};\n const pairs = headerStr.split(\",\");\n for (const pair of pairs) {\n const idx = pair.indexOf(\"=\");\n if (idx > 0) {\n const key = pair.substring(0, idx).trim();\n const val = pair.substring(idx + 1).trim();\n if (key) headers[key] = val;\n }\n }\n return headers;\n}\n\n/**\n * Resolves user options with environment variables and sensible defaults.\n */\nexport function resolveConfig(options: ObservanticOptions = {}): ResolvedObservanticConfig {\n const env = process.env;\n\n const apiKey =\n options.apiKey ||\n env.OBSERVANTIC_API_KEY ||\n \"\";\n\n const rawEndpoint =\n options.endpoint ||\n env.OBSERVANTIC_ENDPOINT ||\n env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n \"https://api.observantic.com\";\n\n const { endpoint, tracesEndpoint, metricsEndpoint, logsEndpoint } = normalizeEndpoints(rawEndpoint);\n\n const serviceName =\n options.serviceName ||\n env.OBSERVANTIC_SERVICE_NAME ||\n env.OTEL_SERVICE_NAME ||\n env.npm_package_name ||\n process.title ||\n \"node-service\";\n\n const environment =\n options.environment ||\n env.OBSERVANTIC_ENVIRONMENT ||\n env.NODE_ENV ||\n \"development\";\n\n const serviceVersion =\n options.serviceVersion ||\n env.OBSERVANTIC_SERVICE_VERSION ||\n env.npm_package_version ||\n \"1.0.0\";\n\n const disabled =\n options.disabled !== undefined\n ? options.disabled\n : env.OBSERVANTIC_DISABLED === \"true\" || env.OTEL_SDK_DISABLED === \"true\";\n\n const debug =\n options.debug !== undefined\n ? options.debug\n : env.OBSERVANTIC_DEBUG === \"true\" || env.OTEL_LOG_LEVEL === \"debug\";\n\n const autoShutdown = options.autoShutdown !== undefined ? options.autoShutdown : true;\n\n const traceSampleRate =\n options.traceSampleRate !== undefined\n ? Math.max(0, Math.min(1, options.traceSampleRate))\n : env.OBSERVANTIC_TRACE_SAMPLE_RATE\n ? parseFloat(env.OBSERVANTIC_TRACE_SAMPLE_RATE)\n : 1.0;\n\n // Build headers with authentication for Observantic\n const envHeaders = parseOtelHeaders(env.OTEL_EXPORTER_OTLP_HEADERS);\n const headers: Record<string, string> = {\n ...envHeaders,\n ...(options.headers || {}),\n };\n\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n headers[\"x-cw-token\"] = apiKey;\n }\n\n return {\n apiKey,\n endpoint,\n tracesEndpoint,\n metricsEndpoint,\n logsEndpoint,\n serviceName,\n environment,\n serviceVersion,\n resourceAttributes: options.resourceAttributes || {},\n headers,\n disabled,\n debug,\n autoShutdown,\n traceSampleRate,\n batchTimeoutMillis: options.batchTimeoutMillis || 5000,\n maxQueueSize: options.maxQueueSize || 2048,\n maxExportBatchSize: options.maxExportBatchSize || 512,\n metricExportIntervalMillis: options.metricExportIntervalMillis || 60000,\n signals: {\n traces: options.signals?.traces !== false,\n metrics: options.signals?.metrics !== false,\n logs: options.signals?.logs !== false,\n },\n };\n}\n\n","import { Resource } from \"@opentelemetry/resources\";\nimport {\n SEMRESATTRS_SERVICE_NAME,\n SEMRESATTRS_SERVICE_VERSION,\n SEMRESATTRS_DEPLOYMENT_ENVIRONMENT,\n SEMRESATTRS_TELEMETRY_SDK_NAME,\n SEMRESATTRS_TELEMETRY_SDK_LANGUAGE,\n SEMRESATTRS_TELEMETRY_SDK_VERSION,\n SEMRESATTRS_PROCESS_PID,\n SEMRESATTRS_PROCESS_RUNTIME_NAME,\n SEMRESATTRS_PROCESS_RUNTIME_VERSION,\n} from \"@opentelemetry/semantic-conventions\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\n/**\n * Builds OpenTelemetry Resource with standard semantic conventions and custom attributes.\n */\nexport function createResource(config: ResolvedObservanticConfig): Resource {\n const customAttributes: Record<string, string | number | boolean> = {\n [SEMRESATTRS_SERVICE_NAME]: config.serviceName,\n [SEMRESATTRS_SERVICE_VERSION]: config.serviceVersion,\n [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: config.environment,\n [SEMRESATTRS_TELEMETRY_SDK_NAME]: \"@observantic/sdk\",\n [SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]: \"nodejs\",\n [SEMRESATTRS_TELEMETRY_SDK_VERSION]: \"1.0.0\",\n [SEMRESATTRS_PROCESS_PID]: process.pid,\n [SEMRESATTRS_PROCESS_RUNTIME_NAME]: \"nodejs\",\n [SEMRESATTRS_PROCESS_RUNTIME_VERSION]: process.version,\n ...config.resourceAttributes,\n };\n\n return new Resource(customAttributes);\n}\n\n","import { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport {\n BatchSpanProcessor,\n ParentBasedSampler,\n TraceIdRatioBasedSampler,\n AlwaysOnSampler,\n AlwaysOffSampler,\n Sampler,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createTraceExporter(config: ResolvedObservanticConfig): OTLPTraceExporter {\n return new OTLPTraceExporter({\n url: config.tracesEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n });\n}\n\nexport function createSampler(sampleRate: number): Sampler {\n if (sampleRate >= 1.0) {\n return new ParentBasedSampler({ root: new AlwaysOnSampler() });\n }\n if (sampleRate <= 0.0) {\n return new ParentBasedSampler({ root: new AlwaysOffSampler() });\n }\n return new ParentBasedSampler({\n root: new TraceIdRatioBasedSampler(sampleRate),\n });\n}\n\nexport function createSpanProcessor(\n exporter: OTLPTraceExporter,\n config: ResolvedObservanticConfig\n): SpanProcessor {\n return new BatchSpanProcessor(exporter, {\n maxQueueSize: config.maxQueueSize,\n maxExportBatchSize: config.maxExportBatchSize,\n scheduledDelayMillis: config.batchTimeoutMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { OTLPMetricExporter } from \"@opentelemetry/exporter-metrics-otlp-http\";\nimport {\n PeriodicExportingMetricReader,\n MetricReader,\n AggregationTemporality,\n} from \"@opentelemetry/sdk-metrics\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createMetricExporter(config: ResolvedObservanticConfig): OTLPMetricExporter {\n return new OTLPMetricExporter({\n url: config.metricsEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n temporalityPreference: AggregationTemporality.DELTA,\n });\n}\n\nexport function createMetricReader(\n exporter: OTLPMetricExporter,\n config: ResolvedObservanticConfig\n): MetricReader {\n return new PeriodicExportingMetricReader({\n exporter,\n exportIntervalMillis: config.metricExportIntervalMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\nimport { BatchLogRecordProcessor, LogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createLogExporter(config: ResolvedObservanticConfig): OTLPLogExporter {\n return new OTLPLogExporter({\n url: config.logsEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n });\n}\n\nexport function createLogRecordProcessor(\n exporter: OTLPLogExporter,\n config: ResolvedObservanticConfig\n): LogRecordProcessor {\n return new BatchLogRecordProcessor(exporter, {\n maxQueueSize: config.maxQueueSize,\n maxExportBatchSize: config.maxExportBatchSize,\n scheduledDelayMillis: config.batchTimeoutMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { getNodeAutoInstrumentations } from \"@opentelemetry/auto-instrumentations-node\";\nimport { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\n/**\n * Configures auto-instrumentations with production defaults for Node.js and Express.\n */\nexport function createInstrumentations(\n _config: ResolvedObservanticConfig\n): (Instrumentation | Instrumentation[])[] {\n return [\n getNodeAutoInstrumentations({\n \"@opentelemetry/instrumentation-fs\": {\n // Disable noisy fs hooks by default to prevent span flooding\n enabled: false,\n },\n \"@opentelemetry/instrumentation-http\": {\n enabled: true,\n },\n \"@opentelemetry/instrumentation-express\": {\n enabled: true,\n },\n }),\n ];\n}\n\n","import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { diag } from \"@opentelemetry/api\";\n\nlet activeSdk: NodeSDK | null = null;\nlet isShuttingDown = false;\nlet isSignalHandlerRegistered = false;\n\n/**\n * Registers the active NodeSDK instance for lifecycle management.\n */\nexport function registerSdk(sdk: NodeSDK): void {\n activeSdk = sdk;\n}\n\n/**\n * Gracefully shuts down the Observantic OpenTelemetry SDK and flushes pending telemetry.\n */\nexport async function shutdownObservantic(): Promise<void> {\n if (!activeSdk) {\n return;\n }\n\n if (isShuttingDown) {\n return;\n }\n\n isShuttingDown = true;\n diag.info(\"Shutting down Observantic OpenTelemetry SDK...\");\n\n try {\n await activeSdk.shutdown();\n diag.info(\"Observantic OpenTelemetry SDK terminated successfully.\");\n } catch (err) {\n diag.error(\"Error shutting down Observantic OpenTelemetry SDK\", err);\n throw err;\n } finally {\n activeSdk = null;\n isShuttingDown = false;\n }\n}\n\n/**\n * Installs graceful process shutdown listeners for SIGINT and SIGTERM.\n */\nexport function installShutdownHooks(sdk: NodeSDK): void {\n registerSdk(sdk);\n\n if (isSignalHandlerRegistered) {\n return;\n }\n\n const handleSignal = async (signal: string) => {\n diag.info(`Received ${signal}, gracefully shutting down Observantic telemetry...`);\n try {\n await shutdownObservantic();\n } catch (err) {\n diag.error(`Failed to flush telemetry on ${signal}:`, err);\n }\n };\n\n process.once(\"SIGTERM\", () => void handleSignal(\"SIGTERM\"));\n process.once(\"SIGINT\", () => void handleSignal(\"SIGINT\"));\n\n isSignalHandlerRegistered = true;\n}\n\n"],"mappings":"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","names":["import_api","import_api_logs"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/resource.ts","../src/tracing.ts","../src/metrics.ts","../src/logging.ts","../src/instrumentation.ts","../src/shutdown.ts"],"sourcesContent":["import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport {\n diag,\n DiagConsoleLogger,\n DiagLogLevel,\n trace,\n context,\n metrics,\n SpanStatusCode,\n SpanKind,\n Tracer,\n Meter,\n} from \"@opentelemetry/api\";\nimport { logs, Logger } from \"@opentelemetry/api-logs\";\n\nimport {\n ObservanticOptions,\n ResolvedObservanticConfig,\n resolveConfig,\n normalizeEndpoints,\n} from \"./config.js\";\nimport { createResource } from \"./resource.js\";\nimport {\n createTraceExporter,\n createSpanProcessor,\n createSampler,\n} from \"./tracing.js\";\nimport { createMetricExporter, createMetricReader } from \"./metrics.js\";\nimport { createLogExporter, createLogRecordProcessor } from \"./logging.js\";\nimport { createInstrumentations } from \"./instrumentation.js\";\nimport {\n shutdownObservantic,\n installShutdownHooks,\n registerSdk,\n} from \"./shutdown.js\";\n\nexport interface ObservanticClient {\n sdk: NodeSDK | null;\n config: ResolvedObservanticConfig;\n shutdown: () => Promise<void>;\n getTracer: (name?: string, version?: string) => Tracer;\n getMeter: (name?: string, version?: string) => Meter;\n getLogger: (name?: string, version?: string) => Logger;\n}\n\nlet isInitialized = false;\n\n/**\n * Initializes Observantic OpenTelemetry instrumentation for Node.js and Express.\n *\n * @example\n * ```ts\n * import { initObservantic } from \"@observantic/sdk\";\n *\n * initObservantic({\n * apiKey: \"cw_live_sec_xxxxx\",\n * endpoint: \"https://api.observantic.com\",\n * serviceName: \"my-express-app\"\n * });\n * ```\n */\nexport function initObservantic(\n options: ObservanticOptions = {},\n): ObservanticClient {\n const config = resolveConfig(options);\n\n if (config.debug) {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n\n if (config.disabled) {\n diag.info(\"[@observantic/sdk] Telemetry is disabled via configuration.\");\n return {\n sdk: null,\n config,\n shutdown: async () => {},\n getTracer: (name = \"observantic\", version = \"1.0.0\") =>\n trace.getTracer(name, version),\n getMeter: (name = \"observantic\", version = \"1.0.0\") =>\n metrics.getMeter(name, version),\n getLogger: (name = \"observantic\", version = \"1.0.0\") =>\n logs.getLogger(name, version),\n };\n }\n\n if (!config.apiKey) {\n console.warn(\n \"[@observantic/sdk] Warning: No apiKey provided. Please provide an apiKey in initObservantic({ apiKey }) or set the OBSERVANTIC_API_KEY environment variable.\",\n );\n }\n\n if (isInitialized) {\n diag.warn(\n \"[@observantic/sdk] initObservantic was called multiple times. Returning existing client.\",\n );\n return {\n sdk: null,\n config,\n shutdown: shutdownObservantic,\n getTracer: (name = \"observantic\", version = \"1.0.0\") =>\n trace.getTracer(name, version),\n getMeter: (name = \"observantic\", version = \"1.0.0\") =>\n metrics.getMeter(name, version),\n getLogger: (name = \"observantic\", version = \"1.0.0\") =>\n logs.getLogger(name, version),\n };\n }\n\n const resource = createResource(config);\n\n const sdkConfig: any = {\n resource,\n instrumentations: createInstrumentations(config),\n };\n\n // Configure Tracing\n if (config.signals.traces) {\n const traceExporter = createTraceExporter(config);\n const spanProcessor = createSpanProcessor(traceExporter, config);\n const sampler = createSampler(config.traceSampleRate);\n\n sdkConfig.spanProcessor = spanProcessor;\n sdkConfig.sampler = sampler;\n }\n\n // Configure Metrics\n if (config.signals.metrics) {\n const metricExporter = createMetricExporter(config);\n const metricReader = createMetricReader(metricExporter, config);\n sdkConfig.metricReader = metricReader;\n }\n\n // Configure Logs\n if (config.signals.logs) {\n const logExporter = createLogExporter(config);\n const logRecordProcessor = createLogRecordProcessor(logExporter, config);\n sdkConfig.logRecordProcessor = logRecordProcessor;\n }\n\n const sdk = new NodeSDK(sdkConfig);\n\n try {\n sdk.start();\n isInitialized = true;\n diag.info(\n `[@observantic/sdk] Initialized successfully for service: \"${config.serviceName}\" [${config.environment}]`,\n );\n\n if (config.autoShutdown) {\n installShutdownHooks(sdk);\n } else {\n registerSdk(sdk);\n }\n } catch (err) {\n diag.error(\n \"[@observantic/sdk] Failed to start OpenTelemetry NodeSDK:\",\n err,\n );\n throw err;\n }\n\n return {\n sdk,\n config,\n shutdown: shutdownObservantic,\n getTracer: (name = config.serviceName, version = config.serviceVersion) =>\n trace.getTracer(name, version),\n getMeter: (name = config.serviceName, version = config.serviceVersion) =>\n metrics.getMeter(name, version),\n getLogger: (name = config.serviceName, version = config.serviceVersion) =>\n logs.getLogger(name, version),\n };\n}\n\n// Export lifecycle methods\nexport { shutdownObservantic };\n\n// Export configuration helpers & types\nexport type { ObservanticOptions, ResolvedObservanticConfig };\nexport { resolveConfig, normalizeEndpoints };\n\n// Re-export standard OpenTelemetry APIs for convenience\nexport { trace, context, metrics, SpanStatusCode, SpanKind };\nexport { logs } from \"@opentelemetry/api-logs\";\n","export interface ObservanticOptions {\n /**\n * Ingestion API key for your Observantic workspace.\n * Defaults to process.env.OBSERVANTIC_API_KEY.\n */\n apiKey?: string;\n\n /**\n * Observantic ingestion base endpoint URL.\n * Defaults to process.env.OBSERVANTIC_ENDPOINT or \"https://api.observantic.com\".\n */\n endpoint?: string;\n\n /**\n * Name of your application service.\n * Defaults to process.env.OBSERVANTIC_SERVICE_NAME, process.env.OTEL_SERVICE_NAME,\n * process.env.npm_package_name, or \"node-service\".\n */\n serviceName?: string;\n\n /**\n * Deployment environment (e.g., \"production\", \"staging\", \"development\").\n * Defaults to process.env.OBSERVANTIC_ENVIRONMENT, process.env.NODE_ENV, or \"development\".\n */\n environment?: string;\n\n /**\n * Version of your application.\n * Defaults to process.env.OBSERVANTIC_SERVICE_VERSION, process.env.npm_package_version, or \"1.0.0\".\n */\n serviceVersion?: string;\n\n /**\n * Custom resource attributes to attach to all telemetry (traces, metrics, logs).\n */\n resourceAttributes?: Record<string, string | number | boolean>;\n\n /**\n * Additional HTTP headers to attach to OTLP export requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Disable telemetry collection entirely (useful in test or CI environments).\n * Defaults to process.env.OBSERVANTIC_DISABLED === \"true\".\n */\n disabled?: boolean;\n\n /**\n * Enable verbose OpenTelemetry internal diagnostic logging.\n * Defaults to process.env.OBSERVANTIC_DEBUG === \"true\".\n */\n debug?: boolean;\n\n /**\n * Automatically install graceful shutdown hooks for SIGINT and SIGTERM.\n * Defaults to true.\n */\n autoShutdown?: boolean;\n\n /**\n * Sampling ratio for traces from 0.0 (0%) to 1.0 (100%).\n * Defaults to 1.0.\n */\n traceSampleRate?: number;\n\n /**\n * Batch span export timeout in milliseconds.\n * Defaults to 5000ms.\n */\n batchTimeoutMillis?: number;\n\n /**\n * Maximum queue size for spans and logs waiting to be exported.\n * Defaults to 2048.\n */\n maxQueueSize?: number;\n\n /**\n * Maximum batch size per export request.\n * Defaults to 512.\n */\n maxExportBatchSize?: number;\n\n /**\n * Metrics periodic export interval in milliseconds.\n * Defaults to 60000ms (60s).\n */\n metricExportIntervalMillis?: number;\n\n /**\n * Enable or disable individual telemetry signals.\n */\n signals?: {\n traces?: boolean;\n metrics?: boolean;\n logs?: boolean;\n };\n}\n\nexport interface ResolvedObservanticConfig {\n apiKey: string;\n endpoint: string;\n tracesEndpoint: string;\n metricsEndpoint: string;\n logsEndpoint: string;\n serviceName: string;\n environment: string;\n serviceVersion: string;\n resourceAttributes: Record<string, string | number | boolean>;\n headers: Record<string, string>;\n disabled: boolean;\n debug: boolean;\n autoShutdown: boolean;\n traceSampleRate: number;\n batchTimeoutMillis: number;\n maxQueueSize: number;\n maxExportBatchSize: number;\n metricExportIntervalMillis: number;\n signals: {\n traces: boolean;\n metrics: boolean;\n logs: boolean;\n };\n}\n\n/**\n * Normalizes an endpoint URL and constructs signal-specific paths.\n */\nexport function normalizeEndpoints(baseEndpoint: string) {\n let cleaned = (baseEndpoint || \"https://api.observantic.com\").trim();\n // Strip trailing slashes\n cleaned = cleaned.replace(/\\/+$/, \"\");\n\n // If user passed specific /v1/traces URL directly as endpoint, handle gracefully\n if (cleaned.endsWith(\"/v1/traces\")) {\n const root = cleaned.slice(0, -\"/v1/traces\".length);\n return {\n endpoint: root,\n tracesEndpoint: cleaned,\n metricsEndpoint: `${root}/v1/metrics`,\n logsEndpoint: `${root}/v1/logs`,\n };\n }\n\n // If user passed /v1 at the end\n if (cleaned.endsWith(\"/v1\")) {\n return {\n endpoint: cleaned,\n tracesEndpoint: `${cleaned}/traces`,\n metricsEndpoint: `${cleaned}/metrics`,\n logsEndpoint: `${cleaned}/logs`,\n };\n }\n\n return {\n endpoint: cleaned,\n tracesEndpoint: `${cleaned}/v1/traces`,\n metricsEndpoint: `${cleaned}/v1/metrics`,\n logsEndpoint: `${cleaned}/v1/logs`,\n };\n}\n\n/**\n * Parses comma-delimited key=value headers often used in OTEL_EXPORTER_OTLP_HEADERS.\n */\nexport function parseOtelHeaders(headerStr?: string): Record<string, string> {\n if (!headerStr) return {};\n const headers: Record<string, string> = {};\n const pairs = headerStr.split(\",\");\n for (const pair of pairs) {\n const idx = pair.indexOf(\"=\");\n if (idx > 0) {\n const key = pair.substring(0, idx).trim();\n const val = pair.substring(idx + 1).trim();\n if (key) headers[key] = val;\n }\n }\n return headers;\n}\n\n/**\n * Resolves user options with environment variables and sensible defaults.\n */\nexport function resolveConfig(options: ObservanticOptions = {}): ResolvedObservanticConfig {\n const env = process.env;\n\n const apiKey =\n options.apiKey ||\n env.OBSERVANTIC_API_KEY ||\n \"\";\n\n const rawEndpoint =\n options.endpoint ||\n env.OBSERVANTIC_ENDPOINT ||\n env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n \"https://api.observantic.com\";\n\n const { endpoint, tracesEndpoint, metricsEndpoint, logsEndpoint } = normalizeEndpoints(rawEndpoint);\n\n const serviceName =\n options.serviceName ||\n env.OBSERVANTIC_SERVICE_NAME ||\n env.OTEL_SERVICE_NAME ||\n env.npm_package_name ||\n process.title ||\n \"node-service\";\n\n const environment =\n options.environment ||\n env.OBSERVANTIC_ENVIRONMENT ||\n env.NODE_ENV ||\n \"development\";\n\n const serviceVersion =\n options.serviceVersion ||\n env.OBSERVANTIC_SERVICE_VERSION ||\n env.npm_package_version ||\n \"1.0.0\";\n\n const disabled =\n options.disabled !== undefined\n ? options.disabled\n : env.OBSERVANTIC_DISABLED === \"true\" || env.OTEL_SDK_DISABLED === \"true\";\n\n const debug =\n options.debug !== undefined\n ? options.debug\n : env.OBSERVANTIC_DEBUG === \"true\" || env.OTEL_LOG_LEVEL === \"debug\";\n\n const autoShutdown = options.autoShutdown !== undefined ? options.autoShutdown : true;\n\n const traceSampleRate =\n options.traceSampleRate !== undefined\n ? Math.max(0, Math.min(1, options.traceSampleRate))\n : env.OBSERVANTIC_TRACE_SAMPLE_RATE\n ? parseFloat(env.OBSERVANTIC_TRACE_SAMPLE_RATE)\n : 1.0;\n\n // Build headers with authentication for Observantic\n const envHeaders = parseOtelHeaders(env.OTEL_EXPORTER_OTLP_HEADERS);\n const headers: Record<string, string> = {\n ...envHeaders,\n ...(options.headers || {}),\n };\n\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n headers[\"x-cw-token\"] = apiKey;\n }\n\n return {\n apiKey,\n endpoint,\n tracesEndpoint,\n metricsEndpoint,\n logsEndpoint,\n serviceName,\n environment,\n serviceVersion,\n resourceAttributes: options.resourceAttributes || {},\n headers,\n disabled,\n debug,\n autoShutdown,\n traceSampleRate,\n batchTimeoutMillis: options.batchTimeoutMillis || 5000,\n maxQueueSize: options.maxQueueSize || 2048,\n maxExportBatchSize: options.maxExportBatchSize || 512,\n metricExportIntervalMillis: options.metricExportIntervalMillis || 60000,\n signals: {\n traces: options.signals?.traces !== false,\n metrics: options.signals?.metrics !== false,\n logs: options.signals?.logs !== false,\n },\n };\n}\n\n","import { Resource } from \"@opentelemetry/resources\";\nimport {\n SEMRESATTRS_SERVICE_NAME,\n SEMRESATTRS_SERVICE_VERSION,\n SEMRESATTRS_DEPLOYMENT_ENVIRONMENT,\n SEMRESATTRS_TELEMETRY_SDK_NAME,\n SEMRESATTRS_TELEMETRY_SDK_LANGUAGE,\n SEMRESATTRS_TELEMETRY_SDK_VERSION,\n SEMRESATTRS_PROCESS_PID,\n SEMRESATTRS_PROCESS_RUNTIME_NAME,\n SEMRESATTRS_PROCESS_RUNTIME_VERSION,\n} from \"@opentelemetry/semantic-conventions\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\n/**\n * Builds OpenTelemetry Resource with standard semantic conventions and custom attributes.\n */\nexport function createResource(config: ResolvedObservanticConfig): Resource {\n const customAttributes: Record<string, string | number | boolean> = {\n [SEMRESATTRS_SERVICE_NAME]: config.serviceName,\n [SEMRESATTRS_SERVICE_VERSION]: config.serviceVersion,\n [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: config.environment,\n [SEMRESATTRS_TELEMETRY_SDK_NAME]: \"@observantic/sdk\",\n [SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]: \"nodejs\",\n [SEMRESATTRS_TELEMETRY_SDK_VERSION]: \"1.0.0\",\n [SEMRESATTRS_PROCESS_PID]: process.pid,\n [SEMRESATTRS_PROCESS_RUNTIME_NAME]: \"nodejs\",\n [SEMRESATTRS_PROCESS_RUNTIME_VERSION]: process.version,\n ...config.resourceAttributes,\n };\n\n return new Resource(customAttributes);\n}\n\n","import { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport {\n BatchSpanProcessor,\n ParentBasedSampler,\n TraceIdRatioBasedSampler,\n AlwaysOnSampler,\n AlwaysOffSampler,\n Sampler,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createTraceExporter(config: ResolvedObservanticConfig): OTLPTraceExporter {\n return new OTLPTraceExporter({\n url: config.tracesEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n });\n}\n\nexport function createSampler(sampleRate: number): Sampler {\n if (sampleRate >= 1.0) {\n return new ParentBasedSampler({ root: new AlwaysOnSampler() });\n }\n if (sampleRate <= 0.0) {\n return new ParentBasedSampler({ root: new AlwaysOffSampler() });\n }\n return new ParentBasedSampler({\n root: new TraceIdRatioBasedSampler(sampleRate),\n });\n}\n\nexport function createSpanProcessor(\n exporter: OTLPTraceExporter,\n config: ResolvedObservanticConfig\n): SpanProcessor {\n return new BatchSpanProcessor(exporter, {\n maxQueueSize: config.maxQueueSize,\n maxExportBatchSize: config.maxExportBatchSize,\n scheduledDelayMillis: config.batchTimeoutMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { OTLPMetricExporter } from \"@opentelemetry/exporter-metrics-otlp-http\";\nimport {\n PeriodicExportingMetricReader,\n MetricReader,\n AggregationTemporality,\n} from \"@opentelemetry/sdk-metrics\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createMetricExporter(config: ResolvedObservanticConfig): OTLPMetricExporter {\n return new OTLPMetricExporter({\n url: config.metricsEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n temporalityPreference: AggregationTemporality.DELTA,\n });\n}\n\nexport function createMetricReader(\n exporter: OTLPMetricExporter,\n config: ResolvedObservanticConfig\n): MetricReader {\n return new PeriodicExportingMetricReader({\n exporter,\n exportIntervalMillis: config.metricExportIntervalMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\nimport { BatchLogRecordProcessor, LogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createLogExporter(config: ResolvedObservanticConfig): OTLPLogExporter {\n return new OTLPLogExporter({\n url: config.logsEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n });\n}\n\nexport function createLogRecordProcessor(\n exporter: OTLPLogExporter,\n config: ResolvedObservanticConfig\n): LogRecordProcessor {\n return new BatchLogRecordProcessor(exporter, {\n maxQueueSize: config.maxQueueSize,\n maxExportBatchSize: config.maxExportBatchSize,\n scheduledDelayMillis: config.batchTimeoutMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { getNodeAutoInstrumentations } from \"@opentelemetry/auto-instrumentations-node\";\nimport { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\n/**\n * Configures auto-instrumentations with production defaults for Node.js and Express.\n */\nexport function createInstrumentations(\n _config: ResolvedObservanticConfig\n): (Instrumentation | Instrumentation[])[] {\n return [\n getNodeAutoInstrumentations({\n \"@opentelemetry/instrumentation-fs\": {\n // Disable noisy fs hooks by default to prevent span flooding\n enabled: false,\n },\n \"@opentelemetry/instrumentation-http\": {\n enabled: true,\n },\n \"@opentelemetry/instrumentation-express\": {\n enabled: true,\n },\n }),\n ];\n}\n\n","import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { diag } from \"@opentelemetry/api\";\n\nlet activeSdk: NodeSDK | null = null;\nlet isShuttingDown = false;\nlet isSignalHandlerRegistered = false;\n\n/**\n * Registers the active NodeSDK instance for lifecycle management.\n */\nexport function registerSdk(sdk: NodeSDK): void {\n activeSdk = sdk;\n}\n\n/**\n * Gracefully shuts down the Observantic OpenTelemetry SDK and flushes pending telemetry.\n */\nexport async function shutdownObservantic(): Promise<void> {\n if (!activeSdk) {\n return;\n }\n\n if (isShuttingDown) {\n return;\n }\n\n isShuttingDown = true;\n diag.info(\"Shutting down Observantic OpenTelemetry SDK...\");\n\n try {\n await activeSdk.shutdown();\n diag.info(\"Observantic OpenTelemetry SDK terminated successfully.\");\n } catch (err) {\n diag.error(\"Error shutting down Observantic OpenTelemetry SDK\", err);\n throw err;\n } finally {\n activeSdk = null;\n isShuttingDown = false;\n }\n}\n\n/**\n * Installs graceful process shutdown listeners for SIGINT and SIGTERM.\n */\nexport function installShutdownHooks(sdk: NodeSDK): void {\n registerSdk(sdk);\n\n if (isSignalHandlerRegistered) {\n return;\n }\n\n const handleSignal = async (signal: string) => {\n diag.info(`Received ${signal}, gracefully shutting down Observantic telemetry...`);\n try {\n await shutdownObservantic();\n } catch (err) {\n diag.error(`Failed to flush telemetry on ${signal}:`, err);\n }\n };\n\n process.once(\"SIGTERM\", () => void handleSignal(\"SIGTERM\"));\n process.once(\"SIGINT\", () => void handleSignal(\"SIGINT\"));\n\n isSignalHandlerRegistered = true;\n}\n\n"],"mappings":"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","names":["import_api","import_api_logs"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -282,7 +282,7 @@ function initObservantic(options = {}) {
|
|
|
282
282
|
diag2.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);
|
|
283
283
|
}
|
|
284
284
|
if (config.disabled) {
|
|
285
|
-
diag2.info("[@observantic/
|
|
285
|
+
diag2.info("[@observantic/sdk] Telemetry is disabled via configuration.");
|
|
286
286
|
return {
|
|
287
287
|
sdk: null,
|
|
288
288
|
config,
|
|
@@ -295,11 +295,13 @@ function initObservantic(options = {}) {
|
|
|
295
295
|
}
|
|
296
296
|
if (!config.apiKey) {
|
|
297
297
|
console.warn(
|
|
298
|
-
"[@observantic/
|
|
298
|
+
"[@observantic/sdk] Warning: No apiKey provided. Please provide an apiKey in initObservantic({ apiKey }) or set the OBSERVANTIC_API_KEY environment variable."
|
|
299
299
|
);
|
|
300
300
|
}
|
|
301
301
|
if (isInitialized) {
|
|
302
|
-
diag2.warn(
|
|
302
|
+
diag2.warn(
|
|
303
|
+
"[@observantic/sdk] initObservantic was called multiple times. Returning existing client."
|
|
304
|
+
);
|
|
303
305
|
return {
|
|
304
306
|
sdk: null,
|
|
305
307
|
config,
|
|
@@ -335,14 +337,19 @@ function initObservantic(options = {}) {
|
|
|
335
337
|
try {
|
|
336
338
|
sdk.start();
|
|
337
339
|
isInitialized = true;
|
|
338
|
-
diag2.info(
|
|
340
|
+
diag2.info(
|
|
341
|
+
`[@observantic/sdk] Initialized successfully for service: "${config.serviceName}" [${config.environment}]`
|
|
342
|
+
);
|
|
339
343
|
if (config.autoShutdown) {
|
|
340
344
|
installShutdownHooks(sdk);
|
|
341
345
|
} else {
|
|
342
346
|
registerSdk(sdk);
|
|
343
347
|
}
|
|
344
348
|
} catch (err) {
|
|
345
|
-
diag2.error(
|
|
349
|
+
diag2.error(
|
|
350
|
+
"[@observantic/sdk] Failed to start OpenTelemetry NodeSDK:",
|
|
351
|
+
err
|
|
352
|
+
);
|
|
346
353
|
throw err;
|
|
347
354
|
}
|
|
348
355
|
return {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/resource.ts","../src/tracing.ts","../src/metrics.ts","../src/logging.ts","../src/instrumentation.ts","../src/shutdown.ts"],"sourcesContent":["import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport {\n diag,\n DiagConsoleLogger,\n DiagLogLevel,\n trace,\n context,\n metrics,\n SpanStatusCode,\n SpanKind,\n Tracer,\n Meter,\n} from \"@opentelemetry/api\";\nimport { logs, Logger } from \"@opentelemetry/api-logs\";\n\nimport {\n ObservanticOptions,\n ResolvedObservanticConfig,\n resolveConfig,\n normalizeEndpoints,\n} from \"./config.js\";\nimport { createResource } from \"./resource.js\";\nimport {\n createTraceExporter,\n createSpanProcessor,\n createSampler,\n} from \"./tracing.js\";\nimport { createMetricExporter, createMetricReader } from \"./metrics.js\";\nimport { createLogExporter, createLogRecordProcessor } from \"./logging.js\";\nimport { createInstrumentations } from \"./instrumentation.js\";\nimport {\n shutdownObservantic,\n installShutdownHooks,\n registerSdk,\n} from \"./shutdown.js\";\n\nexport interface ObservanticClient {\n sdk: NodeSDK | null;\n config: ResolvedObservanticConfig;\n shutdown: () => Promise<void>;\n getTracer: (name?: string, version?: string) => Tracer;\n getMeter: (name?: string, version?: string) => Meter;\n getLogger: (name?: string, version?: string) => Logger;\n}\n\nlet isInitialized = false;\n\n/**\n * Initializes Observantic OpenTelemetry instrumentation for Node.js and Express.\n *\n * @example\n * ```ts\n * import { initObservantic } from \"@observantic/node\";\n *\n * initObservantic({\n * apiKey: \"cw_live_sec_xxxxx\",\n * endpoint: \"https://api.observantic.com\",\n * serviceName: \"my-express-app\"\n * });\n * ```\n */\nexport function initObservantic(options: ObservanticOptions = {}): ObservanticClient {\n const config = resolveConfig(options);\n\n if (config.debug) {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n\n if (config.disabled) {\n diag.info(\"[@observantic/node] Telemetry is disabled via configuration.\");\n return {\n sdk: null,\n config,\n shutdown: async () => {},\n getTracer: (name = \"observantic\", version = \"1.0.0\") => trace.getTracer(name, version),\n getMeter: (name = \"observantic\", version = \"1.0.0\") => metrics.getMeter(name, version),\n getLogger: (name = \"observantic\", version = \"1.0.0\") => logs.getLogger(name, version),\n };\n }\n\n if (!config.apiKey) {\n console.warn(\n \"[@observantic/node] Warning: No apiKey provided. Please provide an apiKey in initObservantic({ apiKey }) or set the OBSERVANTIC_API_KEY environment variable.\"\n );\n }\n\n if (isInitialized) {\n diag.warn(\"[@observantic/node] initObservantic was called multiple times. Returning existing client.\");\n return {\n sdk: null,\n config,\n shutdown: shutdownObservantic,\n getTracer: (name = \"observantic\", version = \"1.0.0\") => trace.getTracer(name, version),\n getMeter: (name = \"observantic\", version = \"1.0.0\") => metrics.getMeter(name, version),\n getLogger: (name = \"observantic\", version = \"1.0.0\") => logs.getLogger(name, version),\n };\n }\n\n const resource = createResource(config);\n\n const sdkConfig: any = {\n resource,\n instrumentations: createInstrumentations(config),\n };\n\n // Configure Tracing\n if (config.signals.traces) {\n const traceExporter = createTraceExporter(config);\n const spanProcessor = createSpanProcessor(traceExporter, config);\n const sampler = createSampler(config.traceSampleRate);\n\n sdkConfig.spanProcessor = spanProcessor;\n sdkConfig.sampler = sampler;\n }\n\n // Configure Metrics\n if (config.signals.metrics) {\n const metricExporter = createMetricExporter(config);\n const metricReader = createMetricReader(metricExporter, config);\n sdkConfig.metricReader = metricReader;\n }\n\n // Configure Logs\n if (config.signals.logs) {\n const logExporter = createLogExporter(config);\n const logRecordProcessor = createLogRecordProcessor(logExporter, config);\n sdkConfig.logRecordProcessor = logRecordProcessor;\n }\n\n const sdk = new NodeSDK(sdkConfig);\n\n try {\n sdk.start();\n isInitialized = true;\n diag.info(`[@observantic/node] Initialized successfully for service: \"${config.serviceName}\" [${config.environment}]`);\n\n if (config.autoShutdown) {\n installShutdownHooks(sdk);\n } else {\n registerSdk(sdk);\n }\n } catch (err) {\n diag.error(\"[@observantic/node] Failed to start OpenTelemetry NodeSDK:\", err);\n throw err;\n }\n\n return {\n sdk,\n config,\n shutdown: shutdownObservantic,\n getTracer: (name = config.serviceName, version = config.serviceVersion) =>\n trace.getTracer(name, version),\n getMeter: (name = config.serviceName, version = config.serviceVersion) =>\n metrics.getMeter(name, version),\n getLogger: (name = config.serviceName, version = config.serviceVersion) =>\n logs.getLogger(name, version),\n };\n}\n\n// Export lifecycle methods\nexport { shutdownObservantic };\n\n// Export configuration helpers & types\nexport type { ObservanticOptions, ResolvedObservanticConfig };\nexport { resolveConfig, normalizeEndpoints };\n\n// Re-export standard OpenTelemetry APIs for convenience\nexport {\n trace,\n context,\n metrics,\n SpanStatusCode,\n SpanKind,\n};\nexport { logs } from \"@opentelemetry/api-logs\";\n\n","export interface ObservanticOptions {\n /**\n * Ingestion API key for your Observantic workspace.\n * Defaults to process.env.OBSERVANTIC_API_KEY.\n */\n apiKey?: string;\n\n /**\n * Observantic ingestion base endpoint URL.\n * Defaults to process.env.OBSERVANTIC_ENDPOINT or \"https://api.observantic.com\".\n */\n endpoint?: string;\n\n /**\n * Name of your application service.\n * Defaults to process.env.OBSERVANTIC_SERVICE_NAME, process.env.OTEL_SERVICE_NAME,\n * process.env.npm_package_name, or \"node-service\".\n */\n serviceName?: string;\n\n /**\n * Deployment environment (e.g., \"production\", \"staging\", \"development\").\n * Defaults to process.env.OBSERVANTIC_ENVIRONMENT, process.env.NODE_ENV, or \"development\".\n */\n environment?: string;\n\n /**\n * Version of your application.\n * Defaults to process.env.OBSERVANTIC_SERVICE_VERSION, process.env.npm_package_version, or \"1.0.0\".\n */\n serviceVersion?: string;\n\n /**\n * Custom resource attributes to attach to all telemetry (traces, metrics, logs).\n */\n resourceAttributes?: Record<string, string | number | boolean>;\n\n /**\n * Additional HTTP headers to attach to OTLP export requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Disable telemetry collection entirely (useful in test or CI environments).\n * Defaults to process.env.OBSERVANTIC_DISABLED === \"true\".\n */\n disabled?: boolean;\n\n /**\n * Enable verbose OpenTelemetry internal diagnostic logging.\n * Defaults to process.env.OBSERVANTIC_DEBUG === \"true\".\n */\n debug?: boolean;\n\n /**\n * Automatically install graceful shutdown hooks for SIGINT and SIGTERM.\n * Defaults to true.\n */\n autoShutdown?: boolean;\n\n /**\n * Sampling ratio for traces from 0.0 (0%) to 1.0 (100%).\n * Defaults to 1.0.\n */\n traceSampleRate?: number;\n\n /**\n * Batch span export timeout in milliseconds.\n * Defaults to 5000ms.\n */\n batchTimeoutMillis?: number;\n\n /**\n * Maximum queue size for spans and logs waiting to be exported.\n * Defaults to 2048.\n */\n maxQueueSize?: number;\n\n /**\n * Maximum batch size per export request.\n * Defaults to 512.\n */\n maxExportBatchSize?: number;\n\n /**\n * Metrics periodic export interval in milliseconds.\n * Defaults to 60000ms (60s).\n */\n metricExportIntervalMillis?: number;\n\n /**\n * Enable or disable individual telemetry signals.\n */\n signals?: {\n traces?: boolean;\n metrics?: boolean;\n logs?: boolean;\n };\n}\n\nexport interface ResolvedObservanticConfig {\n apiKey: string;\n endpoint: string;\n tracesEndpoint: string;\n metricsEndpoint: string;\n logsEndpoint: string;\n serviceName: string;\n environment: string;\n serviceVersion: string;\n resourceAttributes: Record<string, string | number | boolean>;\n headers: Record<string, string>;\n disabled: boolean;\n debug: boolean;\n autoShutdown: boolean;\n traceSampleRate: number;\n batchTimeoutMillis: number;\n maxQueueSize: number;\n maxExportBatchSize: number;\n metricExportIntervalMillis: number;\n signals: {\n traces: boolean;\n metrics: boolean;\n logs: boolean;\n };\n}\n\n/**\n * Normalizes an endpoint URL and constructs signal-specific paths.\n */\nexport function normalizeEndpoints(baseEndpoint: string) {\n let cleaned = (baseEndpoint || \"https://api.observantic.com\").trim();\n // Strip trailing slashes\n cleaned = cleaned.replace(/\\/+$/, \"\");\n\n // If user passed specific /v1/traces URL directly as endpoint, handle gracefully\n if (cleaned.endsWith(\"/v1/traces\")) {\n const root = cleaned.slice(0, -\"/v1/traces\".length);\n return {\n endpoint: root,\n tracesEndpoint: cleaned,\n metricsEndpoint: `${root}/v1/metrics`,\n logsEndpoint: `${root}/v1/logs`,\n };\n }\n\n // If user passed /v1 at the end\n if (cleaned.endsWith(\"/v1\")) {\n return {\n endpoint: cleaned,\n tracesEndpoint: `${cleaned}/traces`,\n metricsEndpoint: `${cleaned}/metrics`,\n logsEndpoint: `${cleaned}/logs`,\n };\n }\n\n return {\n endpoint: cleaned,\n tracesEndpoint: `${cleaned}/v1/traces`,\n metricsEndpoint: `${cleaned}/v1/metrics`,\n logsEndpoint: `${cleaned}/v1/logs`,\n };\n}\n\n/**\n * Parses comma-delimited key=value headers often used in OTEL_EXPORTER_OTLP_HEADERS.\n */\nexport function parseOtelHeaders(headerStr?: string): Record<string, string> {\n if (!headerStr) return {};\n const headers: Record<string, string> = {};\n const pairs = headerStr.split(\",\");\n for (const pair of pairs) {\n const idx = pair.indexOf(\"=\");\n if (idx > 0) {\n const key = pair.substring(0, idx).trim();\n const val = pair.substring(idx + 1).trim();\n if (key) headers[key] = val;\n }\n }\n return headers;\n}\n\n/**\n * Resolves user options with environment variables and sensible defaults.\n */\nexport function resolveConfig(options: ObservanticOptions = {}): ResolvedObservanticConfig {\n const env = process.env;\n\n const apiKey =\n options.apiKey ||\n env.OBSERVANTIC_API_KEY ||\n \"\";\n\n const rawEndpoint =\n options.endpoint ||\n env.OBSERVANTIC_ENDPOINT ||\n env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n \"https://api.observantic.com\";\n\n const { endpoint, tracesEndpoint, metricsEndpoint, logsEndpoint } = normalizeEndpoints(rawEndpoint);\n\n const serviceName =\n options.serviceName ||\n env.OBSERVANTIC_SERVICE_NAME ||\n env.OTEL_SERVICE_NAME ||\n env.npm_package_name ||\n process.title ||\n \"node-service\";\n\n const environment =\n options.environment ||\n env.OBSERVANTIC_ENVIRONMENT ||\n env.NODE_ENV ||\n \"development\";\n\n const serviceVersion =\n options.serviceVersion ||\n env.OBSERVANTIC_SERVICE_VERSION ||\n env.npm_package_version ||\n \"1.0.0\";\n\n const disabled =\n options.disabled !== undefined\n ? options.disabled\n : env.OBSERVANTIC_DISABLED === \"true\" || env.OTEL_SDK_DISABLED === \"true\";\n\n const debug =\n options.debug !== undefined\n ? options.debug\n : env.OBSERVANTIC_DEBUG === \"true\" || env.OTEL_LOG_LEVEL === \"debug\";\n\n const autoShutdown = options.autoShutdown !== undefined ? options.autoShutdown : true;\n\n const traceSampleRate =\n options.traceSampleRate !== undefined\n ? Math.max(0, Math.min(1, options.traceSampleRate))\n : env.OBSERVANTIC_TRACE_SAMPLE_RATE\n ? parseFloat(env.OBSERVANTIC_TRACE_SAMPLE_RATE)\n : 1.0;\n\n // Build headers with authentication for Observantic\n const envHeaders = parseOtelHeaders(env.OTEL_EXPORTER_OTLP_HEADERS);\n const headers: Record<string, string> = {\n ...envHeaders,\n ...(options.headers || {}),\n };\n\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n headers[\"x-cw-token\"] = apiKey;\n }\n\n return {\n apiKey,\n endpoint,\n tracesEndpoint,\n metricsEndpoint,\n logsEndpoint,\n serviceName,\n environment,\n serviceVersion,\n resourceAttributes: options.resourceAttributes || {},\n headers,\n disabled,\n debug,\n autoShutdown,\n traceSampleRate,\n batchTimeoutMillis: options.batchTimeoutMillis || 5000,\n maxQueueSize: options.maxQueueSize || 2048,\n maxExportBatchSize: options.maxExportBatchSize || 512,\n metricExportIntervalMillis: options.metricExportIntervalMillis || 60000,\n signals: {\n traces: options.signals?.traces !== false,\n metrics: options.signals?.metrics !== false,\n logs: options.signals?.logs !== false,\n },\n };\n}\n\n","import { Resource } from \"@opentelemetry/resources\";\nimport {\n SEMRESATTRS_SERVICE_NAME,\n SEMRESATTRS_SERVICE_VERSION,\n SEMRESATTRS_DEPLOYMENT_ENVIRONMENT,\n SEMRESATTRS_TELEMETRY_SDK_NAME,\n SEMRESATTRS_TELEMETRY_SDK_LANGUAGE,\n SEMRESATTRS_TELEMETRY_SDK_VERSION,\n SEMRESATTRS_PROCESS_PID,\n SEMRESATTRS_PROCESS_RUNTIME_NAME,\n SEMRESATTRS_PROCESS_RUNTIME_VERSION,\n} from \"@opentelemetry/semantic-conventions\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\n/**\n * Builds OpenTelemetry Resource with standard semantic conventions and custom attributes.\n */\nexport function createResource(config: ResolvedObservanticConfig): Resource {\n const customAttributes: Record<string, string | number | boolean> = {\n [SEMRESATTRS_SERVICE_NAME]: config.serviceName,\n [SEMRESATTRS_SERVICE_VERSION]: config.serviceVersion,\n [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: config.environment,\n [SEMRESATTRS_TELEMETRY_SDK_NAME]: \"@observantic/sdk\",\n [SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]: \"nodejs\",\n [SEMRESATTRS_TELEMETRY_SDK_VERSION]: \"1.0.0\",\n [SEMRESATTRS_PROCESS_PID]: process.pid,\n [SEMRESATTRS_PROCESS_RUNTIME_NAME]: \"nodejs\",\n [SEMRESATTRS_PROCESS_RUNTIME_VERSION]: process.version,\n ...config.resourceAttributes,\n };\n\n return new Resource(customAttributes);\n}\n\n","import { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport {\n BatchSpanProcessor,\n ParentBasedSampler,\n TraceIdRatioBasedSampler,\n AlwaysOnSampler,\n AlwaysOffSampler,\n Sampler,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createTraceExporter(config: ResolvedObservanticConfig): OTLPTraceExporter {\n return new OTLPTraceExporter({\n url: config.tracesEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n });\n}\n\nexport function createSampler(sampleRate: number): Sampler {\n if (sampleRate >= 1.0) {\n return new ParentBasedSampler({ root: new AlwaysOnSampler() });\n }\n if (sampleRate <= 0.0) {\n return new ParentBasedSampler({ root: new AlwaysOffSampler() });\n }\n return new ParentBasedSampler({\n root: new TraceIdRatioBasedSampler(sampleRate),\n });\n}\n\nexport function createSpanProcessor(\n exporter: OTLPTraceExporter,\n config: ResolvedObservanticConfig\n): SpanProcessor {\n return new BatchSpanProcessor(exporter, {\n maxQueueSize: config.maxQueueSize,\n maxExportBatchSize: config.maxExportBatchSize,\n scheduledDelayMillis: config.batchTimeoutMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { OTLPMetricExporter } from \"@opentelemetry/exporter-metrics-otlp-http\";\nimport {\n PeriodicExportingMetricReader,\n MetricReader,\n AggregationTemporality,\n} from \"@opentelemetry/sdk-metrics\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createMetricExporter(config: ResolvedObservanticConfig): OTLPMetricExporter {\n return new OTLPMetricExporter({\n url: config.metricsEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n temporalityPreference: AggregationTemporality.DELTA,\n });\n}\n\nexport function createMetricReader(\n exporter: OTLPMetricExporter,\n config: ResolvedObservanticConfig\n): MetricReader {\n return new PeriodicExportingMetricReader({\n exporter,\n exportIntervalMillis: config.metricExportIntervalMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\nimport { BatchLogRecordProcessor, LogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createLogExporter(config: ResolvedObservanticConfig): OTLPLogExporter {\n return new OTLPLogExporter({\n url: config.logsEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n });\n}\n\nexport function createLogRecordProcessor(\n exporter: OTLPLogExporter,\n config: ResolvedObservanticConfig\n): LogRecordProcessor {\n return new BatchLogRecordProcessor(exporter, {\n maxQueueSize: config.maxQueueSize,\n maxExportBatchSize: config.maxExportBatchSize,\n scheduledDelayMillis: config.batchTimeoutMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { getNodeAutoInstrumentations } from \"@opentelemetry/auto-instrumentations-node\";\nimport { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\n/**\n * Configures auto-instrumentations with production defaults for Node.js and Express.\n */\nexport function createInstrumentations(\n _config: ResolvedObservanticConfig\n): (Instrumentation | Instrumentation[])[] {\n return [\n getNodeAutoInstrumentations({\n \"@opentelemetry/instrumentation-fs\": {\n // Disable noisy fs hooks by default to prevent span flooding\n enabled: false,\n },\n \"@opentelemetry/instrumentation-http\": {\n enabled: true,\n },\n \"@opentelemetry/instrumentation-express\": {\n enabled: true,\n },\n }),\n ];\n}\n\n","import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { diag } from \"@opentelemetry/api\";\n\nlet activeSdk: NodeSDK | null = null;\nlet isShuttingDown = false;\nlet isSignalHandlerRegistered = false;\n\n/**\n * Registers the active NodeSDK instance for lifecycle management.\n */\nexport function registerSdk(sdk: NodeSDK): void {\n activeSdk = sdk;\n}\n\n/**\n * Gracefully shuts down the Observantic OpenTelemetry SDK and flushes pending telemetry.\n */\nexport async function shutdownObservantic(): Promise<void> {\n if (!activeSdk) {\n return;\n }\n\n if (isShuttingDown) {\n return;\n }\n\n isShuttingDown = true;\n diag.info(\"Shutting down Observantic OpenTelemetry SDK...\");\n\n try {\n await activeSdk.shutdown();\n diag.info(\"Observantic OpenTelemetry SDK terminated successfully.\");\n } catch (err) {\n diag.error(\"Error shutting down Observantic OpenTelemetry SDK\", err);\n throw err;\n } finally {\n activeSdk = null;\n isShuttingDown = false;\n }\n}\n\n/**\n * Installs graceful process shutdown listeners for SIGINT and SIGTERM.\n */\nexport function installShutdownHooks(sdk: NodeSDK): void {\n registerSdk(sdk);\n\n if (isSignalHandlerRegistered) {\n return;\n }\n\n const handleSignal = async (signal: string) => {\n diag.info(`Received ${signal}, gracefully shutting down Observantic telemetry...`);\n try {\n await shutdownObservantic();\n } catch (err) {\n diag.error(`Failed to flush telemetry on ${signal}:`, err);\n }\n };\n\n process.once(\"SIGTERM\", () => void handleSignal(\"SIGTERM\"));\n process.once(\"SIGINT\", () => void handleSignal(\"SIGINT\"));\n\n isSignalHandlerRegistered = true;\n}\n\n"],"mappings":"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","names":["diag","logs","diag"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/resource.ts","../src/tracing.ts","../src/metrics.ts","../src/logging.ts","../src/instrumentation.ts","../src/shutdown.ts"],"sourcesContent":["import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport {\n diag,\n DiagConsoleLogger,\n DiagLogLevel,\n trace,\n context,\n metrics,\n SpanStatusCode,\n SpanKind,\n Tracer,\n Meter,\n} from \"@opentelemetry/api\";\nimport { logs, Logger } from \"@opentelemetry/api-logs\";\n\nimport {\n ObservanticOptions,\n ResolvedObservanticConfig,\n resolveConfig,\n normalizeEndpoints,\n} from \"./config.js\";\nimport { createResource } from \"./resource.js\";\nimport {\n createTraceExporter,\n createSpanProcessor,\n createSampler,\n} from \"./tracing.js\";\nimport { createMetricExporter, createMetricReader } from \"./metrics.js\";\nimport { createLogExporter, createLogRecordProcessor } from \"./logging.js\";\nimport { createInstrumentations } from \"./instrumentation.js\";\nimport {\n shutdownObservantic,\n installShutdownHooks,\n registerSdk,\n} from \"./shutdown.js\";\n\nexport interface ObservanticClient {\n sdk: NodeSDK | null;\n config: ResolvedObservanticConfig;\n shutdown: () => Promise<void>;\n getTracer: (name?: string, version?: string) => Tracer;\n getMeter: (name?: string, version?: string) => Meter;\n getLogger: (name?: string, version?: string) => Logger;\n}\n\nlet isInitialized = false;\n\n/**\n * Initializes Observantic OpenTelemetry instrumentation for Node.js and Express.\n *\n * @example\n * ```ts\n * import { initObservantic } from \"@observantic/sdk\";\n *\n * initObservantic({\n * apiKey: \"cw_live_sec_xxxxx\",\n * endpoint: \"https://api.observantic.com\",\n * serviceName: \"my-express-app\"\n * });\n * ```\n */\nexport function initObservantic(\n options: ObservanticOptions = {},\n): ObservanticClient {\n const config = resolveConfig(options);\n\n if (config.debug) {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n\n if (config.disabled) {\n diag.info(\"[@observantic/sdk] Telemetry is disabled via configuration.\");\n return {\n sdk: null,\n config,\n shutdown: async () => {},\n getTracer: (name = \"observantic\", version = \"1.0.0\") =>\n trace.getTracer(name, version),\n getMeter: (name = \"observantic\", version = \"1.0.0\") =>\n metrics.getMeter(name, version),\n getLogger: (name = \"observantic\", version = \"1.0.0\") =>\n logs.getLogger(name, version),\n };\n }\n\n if (!config.apiKey) {\n console.warn(\n \"[@observantic/sdk] Warning: No apiKey provided. Please provide an apiKey in initObservantic({ apiKey }) or set the OBSERVANTIC_API_KEY environment variable.\",\n );\n }\n\n if (isInitialized) {\n diag.warn(\n \"[@observantic/sdk] initObservantic was called multiple times. Returning existing client.\",\n );\n return {\n sdk: null,\n config,\n shutdown: shutdownObservantic,\n getTracer: (name = \"observantic\", version = \"1.0.0\") =>\n trace.getTracer(name, version),\n getMeter: (name = \"observantic\", version = \"1.0.0\") =>\n metrics.getMeter(name, version),\n getLogger: (name = \"observantic\", version = \"1.0.0\") =>\n logs.getLogger(name, version),\n };\n }\n\n const resource = createResource(config);\n\n const sdkConfig: any = {\n resource,\n instrumentations: createInstrumentations(config),\n };\n\n // Configure Tracing\n if (config.signals.traces) {\n const traceExporter = createTraceExporter(config);\n const spanProcessor = createSpanProcessor(traceExporter, config);\n const sampler = createSampler(config.traceSampleRate);\n\n sdkConfig.spanProcessor = spanProcessor;\n sdkConfig.sampler = sampler;\n }\n\n // Configure Metrics\n if (config.signals.metrics) {\n const metricExporter = createMetricExporter(config);\n const metricReader = createMetricReader(metricExporter, config);\n sdkConfig.metricReader = metricReader;\n }\n\n // Configure Logs\n if (config.signals.logs) {\n const logExporter = createLogExporter(config);\n const logRecordProcessor = createLogRecordProcessor(logExporter, config);\n sdkConfig.logRecordProcessor = logRecordProcessor;\n }\n\n const sdk = new NodeSDK(sdkConfig);\n\n try {\n sdk.start();\n isInitialized = true;\n diag.info(\n `[@observantic/sdk] Initialized successfully for service: \"${config.serviceName}\" [${config.environment}]`,\n );\n\n if (config.autoShutdown) {\n installShutdownHooks(sdk);\n } else {\n registerSdk(sdk);\n }\n } catch (err) {\n diag.error(\n \"[@observantic/sdk] Failed to start OpenTelemetry NodeSDK:\",\n err,\n );\n throw err;\n }\n\n return {\n sdk,\n config,\n shutdown: shutdownObservantic,\n getTracer: (name = config.serviceName, version = config.serviceVersion) =>\n trace.getTracer(name, version),\n getMeter: (name = config.serviceName, version = config.serviceVersion) =>\n metrics.getMeter(name, version),\n getLogger: (name = config.serviceName, version = config.serviceVersion) =>\n logs.getLogger(name, version),\n };\n}\n\n// Export lifecycle methods\nexport { shutdownObservantic };\n\n// Export configuration helpers & types\nexport type { ObservanticOptions, ResolvedObservanticConfig };\nexport { resolveConfig, normalizeEndpoints };\n\n// Re-export standard OpenTelemetry APIs for convenience\nexport { trace, context, metrics, SpanStatusCode, SpanKind };\nexport { logs } from \"@opentelemetry/api-logs\";\n","export interface ObservanticOptions {\n /**\n * Ingestion API key for your Observantic workspace.\n * Defaults to process.env.OBSERVANTIC_API_KEY.\n */\n apiKey?: string;\n\n /**\n * Observantic ingestion base endpoint URL.\n * Defaults to process.env.OBSERVANTIC_ENDPOINT or \"https://api.observantic.com\".\n */\n endpoint?: string;\n\n /**\n * Name of your application service.\n * Defaults to process.env.OBSERVANTIC_SERVICE_NAME, process.env.OTEL_SERVICE_NAME,\n * process.env.npm_package_name, or \"node-service\".\n */\n serviceName?: string;\n\n /**\n * Deployment environment (e.g., \"production\", \"staging\", \"development\").\n * Defaults to process.env.OBSERVANTIC_ENVIRONMENT, process.env.NODE_ENV, or \"development\".\n */\n environment?: string;\n\n /**\n * Version of your application.\n * Defaults to process.env.OBSERVANTIC_SERVICE_VERSION, process.env.npm_package_version, or \"1.0.0\".\n */\n serviceVersion?: string;\n\n /**\n * Custom resource attributes to attach to all telemetry (traces, metrics, logs).\n */\n resourceAttributes?: Record<string, string | number | boolean>;\n\n /**\n * Additional HTTP headers to attach to OTLP export requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Disable telemetry collection entirely (useful in test or CI environments).\n * Defaults to process.env.OBSERVANTIC_DISABLED === \"true\".\n */\n disabled?: boolean;\n\n /**\n * Enable verbose OpenTelemetry internal diagnostic logging.\n * Defaults to process.env.OBSERVANTIC_DEBUG === \"true\".\n */\n debug?: boolean;\n\n /**\n * Automatically install graceful shutdown hooks for SIGINT and SIGTERM.\n * Defaults to true.\n */\n autoShutdown?: boolean;\n\n /**\n * Sampling ratio for traces from 0.0 (0%) to 1.0 (100%).\n * Defaults to 1.0.\n */\n traceSampleRate?: number;\n\n /**\n * Batch span export timeout in milliseconds.\n * Defaults to 5000ms.\n */\n batchTimeoutMillis?: number;\n\n /**\n * Maximum queue size for spans and logs waiting to be exported.\n * Defaults to 2048.\n */\n maxQueueSize?: number;\n\n /**\n * Maximum batch size per export request.\n * Defaults to 512.\n */\n maxExportBatchSize?: number;\n\n /**\n * Metrics periodic export interval in milliseconds.\n * Defaults to 60000ms (60s).\n */\n metricExportIntervalMillis?: number;\n\n /**\n * Enable or disable individual telemetry signals.\n */\n signals?: {\n traces?: boolean;\n metrics?: boolean;\n logs?: boolean;\n };\n}\n\nexport interface ResolvedObservanticConfig {\n apiKey: string;\n endpoint: string;\n tracesEndpoint: string;\n metricsEndpoint: string;\n logsEndpoint: string;\n serviceName: string;\n environment: string;\n serviceVersion: string;\n resourceAttributes: Record<string, string | number | boolean>;\n headers: Record<string, string>;\n disabled: boolean;\n debug: boolean;\n autoShutdown: boolean;\n traceSampleRate: number;\n batchTimeoutMillis: number;\n maxQueueSize: number;\n maxExportBatchSize: number;\n metricExportIntervalMillis: number;\n signals: {\n traces: boolean;\n metrics: boolean;\n logs: boolean;\n };\n}\n\n/**\n * Normalizes an endpoint URL and constructs signal-specific paths.\n */\nexport function normalizeEndpoints(baseEndpoint: string) {\n let cleaned = (baseEndpoint || \"https://api.observantic.com\").trim();\n // Strip trailing slashes\n cleaned = cleaned.replace(/\\/+$/, \"\");\n\n // If user passed specific /v1/traces URL directly as endpoint, handle gracefully\n if (cleaned.endsWith(\"/v1/traces\")) {\n const root = cleaned.slice(0, -\"/v1/traces\".length);\n return {\n endpoint: root,\n tracesEndpoint: cleaned,\n metricsEndpoint: `${root}/v1/metrics`,\n logsEndpoint: `${root}/v1/logs`,\n };\n }\n\n // If user passed /v1 at the end\n if (cleaned.endsWith(\"/v1\")) {\n return {\n endpoint: cleaned,\n tracesEndpoint: `${cleaned}/traces`,\n metricsEndpoint: `${cleaned}/metrics`,\n logsEndpoint: `${cleaned}/logs`,\n };\n }\n\n return {\n endpoint: cleaned,\n tracesEndpoint: `${cleaned}/v1/traces`,\n metricsEndpoint: `${cleaned}/v1/metrics`,\n logsEndpoint: `${cleaned}/v1/logs`,\n };\n}\n\n/**\n * Parses comma-delimited key=value headers often used in OTEL_EXPORTER_OTLP_HEADERS.\n */\nexport function parseOtelHeaders(headerStr?: string): Record<string, string> {\n if (!headerStr) return {};\n const headers: Record<string, string> = {};\n const pairs = headerStr.split(\",\");\n for (const pair of pairs) {\n const idx = pair.indexOf(\"=\");\n if (idx > 0) {\n const key = pair.substring(0, idx).trim();\n const val = pair.substring(idx + 1).trim();\n if (key) headers[key] = val;\n }\n }\n return headers;\n}\n\n/**\n * Resolves user options with environment variables and sensible defaults.\n */\nexport function resolveConfig(options: ObservanticOptions = {}): ResolvedObservanticConfig {\n const env = process.env;\n\n const apiKey =\n options.apiKey ||\n env.OBSERVANTIC_API_KEY ||\n \"\";\n\n const rawEndpoint =\n options.endpoint ||\n env.OBSERVANTIC_ENDPOINT ||\n env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n \"https://api.observantic.com\";\n\n const { endpoint, tracesEndpoint, metricsEndpoint, logsEndpoint } = normalizeEndpoints(rawEndpoint);\n\n const serviceName =\n options.serviceName ||\n env.OBSERVANTIC_SERVICE_NAME ||\n env.OTEL_SERVICE_NAME ||\n env.npm_package_name ||\n process.title ||\n \"node-service\";\n\n const environment =\n options.environment ||\n env.OBSERVANTIC_ENVIRONMENT ||\n env.NODE_ENV ||\n \"development\";\n\n const serviceVersion =\n options.serviceVersion ||\n env.OBSERVANTIC_SERVICE_VERSION ||\n env.npm_package_version ||\n \"1.0.0\";\n\n const disabled =\n options.disabled !== undefined\n ? options.disabled\n : env.OBSERVANTIC_DISABLED === \"true\" || env.OTEL_SDK_DISABLED === \"true\";\n\n const debug =\n options.debug !== undefined\n ? options.debug\n : env.OBSERVANTIC_DEBUG === \"true\" || env.OTEL_LOG_LEVEL === \"debug\";\n\n const autoShutdown = options.autoShutdown !== undefined ? options.autoShutdown : true;\n\n const traceSampleRate =\n options.traceSampleRate !== undefined\n ? Math.max(0, Math.min(1, options.traceSampleRate))\n : env.OBSERVANTIC_TRACE_SAMPLE_RATE\n ? parseFloat(env.OBSERVANTIC_TRACE_SAMPLE_RATE)\n : 1.0;\n\n // Build headers with authentication for Observantic\n const envHeaders = parseOtelHeaders(env.OTEL_EXPORTER_OTLP_HEADERS);\n const headers: Record<string, string> = {\n ...envHeaders,\n ...(options.headers || {}),\n };\n\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n headers[\"x-cw-token\"] = apiKey;\n }\n\n return {\n apiKey,\n endpoint,\n tracesEndpoint,\n metricsEndpoint,\n logsEndpoint,\n serviceName,\n environment,\n serviceVersion,\n resourceAttributes: options.resourceAttributes || {},\n headers,\n disabled,\n debug,\n autoShutdown,\n traceSampleRate,\n batchTimeoutMillis: options.batchTimeoutMillis || 5000,\n maxQueueSize: options.maxQueueSize || 2048,\n maxExportBatchSize: options.maxExportBatchSize || 512,\n metricExportIntervalMillis: options.metricExportIntervalMillis || 60000,\n signals: {\n traces: options.signals?.traces !== false,\n metrics: options.signals?.metrics !== false,\n logs: options.signals?.logs !== false,\n },\n };\n}\n\n","import { Resource } from \"@opentelemetry/resources\";\nimport {\n SEMRESATTRS_SERVICE_NAME,\n SEMRESATTRS_SERVICE_VERSION,\n SEMRESATTRS_DEPLOYMENT_ENVIRONMENT,\n SEMRESATTRS_TELEMETRY_SDK_NAME,\n SEMRESATTRS_TELEMETRY_SDK_LANGUAGE,\n SEMRESATTRS_TELEMETRY_SDK_VERSION,\n SEMRESATTRS_PROCESS_PID,\n SEMRESATTRS_PROCESS_RUNTIME_NAME,\n SEMRESATTRS_PROCESS_RUNTIME_VERSION,\n} from \"@opentelemetry/semantic-conventions\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\n/**\n * Builds OpenTelemetry Resource with standard semantic conventions and custom attributes.\n */\nexport function createResource(config: ResolvedObservanticConfig): Resource {\n const customAttributes: Record<string, string | number | boolean> = {\n [SEMRESATTRS_SERVICE_NAME]: config.serviceName,\n [SEMRESATTRS_SERVICE_VERSION]: config.serviceVersion,\n [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: config.environment,\n [SEMRESATTRS_TELEMETRY_SDK_NAME]: \"@observantic/sdk\",\n [SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]: \"nodejs\",\n [SEMRESATTRS_TELEMETRY_SDK_VERSION]: \"1.0.0\",\n [SEMRESATTRS_PROCESS_PID]: process.pid,\n [SEMRESATTRS_PROCESS_RUNTIME_NAME]: \"nodejs\",\n [SEMRESATTRS_PROCESS_RUNTIME_VERSION]: process.version,\n ...config.resourceAttributes,\n };\n\n return new Resource(customAttributes);\n}\n\n","import { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport {\n BatchSpanProcessor,\n ParentBasedSampler,\n TraceIdRatioBasedSampler,\n AlwaysOnSampler,\n AlwaysOffSampler,\n Sampler,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createTraceExporter(config: ResolvedObservanticConfig): OTLPTraceExporter {\n return new OTLPTraceExporter({\n url: config.tracesEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n });\n}\n\nexport function createSampler(sampleRate: number): Sampler {\n if (sampleRate >= 1.0) {\n return new ParentBasedSampler({ root: new AlwaysOnSampler() });\n }\n if (sampleRate <= 0.0) {\n return new ParentBasedSampler({ root: new AlwaysOffSampler() });\n }\n return new ParentBasedSampler({\n root: new TraceIdRatioBasedSampler(sampleRate),\n });\n}\n\nexport function createSpanProcessor(\n exporter: OTLPTraceExporter,\n config: ResolvedObservanticConfig\n): SpanProcessor {\n return new BatchSpanProcessor(exporter, {\n maxQueueSize: config.maxQueueSize,\n maxExportBatchSize: config.maxExportBatchSize,\n scheduledDelayMillis: config.batchTimeoutMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { OTLPMetricExporter } from \"@opentelemetry/exporter-metrics-otlp-http\";\nimport {\n PeriodicExportingMetricReader,\n MetricReader,\n AggregationTemporality,\n} from \"@opentelemetry/sdk-metrics\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createMetricExporter(config: ResolvedObservanticConfig): OTLPMetricExporter {\n return new OTLPMetricExporter({\n url: config.metricsEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n temporalityPreference: AggregationTemporality.DELTA,\n });\n}\n\nexport function createMetricReader(\n exporter: OTLPMetricExporter,\n config: ResolvedObservanticConfig\n): MetricReader {\n return new PeriodicExportingMetricReader({\n exporter,\n exportIntervalMillis: config.metricExportIntervalMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\nimport { BatchLogRecordProcessor, LogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\nexport function createLogExporter(config: ResolvedObservanticConfig): OTLPLogExporter {\n return new OTLPLogExporter({\n url: config.logsEndpoint,\n headers: config.headers,\n timeoutMillis: 10000,\n });\n}\n\nexport function createLogRecordProcessor(\n exporter: OTLPLogExporter,\n config: ResolvedObservanticConfig\n): LogRecordProcessor {\n return new BatchLogRecordProcessor(exporter, {\n maxQueueSize: config.maxQueueSize,\n maxExportBatchSize: config.maxExportBatchSize,\n scheduledDelayMillis: config.batchTimeoutMillis,\n exportTimeoutMillis: 10000,\n });\n}\n\n","import { getNodeAutoInstrumentations } from \"@opentelemetry/auto-instrumentations-node\";\nimport { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport { ResolvedObservanticConfig } from \"./config.js\";\n\n/**\n * Configures auto-instrumentations with production defaults for Node.js and Express.\n */\nexport function createInstrumentations(\n _config: ResolvedObservanticConfig\n): (Instrumentation | Instrumentation[])[] {\n return [\n getNodeAutoInstrumentations({\n \"@opentelemetry/instrumentation-fs\": {\n // Disable noisy fs hooks by default to prevent span flooding\n enabled: false,\n },\n \"@opentelemetry/instrumentation-http\": {\n enabled: true,\n },\n \"@opentelemetry/instrumentation-express\": {\n enabled: true,\n },\n }),\n ];\n}\n\n","import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { diag } from \"@opentelemetry/api\";\n\nlet activeSdk: NodeSDK | null = null;\nlet isShuttingDown = false;\nlet isSignalHandlerRegistered = false;\n\n/**\n * Registers the active NodeSDK instance for lifecycle management.\n */\nexport function registerSdk(sdk: NodeSDK): void {\n activeSdk = sdk;\n}\n\n/**\n * Gracefully shuts down the Observantic OpenTelemetry SDK and flushes pending telemetry.\n */\nexport async function shutdownObservantic(): Promise<void> {\n if (!activeSdk) {\n return;\n }\n\n if (isShuttingDown) {\n return;\n }\n\n isShuttingDown = true;\n diag.info(\"Shutting down Observantic OpenTelemetry SDK...\");\n\n try {\n await activeSdk.shutdown();\n diag.info(\"Observantic OpenTelemetry SDK terminated successfully.\");\n } catch (err) {\n diag.error(\"Error shutting down Observantic OpenTelemetry SDK\", err);\n throw err;\n } finally {\n activeSdk = null;\n isShuttingDown = false;\n }\n}\n\n/**\n * Installs graceful process shutdown listeners for SIGINT and SIGTERM.\n */\nexport function installShutdownHooks(sdk: NodeSDK): void {\n registerSdk(sdk);\n\n if (isSignalHandlerRegistered) {\n return;\n }\n\n const handleSignal = async (signal: string) => {\n diag.info(`Received ${signal}, gracefully shutting down Observantic telemetry...`);\n try {\n await shutdownObservantic();\n } catch (err) {\n diag.error(`Failed to flush telemetry on ${signal}:`, err);\n }\n };\n\n process.once(\"SIGTERM\", () => void handleSignal(\"SIGTERM\"));\n process.once(\"SIGINT\", () => void handleSignal(\"SIGINT\"));\n\n isSignalHandlerRegistered = true;\n}\n\n"],"mappings":";AAAA,SAAS,eAAe;AACxB;AAAA,EACE,QAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,YAAoB;;;ACoHtB,SAAS,mBAAmB,cAAsB;AACvD,MAAI,WAAW,gBAAgB,+BAA+B,KAAK;AAEnE,YAAU,QAAQ,QAAQ,QAAQ,EAAE;AAGpC,MAAI,QAAQ,SAAS,YAAY,GAAG;AAClC,UAAM,OAAO,QAAQ,MAAM,GAAG,CAAC,aAAa,MAAM;AAClD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,iBAAiB,GAAG,IAAI;AAAA,MACxB,cAAc,GAAG,IAAI;AAAA,IACvB;AAAA,EACF;AAGA,MAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,gBAAgB,GAAG,OAAO;AAAA,MAC1B,iBAAiB,GAAG,OAAO;AAAA,MAC3B,cAAc,GAAG,OAAO;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,gBAAgB,GAAG,OAAO;AAAA,IAC1B,iBAAiB,GAAG,OAAO;AAAA,IAC3B,cAAc,GAAG,OAAO;AAAA,EAC1B;AACF;AAKO,SAAS,iBAAiB,WAA4C;AAC3E,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,QAAM,UAAkC,CAAC;AACzC,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,MAAM,GAAG;AACX,YAAM,MAAM,KAAK,UAAU,GAAG,GAAG,EAAE,KAAK;AACxC,YAAM,MAAM,KAAK,UAAU,MAAM,CAAC,EAAE,KAAK;AACzC,UAAI,IAAK,SAAQ,GAAG,IAAI;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,cAAc,UAA8B,CAAC,GAA8B;AACzF,QAAM,MAAM,QAAQ;AAEpB,QAAM,SACJ,QAAQ,UACR,IAAI,uBACJ;AAEF,QAAM,cACJ,QAAQ,YACR,IAAI,wBACJ,IAAI,+BACJ;AAEF,QAAM,EAAE,UAAU,gBAAgB,iBAAiB,aAAa,IAAI,mBAAmB,WAAW;AAElG,QAAM,cACJ,QAAQ,eACR,IAAI,4BACJ,IAAI,qBACJ,IAAI,oBACJ,QAAQ,SACR;AAEF,QAAM,cACJ,QAAQ,eACR,IAAI,2BACJ,IAAI,YACJ;AAEF,QAAM,iBACJ,QAAQ,kBACR,IAAI,+BACJ,IAAI,uBACJ;AAEF,QAAM,WACJ,QAAQ,aAAa,SACjB,QAAQ,WACR,IAAI,yBAAyB,UAAU,IAAI,sBAAsB;AAEvE,QAAM,QACJ,QAAQ,UAAU,SACd,QAAQ,QACR,IAAI,sBAAsB,UAAU,IAAI,mBAAmB;AAEjE,QAAM,eAAe,QAAQ,iBAAiB,SAAY,QAAQ,eAAe;AAEjF,QAAM,kBACJ,QAAQ,oBAAoB,SACxB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,eAAe,CAAC,IAChD,IAAI,gCACJ,WAAW,IAAI,6BAA6B,IAC5C;AAGN,QAAM,aAAa,iBAAiB,IAAI,0BAA0B;AAClE,QAAM,UAAkC;AAAA,IACtC,GAAG;AAAA,IACH,GAAI,QAAQ,WAAW,CAAC;AAAA,EAC1B;AAEA,MAAI,QAAQ;AACV,YAAQ,eAAe,IAAI,UAAU,MAAM;AAC3C,YAAQ,YAAY,IAAI;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,QAAQ,sBAAsB,CAAC;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,QAAQ,sBAAsB;AAAA,IAClD,cAAc,QAAQ,gBAAgB;AAAA,IACtC,oBAAoB,QAAQ,sBAAsB;AAAA,IAClD,4BAA4B,QAAQ,8BAA8B;AAAA,IAClE,SAAS;AAAA,MACP,QAAQ,QAAQ,SAAS,WAAW;AAAA,MACpC,SAAS,QAAQ,SAAS,YAAY;AAAA,MACtC,MAAM,QAAQ,SAAS,SAAS;AAAA,IAClC;AAAA,EACF;AACF;;;ACpRA,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMA,SAAS,eAAe,QAA6C;AAC1E,QAAM,mBAA8D;AAAA,IAClE,CAAC,wBAAwB,GAAG,OAAO;AAAA,IACnC,CAAC,2BAA2B,GAAG,OAAO;AAAA,IACtC,CAAC,kCAAkC,GAAG,OAAO;AAAA,IAC7C,CAAC,8BAA8B,GAAG;AAAA,IAClC,CAAC,kCAAkC,GAAG;AAAA,IACtC,CAAC,iCAAiC,GAAG;AAAA,IACrC,CAAC,uBAAuB,GAAG,QAAQ;AAAA,IACnC,CAAC,gCAAgC,GAAG;AAAA,IACpC,CAAC,mCAAmC,GAAG,QAAQ;AAAA,IAC/C,GAAG,OAAO;AAAA,EACZ;AAEA,SAAO,IAAI,SAAS,gBAAgB;AACtC;;;AChCA,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAGA,SAAS,oBAAoB,QAAsD;AACxF,SAAO,IAAI,kBAAkB;AAAA,IAC3B,KAAK,OAAO;AAAA,IACZ,SAAS,OAAO;AAAA,IAChB,eAAe;AAAA,EACjB,CAAC;AACH;AAEO,SAAS,cAAc,YAA6B;AACzD,MAAI,cAAc,GAAK;AACrB,WAAO,IAAI,mBAAmB,EAAE,MAAM,IAAI,gBAAgB,EAAE,CAAC;AAAA,EAC/D;AACA,MAAI,cAAc,GAAK;AACrB,WAAO,IAAI,mBAAmB,EAAE,MAAM,IAAI,iBAAiB,EAAE,CAAC;AAAA,EAChE;AACA,SAAO,IAAI,mBAAmB;AAAA,IAC5B,MAAM,IAAI,yBAAyB,UAAU;AAAA,EAC/C,CAAC;AACH;AAEO,SAAS,oBACd,UACA,QACe;AACf,SAAO,IAAI,mBAAmB,UAAU;AAAA,IACtC,cAAc,OAAO;AAAA,IACrB,oBAAoB,OAAO;AAAA,IAC3B,sBAAsB,OAAO;AAAA,IAC7B,qBAAqB;AAAA,EACvB,CAAC;AACH;;;AC1CA,SAAS,0BAA0B;AACnC;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AAGA,SAAS,qBAAqB,QAAuD;AAC1F,SAAO,IAAI,mBAAmB;AAAA,IAC5B,KAAK,OAAO;AAAA,IACZ,SAAS,OAAO;AAAA,IAChB,eAAe;AAAA,IACf,uBAAuB,uBAAuB;AAAA,EAChD,CAAC;AACH;AAEO,SAAS,mBACd,UACA,QACc;AACd,SAAO,IAAI,8BAA8B;AAAA,IACvC;AAAA,IACA,sBAAsB,OAAO;AAAA,IAC7B,qBAAqB;AAAA,EACvB,CAAC;AACH;;;AC1BA,SAAS,uBAAuB;AAChC,SAAS,+BAAmD;AAGrD,SAAS,kBAAkB,QAAoD;AACpF,SAAO,IAAI,gBAAgB;AAAA,IACzB,KAAK,OAAO;AAAA,IACZ,SAAS,OAAO;AAAA,IAChB,eAAe;AAAA,EACjB,CAAC;AACH;AAEO,SAAS,yBACd,UACA,QACoB;AACpB,SAAO,IAAI,wBAAwB,UAAU;AAAA,IAC3C,cAAc,OAAO;AAAA,IACrB,oBAAoB,OAAO;AAAA,IAC3B,sBAAsB,OAAO;AAAA,IAC7B,qBAAqB;AAAA,EACvB,CAAC;AACH;;;ACtBA,SAAS,mCAAmC;AAOrC,SAAS,uBACd,SACyC;AACzC,SAAO;AAAA,IACL,4BAA4B;AAAA,MAC1B,qCAAqC;AAAA;AAAA,QAEnC,SAAS;AAAA,MACX;AAAA,MACA,uCAAuC;AAAA,QACrC,SAAS;AAAA,MACX;AAAA,MACA,0CAA0C;AAAA,QACxC,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACvBA,SAAS,YAAY;AAErB,IAAI,YAA4B;AAChC,IAAI,iBAAiB;AACrB,IAAI,4BAA4B;AAKzB,SAAS,YAAY,KAAoB;AAC9C,cAAY;AACd;AAKA,eAAsB,sBAAqC;AACzD,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB;AAAA,EACF;AAEA,mBAAiB;AACjB,OAAK,KAAK,gDAAgD;AAE1D,MAAI;AACF,UAAM,UAAU,SAAS;AACzB,SAAK,KAAK,wDAAwD;AAAA,EACpE,SAAS,KAAK;AACZ,SAAK,MAAM,qDAAqD,GAAG;AACnE,UAAM;AAAA,EACR,UAAE;AACA,gBAAY;AACZ,qBAAiB;AAAA,EACnB;AACF;AAKO,SAAS,qBAAqB,KAAoB;AACvD,cAAY,GAAG;AAEf,MAAI,2BAA2B;AAC7B;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,WAAmB;AAC7C,SAAK,KAAK,YAAY,MAAM,qDAAqD;AACjF,QAAI;AACF,YAAM,oBAAoB;AAAA,IAC5B,SAAS,KAAK;AACZ,WAAK,MAAM,gCAAgC,MAAM,KAAK,GAAG;AAAA,IAC3D;AAAA,EACF;AAEA,UAAQ,KAAK,WAAW,MAAM,KAAK,aAAa,SAAS,CAAC;AAC1D,UAAQ,KAAK,UAAU,MAAM,KAAK,aAAa,QAAQ,CAAC;AAExD,8BAA4B;AAC9B;;;APuHA,SAAS,QAAAC,aAAY;AA1IrB,IAAI,gBAAgB;AAgBb,SAAS,gBACd,UAA8B,CAAC,GACZ;AACnB,QAAM,SAAS,cAAc,OAAO;AAEpC,MAAI,OAAO,OAAO;AAChB,IAAAC,MAAK,UAAU,IAAI,kBAAkB,GAAG,aAAa,KAAK;AAAA,EAC5D;AAEA,MAAI,OAAO,UAAU;AACnB,IAAAA,MAAK,KAAK,6DAA6D;AACvE,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,UAAU,YAAY;AAAA,MAAC;AAAA,MACvB,WAAW,CAAC,OAAO,eAAe,UAAU,YAC1C,MAAM,UAAU,MAAM,OAAO;AAAA,MAC/B,UAAU,CAAC,OAAO,eAAe,UAAU,YACzC,QAAQ,SAAS,MAAM,OAAO;AAAA,MAChC,WAAW,CAAC,OAAO,eAAe,UAAU,YAC1C,KAAK,UAAU,MAAM,OAAO;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,QAAQ;AAClB,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe;AACjB,IAAAA,MAAK;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,WAAW,CAAC,OAAO,eAAe,UAAU,YAC1C,MAAM,UAAU,MAAM,OAAO;AAAA,MAC/B,UAAU,CAAC,OAAO,eAAe,UAAU,YACzC,QAAQ,SAAS,MAAM,OAAO;AAAA,MAChC,WAAW,CAAC,OAAO,eAAe,UAAU,YAC1C,KAAK,UAAU,MAAM,OAAO;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,WAAW,eAAe,MAAM;AAEtC,QAAM,YAAiB;AAAA,IACrB;AAAA,IACA,kBAAkB,uBAAuB,MAAM;AAAA,EACjD;AAGA,MAAI,OAAO,QAAQ,QAAQ;AACzB,UAAM,gBAAgB,oBAAoB,MAAM;AAChD,UAAM,gBAAgB,oBAAoB,eAAe,MAAM;AAC/D,UAAM,UAAU,cAAc,OAAO,eAAe;AAEpD,cAAU,gBAAgB;AAC1B,cAAU,UAAU;AAAA,EACtB;AAGA,MAAI,OAAO,QAAQ,SAAS;AAC1B,UAAM,iBAAiB,qBAAqB,MAAM;AAClD,UAAM,eAAe,mBAAmB,gBAAgB,MAAM;AAC9D,cAAU,eAAe;AAAA,EAC3B;AAGA,MAAI,OAAO,QAAQ,MAAM;AACvB,UAAM,cAAc,kBAAkB,MAAM;AAC5C,UAAM,qBAAqB,yBAAyB,aAAa,MAAM;AACvE,cAAU,qBAAqB;AAAA,EACjC;AAEA,QAAM,MAAM,IAAI,QAAQ,SAAS;AAEjC,MAAI;AACF,QAAI,MAAM;AACV,oBAAgB;AAChB,IAAAA,MAAK;AAAA,MACH,6DAA6D,OAAO,WAAW,MAAM,OAAO,WAAW;AAAA,IACzG;AAEA,QAAI,OAAO,cAAc;AACvB,2BAAqB,GAAG;AAAA,IAC1B,OAAO;AACL,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF,SAAS,KAAK;AACZ,IAAAA,MAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,OAAO,aAAa,UAAU,OAAO,mBACtD,MAAM,UAAU,MAAM,OAAO;AAAA,IAC/B,UAAU,CAAC,OAAO,OAAO,aAAa,UAAU,OAAO,mBACrD,QAAQ,SAAS,MAAM,OAAO;AAAA,IAChC,WAAW,CAAC,OAAO,OAAO,aAAa,UAAU,OAAO,mBACtD,KAAK,UAAU,MAAM,OAAO;AAAA,EAChC;AACF;","names":["diag","logs","diag"]}
|
package/package.json
CHANGED
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@observantic/sdk",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Zero-friction OpenTelemetry SDK and auto-instrumentation for Observantic platform",
|
|
5
|
-
"main": "./dist/index.cjs",
|
|
6
|
-
"module": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
|
-
"type": "module",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/index.js",
|
|
13
|
-
"require": "./dist/index.cjs"
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
"files": [
|
|
17
|
-
"dist",
|
|
18
|
-
"README.md",
|
|
19
|
-
"LICENSE"
|
|
20
|
-
],
|
|
21
|
-
"publishConfig": {
|
|
22
|
-
"access": "public"
|
|
23
|
-
},
|
|
24
|
-
"scripts": {
|
|
25
|
-
"build": "tsup",
|
|
26
|
-
"dev": "tsup --watch",
|
|
27
|
-
"test": "vitest run",
|
|
28
|
-
"test:watch": "vitest",
|
|
29
|
-
"typecheck": "tsc --noEmit",
|
|
30
|
-
"prepublishOnly": "npm run typecheck && npm run build && npm test"
|
|
31
|
-
},
|
|
32
|
-
"keywords": [
|
|
33
|
-
"observantic",
|
|
34
|
-
"opentelemetry",
|
|
35
|
-
"tracing",
|
|
36
|
-
"metrics",
|
|
37
|
-
"logs",
|
|
38
|
-
"observability",
|
|
39
|
-
"apm",
|
|
40
|
-
"express",
|
|
41
|
-
"node"
|
|
42
|
-
],
|
|
43
|
-
"author": "Observantic",
|
|
44
|
-
"license": "Apache-2.0",
|
|
45
|
-
"dependencies": {
|
|
46
|
-
"@opentelemetry/api": "^1.9.0",
|
|
47
|
-
"@opentelemetry/api-logs": "^0.57.2",
|
|
48
|
-
"@opentelemetry/auto-instrumentations-node": "^0.56.0",
|
|
49
|
-
"@opentelemetry/exporter-logs-otlp-http": "^0.57.2",
|
|
50
|
-
"@opentelemetry/exporter-metrics-otlp-http": "^0.57.2",
|
|
51
|
-
"@opentelemetry/exporter-trace-otlp-http": "^0.57.2",
|
|
52
|
-
"@opentelemetry/resources": "^1.30.1",
|
|
53
|
-
"@opentelemetry/sdk-logs": "^0.57.2",
|
|
54
|
-
"@opentelemetry/sdk-metrics": "^1.30.1",
|
|
55
|
-
"@opentelemetry/sdk-node": "^0.57.2",
|
|
56
|
-
"@opentelemetry/sdk-trace-base": "^1.30.1",
|
|
57
|
-
"@opentelemetry/sdk-trace-node": "^1.30.1",
|
|
58
|
-
"@opentelemetry/semantic-conventions": "^1.30.0",
|
|
59
|
-
"@tinybirdco/sdk": "^0.0.82"
|
|
60
|
-
},
|
|
61
|
-
"devDependencies": {
|
|
62
|
-
"@types/node": "^20.17.0",
|
|
63
|
-
"tsup": "^8.3.6",
|
|
64
|
-
"typescript": "^5.7.3",
|
|
65
|
-
"vitest": "^3.0.7"
|
|
66
|
-
},
|
|
67
|
-
"engines": {
|
|
68
|
-
"node": ">=18.0.0"
|
|
69
|
-
}
|
|
70
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@observantic/sdk",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Zero-friction OpenTelemetry SDK and auto-instrumentation for Observantic platform",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"dev": "tsup --watch",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"prepublishOnly": "npm run typecheck && npm run build && npm test"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"observantic",
|
|
34
|
+
"opentelemetry",
|
|
35
|
+
"tracing",
|
|
36
|
+
"metrics",
|
|
37
|
+
"logs",
|
|
38
|
+
"observability",
|
|
39
|
+
"apm",
|
|
40
|
+
"express",
|
|
41
|
+
"node"
|
|
42
|
+
],
|
|
43
|
+
"author": "Observantic",
|
|
44
|
+
"license": "Apache-2.0",
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@opentelemetry/api": "^1.9.0",
|
|
47
|
+
"@opentelemetry/api-logs": "^0.57.2",
|
|
48
|
+
"@opentelemetry/auto-instrumentations-node": "^0.56.0",
|
|
49
|
+
"@opentelemetry/exporter-logs-otlp-http": "^0.57.2",
|
|
50
|
+
"@opentelemetry/exporter-metrics-otlp-http": "^0.57.2",
|
|
51
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.57.2",
|
|
52
|
+
"@opentelemetry/resources": "^1.30.1",
|
|
53
|
+
"@opentelemetry/sdk-logs": "^0.57.2",
|
|
54
|
+
"@opentelemetry/sdk-metrics": "^1.30.1",
|
|
55
|
+
"@opentelemetry/sdk-node": "^0.57.2",
|
|
56
|
+
"@opentelemetry/sdk-trace-base": "^1.30.1",
|
|
57
|
+
"@opentelemetry/sdk-trace-node": "^1.30.1",
|
|
58
|
+
"@opentelemetry/semantic-conventions": "^1.30.0",
|
|
59
|
+
"@tinybirdco/sdk": "^0.0.82"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@types/node": "^20.17.0",
|
|
63
|
+
"tsup": "^8.3.6",
|
|
64
|
+
"typescript": "^5.7.3",
|
|
65
|
+
"vitest": "^3.0.7"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
"node": ">=18.0.0"
|
|
69
|
+
}
|
|
70
|
+
}
|