@latitude-data/telemetry 3.0.0-alpha.0 → 3.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +415 -115
- package/dist/index.cjs +405 -325
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +142 -96
- package/dist/index.d.ts +142 -96
- package/dist/index.js +403 -314
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/sdk/redact.ts","../src/sdk/sdk.ts","../src/constants/attributes.ts","../src/constants/scope.ts","../src/env/env.ts","../src/instrumentations/manual.ts"],"sourcesContent":["export * from \"./sdk/index.ts\"\n","import type * as otel from \"@opentelemetry/api\"\nimport type { ReadableSpan, Span, SpanProcessor } from \"@opentelemetry/sdk-trace-node\"\n\nexport interface RedactSpanProcessorOptions {\n attributes: (string | RegExp)[]\n mask?: (attribute: string, value: unknown) => string\n}\n\nexport class RedactSpanProcessor implements SpanProcessor {\n private options: RedactSpanProcessorOptions\n\n constructor(options: RedactSpanProcessorOptions) {\n this.options = options\n\n if (!options.mask) {\n this.options.mask = (_attribute: string, _value: unknown) => \"******\"\n }\n }\n\n onStart(_span: Span, _context: otel.Context): void {\n // Noop\n }\n\n onEnd(span: ReadableSpan): void {\n Object.assign(span.attributes, this.redactAttributes(span.attributes))\n for (const event of span.events) {\n if (!event.attributes) continue\n Object.assign(event.attributes, this.redactAttributes(event.attributes))\n }\n for (const link of span.links) {\n if (!link.attributes) continue\n Object.assign(link.attributes, this.redactAttributes(link.attributes))\n }\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve()\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve()\n }\n\n private shouldRedact(attribute: string) {\n return this.options.attributes.some((pattern) => {\n if (typeof pattern === \"string\") {\n return attribute === pattern\n } else if (pattern instanceof RegExp) {\n return pattern.test(attribute)\n }\n return false\n })\n }\n\n private redactAttributes(attributes: otel.Attributes) {\n const redacted: otel.Attributes = {}\n\n for (const [key, value] of Object.entries(attributes)) {\n if (this.shouldRedact(key)) {\n redacted[key] = this.options.mask?.(key, value)\n }\n }\n\n return redacted\n }\n}\n\nexport const DEFAULT_REDACT_SPAN_PROCESSOR = () =>\n new RedactSpanProcessor({\n attributes: [\n /^http\\.request\\.header\\.authorization$/i,\n /^http\\.request\\.header\\.cookie$/i,\n /^http\\.request\\.header\\.x[-_]api[-_]key$/i,\n /^db\\.statement$/i,\n ],\n })\n","import * as otel from \"@opentelemetry/api\"\nimport { context, propagation, type TextMapPropagator } from \"@opentelemetry/api\"\nimport { ALLOW_ALL_BAGGAGE_KEYS, BaggageSpanProcessor } from \"@opentelemetry/baggage-span-processor\"\nimport { AsyncLocalStorageContextManager } from \"@opentelemetry/context-async-hooks\"\nimport { CompositePropagator, W3CBaggagePropagator, W3CTraceContextPropagator } from \"@opentelemetry/core\"\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\"\nimport { registerInstrumentations } from \"@opentelemetry/instrumentation\"\nimport { Resource } from \"@opentelemetry/resources\"\nimport {\n BatchSpanProcessor,\n NodeTracerProvider,\n SimpleSpanProcessor,\n type SpanExporter,\n type SpanProcessor,\n} from \"@opentelemetry/sdk-trace-node\"\nimport { ATTR_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\"\nimport { AnthropicInstrumentation } from \"@traceloop/instrumentation-anthropic\"\nimport { BedrockInstrumentation } from \"@traceloop/instrumentation-bedrock\"\nimport { CohereInstrumentation } from \"@traceloop/instrumentation-cohere\"\nimport { LangChainInstrumentation } from \"@traceloop/instrumentation-langchain\"\nimport { LlamaIndexInstrumentation } from \"@traceloop/instrumentation-llamaindex\"\nimport { OpenAIInstrumentation } from \"@traceloop/instrumentation-openai\"\nimport { TogetherInstrumentation } from \"@traceloop/instrumentation-together\"\nimport { AIPlatformInstrumentation, VertexAIInstrumentation } from \"@traceloop/instrumentation-vertexai\"\nimport { ATTRIBUTES, SCOPE_LATITUDE } from \"../constants/index.ts\"\nimport { env } from \"../env/index.ts\"\nimport { type BaseInstrumentation, type CaptureOptions, ManualInstrumentation } from \"../instrumentations/index.ts\"\nimport { DEFAULT_REDACT_SPAN_PROCESSOR } from \"./redact.ts\"\n\nconst TRACES_URL = `${env.EXPORTER_URL}/v1/traces`\nconst SERVICE_NAME = process.env.npm_package_name || \"unknown\"\nconst SCOPE_VERSION = process.env.npm_package_version || \"unknown\"\n\nexport type TelemetryContext = otel.Context\n\nclass ContextManager {\n private readonly telemetry: ManualInstrumentation\n\n constructor(telemetry: ManualInstrumentation) {\n this.telemetry = telemetry\n }\n\n resume(ctx: { traceparent: string; baggage?: string }) {\n return this.telemetry.resume(ctx)\n }\n\n active() {\n return context.active()\n }\n\n with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n ctx: TelemetryContext,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n return context.with(ctx, fn, thisArg, ...args)\n }\n}\n\nclass InstrumentationManager {\n private readonly instrumentations: BaseInstrumentation[]\n\n constructor(instrumentations: BaseInstrumentation[]) {\n this.instrumentations = instrumentations\n }\n\n enable() {\n for (const instrumentation of this.instrumentations) {\n if (!instrumentation.isEnabled()) instrumentation.enable()\n }\n }\n\n disable() {\n for (const instrumentation of this.instrumentations) {\n if (instrumentation.isEnabled()) instrumentation.disable()\n }\n }\n}\n\nclass TracerManager {\n private readonly nodeProvider: NodeTracerProvider\n private readonly scopeVersion: string\n\n constructor(nodeProvider: NodeTracerProvider, scopeVersion: string) {\n this.nodeProvider = nodeProvider\n this.scopeVersion = scopeVersion\n }\n\n get(scope: Instrumentation) {\n return this.provider(scope).getTracer(\"\")\n }\n\n provider(scope: Instrumentation) {\n return new ScopedTracerProvider(`${SCOPE_LATITUDE}.${scope}`, this.scopeVersion, this.nodeProvider)\n }\n}\n\nclass ScopedTracerProvider implements otel.TracerProvider {\n private readonly scope: string\n private readonly version: string\n private readonly provider: otel.TracerProvider\n\n constructor(scope: string, version: string, provider: otel.TracerProvider) {\n this.scope = scope\n this.version = version\n this.provider = provider\n }\n\n getTracer(_name: string, _version?: string, options?: otel.TracerOptions) {\n return this.provider.getTracer(this.scope, this.version, options)\n }\n}\n\nclass LifecycleManager {\n private readonly nodeProvider: NodeTracerProvider\n private readonly exporter: SpanExporter\n\n constructor(nodeProvider: NodeTracerProvider, exporter: SpanExporter) {\n this.nodeProvider = nodeProvider\n this.exporter = exporter\n }\n\n async flush() {\n await this.nodeProvider.forceFlush()\n await this.exporter.forceFlush?.()\n }\n\n async shutdown() {\n await this.flush()\n await this.nodeProvider.shutdown()\n await this.exporter.shutdown?.()\n }\n}\n\nexport const DEFAULT_SPAN_EXPORTER = (apiKey: string, projectSlug: string) =>\n new OTLPTraceExporter({\n url: TRACES_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"X-Latitude-Project\": projectSlug,\n },\n timeoutMillis: 30 * 1000,\n })\n\nexport enum Instrumentation {\n Anthropic = \"anthropic\",\n AIPlatform = \"aiplatform\",\n Bedrock = \"bedrock\",\n Cohere = \"cohere\",\n Langchain = \"langchain\",\n LlamaIndex = \"llamaindex\",\n Manual = \"manual\",\n OpenAI = \"openai\",\n TogetherAI = \"togetherai\",\n VertexAI = \"vertexai\",\n}\n\nexport type TelemetryOptions = {\n serviceName?: string\n disableBatch?: boolean\n exporter?: SpanExporter\n processors?: SpanProcessor[]\n propagators?: TextMapPropagator[]\n instrumentations?: {\n [Instrumentation.AIPlatform]?: unknown\n [Instrumentation.Anthropic]?: unknown\n [Instrumentation.Bedrock]?: unknown\n [Instrumentation.Cohere]?: unknown\n [Instrumentation.OpenAI]?: unknown\n [Instrumentation.LlamaIndex]?: unknown\n [Instrumentation.TogetherAI]?: unknown\n [Instrumentation.VertexAI]?: unknown\n [Instrumentation.Langchain]?: {\n callbackManagerModule?: unknown\n }\n }\n}\n\nexport class LatitudeTelemetry {\n private options: TelemetryOptions\n private nodeProvider: NodeTracerProvider\n private instrumentationsList: BaseInstrumentation[]\n\n /** OpenTelemetry tracer for creating custom spans. */\n readonly tracer: otel.Tracer\n readonly context: ContextManager\n readonly instrumentation: InstrumentationManager\n private readonly lifecycle: LifecycleManager\n\n constructor(apiKey: string, projectSlug: string, options?: TelemetryOptions) {\n this.options = options || {}\n\n if (!this.options.exporter) {\n this.options.exporter = DEFAULT_SPAN_EXPORTER(apiKey, projectSlug)\n }\n\n context.setGlobalContextManager(new AsyncLocalStorageContextManager().enable())\n\n propagation.setGlobalPropagator(\n new CompositePropagator({\n propagators: [...(this.options.propagators || []), new W3CTraceContextPropagator(), new W3CBaggagePropagator()],\n }),\n )\n\n const spanProcessors: SpanProcessor[] = [\n // Must run before the exporter span processors\n new BaggageSpanProcessor(ALLOW_ALL_BAGGAGE_KEYS),\n ...(this.options.processors ?? [DEFAULT_REDACT_SPAN_PROCESSOR()]),\n this.options.disableBatch\n ? new SimpleSpanProcessor(this.options.exporter)\n : new BatchSpanProcessor(this.options.exporter),\n ]\n\n this.nodeProvider = new NodeTracerProvider({\n resource: new Resource({ [ATTR_SERVICE_NAME]: this.options.serviceName || SERVICE_NAME }),\n spanProcessors,\n })\n\n this.lifecycle = new LifecycleManager(this.nodeProvider, this.options.exporter)\n\n this.nodeProvider.register()\n\n process.on(\"SIGTERM\", () => this.shutdown())\n process.on(\"SIGINT\", () => this.shutdown())\n\n this.instrumentationsList = []\n const tracerManager = new TracerManager(this.nodeProvider, SCOPE_VERSION)\n\n // Manual instrumentation for context management\n const manualTracer = tracerManager.get(Instrumentation.Manual)\n const manualInstrumentation = new ManualInstrumentation(manualTracer)\n this.instrumentationsList.push(manualInstrumentation)\n\n // Expose tracer for custom span creation\n this.tracer = manualTracer\n\n this.initProviderInstrumentations(tracerManager)\n this.instrumentation = new InstrumentationManager(this.instrumentationsList)\n this.instrumentation.enable()\n\n this.context = new ContextManager(manualInstrumentation)\n }\n\n async flush() {\n await this.lifecycle.flush()\n }\n\n async shutdown() {\n await this.lifecycle.shutdown()\n }\n\n private initProviderInstrumentations(tracerManager: TracerManager) {\n type InstrumentationClass =\n | typeof AnthropicInstrumentation\n | typeof AIPlatformInstrumentation\n | typeof BedrockInstrumentation\n | typeof CohereInstrumentation\n | typeof LangChainInstrumentation\n | typeof LlamaIndexInstrumentation\n | typeof OpenAIInstrumentation\n | typeof TogetherInstrumentation\n | typeof VertexAIInstrumentation\n\n type ProviderInstrumentation = Exclude<Instrumentation, Instrumentation.Manual>\n\n const configure = (\n type: ProviderInstrumentation,\n Ctor: InstrumentationClass,\n opts?: { enrichTokens?: boolean },\n ) => {\n const providerPkg = this.options.instrumentations?.[type]\n if (!providerPkg) return\n\n const provider = tracerManager.provider(type)\n const inst = new Ctor(opts)\n inst.setTracerProvider(provider)\n inst.manuallyInstrument(providerPkg)\n registerInstrumentations({\n instrumentations: [inst],\n tracerProvider: provider,\n })\n this.instrumentationsList.push(inst)\n }\n\n configure(Instrumentation.Anthropic, AnthropicInstrumentation)\n configure(Instrumentation.AIPlatform, AIPlatformInstrumentation)\n configure(Instrumentation.Bedrock, BedrockInstrumentation)\n configure(Instrumentation.Cohere, CohereInstrumentation)\n configure(Instrumentation.Langchain, LangChainInstrumentation)\n configure(Instrumentation.LlamaIndex, LlamaIndexInstrumentation)\n configure(Instrumentation.OpenAI, OpenAIInstrumentation, { enrichTokens: true })\n configure(Instrumentation.TogetherAI, TogetherInstrumentation, { enrichTokens: false })\n configure(Instrumentation.VertexAI, VertexAIInstrumentation)\n }\n\n /**\n * Wrap a block of code with trace-wide context attributes.\n * Baggage entries (tags, metadata, sessionId, userId) are propagated\n * to all spans created within the callback via BaggageSpanProcessor.\n *\n * If there is no active span, a root span is created so all child spans\n * are grouped under a single trace. If a span is already active, only\n * baggage is set without creating an extra wrapper span.\n */\n async capture<T>(options: CaptureOptions, fn: (ctx: TelemetryContext) => T | Promise<T>): Promise<T> {\n const baggageEntries: Record<string, otel.BaggageEntry> = {}\n\n if (options.tags?.length) {\n baggageEntries[ATTRIBUTES.tags] = { value: JSON.stringify(options.tags) }\n }\n\n if (options.metadata) {\n baggageEntries[ATTRIBUTES.metadata] = { value: JSON.stringify(options.metadata) }\n }\n\n if (options.sessionId) {\n baggageEntries[ATTRIBUTES.sessionId] = { value: options.sessionId }\n }\n\n if (options.userId) {\n baggageEntries[ATTRIBUTES.userId] = { value: options.userId }\n }\n\n const baggage = propagation.createBaggage(baggageEntries)\n const activeSpan = otel.trace.getSpan(context.active())\n\n if (activeSpan) {\n const ctx = propagation.setBaggage(context.active(), baggage)\n return await context.with(ctx, async () => await fn(ctx))\n }\n\n const rootContext = propagation.setBaggage(otel.ROOT_CONTEXT, baggage)\n return await this.tracer.startActiveSpan(\n \"latitude.trace\",\n { kind: otel.SpanKind.INTERNAL },\n rootContext,\n async (span) => {\n try {\n const result = await fn(context.active())\n span.setStatus({ code: otel.SpanStatusCode.OK })\n return result\n } catch (error) {\n span.setStatus({\n code: otel.SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n })\n span.recordException(error instanceof Error ? error : new Error(String(error)))\n throw error\n } finally {\n span.end()\n }\n },\n )\n }\n}\n","/**\n * Attribute keys for trace-wide context set via capture().\n * Propagated to all spans within the trace by the BaggageSpanProcessor.\n */\nexport const ATTRIBUTES = {\n tags: \"latitude.tags\",\n metadata: \"latitude.metadata\",\n sessionId: \"session.id\",\n userId: \"user.id\",\n} as const\n","export const SCOPE_LATITUDE = \"so.latitude.instrumentation\"\n\nexport enum InstrumentationScope {\n Manual = \"manual\",\n OpenAI = \"openai\",\n Anthropic = \"anthropic\",\n AzureOpenAI = \"azure\",\n VercelAI = \"vercelai\",\n VertexAI = \"vertexai\",\n AIPlatform = \"aiplatform\",\n MistralAI = \"mistralai\",\n Bedrock = \"bedrock\",\n Sagemaker = \"sagemaker\",\n TogetherAI = \"togetherai\",\n Replicate = \"replicate\",\n Groq = \"groq\",\n Cohere = \"cohere\",\n LiteLLM = \"litellm\",\n Langchain = \"langchain\",\n LlamaIndex = \"llamaindex\",\n DSPy = \"dspy\",\n Haystack = \"haystack\",\n Ollama = \"ollama\",\n Transformers = \"transformers\",\n AlephAlpha = \"alephalpha\",\n}\n","const DEFAULT_EXPORTER_URL =\n {\n production: \"https://ingest.latitude.so\",\n development: \"http://localhost:3002\",\n test: \"http://localhost:3002\",\n }[process.env.NODE_ENV ?? \"development\"] ?? \"http://localhost:3002\"\n\nfunction getExporterUrl() {\n if (process.env.LATITUDE_TELEMETRY_URL) {\n return process.env.LATITUDE_TELEMETRY_URL\n }\n\n return DEFAULT_EXPORTER_URL\n}\n\nexport const env = { EXPORTER_URL: getExporterUrl() } as const\n","import * as otel from \"@opentelemetry/api\"\nimport { propagation, trace } from \"@opentelemetry/api\"\nimport type { BaseInstrumentation } from \"./base.ts\"\n\nexport type CaptureOptions = {\n tags?: string[]\n metadata?: Record<string, unknown>\n sessionId?: string\n userId?: string\n}\n\nexport class ManualInstrumentation implements BaseInstrumentation {\n private enabled: boolean\n private readonly _tracer: otel.Tracer\n\n constructor(tracer: otel.Tracer) {\n this.enabled = false\n this._tracer = tracer\n }\n\n get tracer(): otel.Tracer {\n return this._tracer\n }\n\n isEnabled() {\n return this.enabled\n }\n\n enable() {\n this.enabled = true\n }\n\n disable() {\n this.enabled = false\n }\n\n resume(ctx: { traceparent: string; baggage?: string }): otel.Context {\n const parts = ctx.traceparent.split(\"-\")\n if (parts.length !== 4) {\n return otel.ROOT_CONTEXT\n }\n\n const [, traceId, spanId, flags] = parts\n if (!traceId || !spanId) {\n return otel.ROOT_CONTEXT\n }\n\n const spanContext: otel.SpanContext = {\n traceId,\n spanId,\n traceFlags: parseInt(flags ?? \"01\", 16),\n isRemote: true,\n }\n\n let context = trace.setSpanContext(otel.ROOT_CONTEXT, spanContext)\n\n if (ctx.baggage) {\n const baggageEntries: Record<string, otel.BaggageEntry> = {}\n for (const pair of ctx.baggage.split(\",\")) {\n const [key, value] = pair.split(\"=\", 2)\n if (key && value) {\n baggageEntries[decodeURIComponent(key)] = { value: decodeURIComponent(value) }\n }\n }\n const baggage = propagation.createBaggage(baggageEntries)\n context = propagation.setBaggage(context, baggage)\n }\n\n return context\n }\n}\n"],"mappings":"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","names":["otel","import_api","context","Instrumentation"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/sdk/context.ts","../src/sdk/init.ts","../src/sdk/instrumentations.ts","../src/sdk/processor.ts","../src/constants/attributes.ts","../src/constants/scope.ts","../src/env/env.ts","../src/sdk/redact.ts","../src/sdk/span-filter.ts"],"sourcesContent":["export * from \"./sdk/index.ts\"\n","import { type Context, context, createContextKey, trace } from \"@opentelemetry/api\"\nimport type { ContextOptions } from \"./types.ts\"\n\nexport const LATITUDE_CONTEXT_KEY = createContextKey(\"latitude-internal-context\")\nconst CAPTURE_TRACER_NAME = \"so.latitude.instrumentation.capture\"\n\ntype LatitudeContextData = {\n name: string | undefined\n tags: string[] | undefined\n metadata: Record<string, unknown> | undefined\n sessionId: string | undefined\n userId: string | undefined\n}\n\nexport function getLatitudeContext(ctx: Context): LatitudeContextData | undefined {\n return ctx.getValue(LATITUDE_CONTEXT_KEY) as LatitudeContextData | undefined\n}\n\nfunction mergeArrays<T>(a: T[] | undefined, b: T[] | undefined): T[] | undefined {\n if (!a && !b) return undefined\n if (!a) return b\n if (!b) return a\n return [...new Set([...a, ...b])]\n}\n\nexport function capture<T>(name: string, fn: () => T | Promise<T>, options: ContextOptions = {}): T | Promise<T> {\n const currentContext = context.active()\n const existingData = getLatitudeContext(currentContext)\n\n const mergedData: LatitudeContextData = {\n name: options.name ?? name,\n tags: mergeArrays(existingData?.tags, options.tags),\n metadata: { ...existingData?.metadata, ...options.metadata },\n sessionId: options.sessionId ?? existingData?.sessionId,\n userId: options.userId ?? existingData?.userId,\n }\n\n const newContext = currentContext.setValue(LATITUDE_CONTEXT_KEY, mergedData)\n const existingSpan = trace.getSpan(currentContext)\n\n if (existingSpan) {\n return context.with(newContext, fn)\n }\n\n const tracer = trace.getTracer(CAPTURE_TRACER_NAME)\n\n return tracer.startActiveSpan(name, { attributes: { \"latitude.capture.root\": true } }, newContext, (span) => {\n let result: T | Promise<T>\n try {\n result = fn()\n } catch (error) {\n span.recordException(error as Error)\n span.end()\n throw error\n }\n\n if (result instanceof Promise) {\n return result\n .catch((error) => {\n span.recordException(error as Error)\n throw error\n })\n .finally(() => {\n span.end()\n }) as T | Promise<T>\n }\n\n span.end()\n return result\n })\n}\n","import { context, propagation } from \"@opentelemetry/api\"\nimport { AsyncLocalStorageContextManager } from \"@opentelemetry/context-async-hooks\"\nimport { CompositePropagator, W3CBaggagePropagator, W3CTraceContextPropagator } from \"@opentelemetry/core\"\nimport { Resource } from \"@opentelemetry/resources\"\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\"\nimport { ATTR_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\"\nimport { registerLatitudeInstrumentations } from \"./instrumentations.ts\"\nimport { LatitudeSpanProcessor } from \"./processor.ts\"\nimport type { InitLatitudeOptions } from \"./types.ts\"\n\nconst SERVICE_NAME = process.env.npm_package_name || \"unknown\"\n\n/** Module-level flag to prevent duplicate signal handler registration on repeated initLatitude calls */\nlet shutdownHandlersRegistered = false\n\nexport function initLatitude(options: InitLatitudeOptions): {\n provider: NodeTracerProvider\n flush: () => Promise<void>\n shutdown: () => Promise<void>\n ready: Promise<void>\n} {\n const { apiKey, projectSlug, instrumentations = [], ...processorOptions } = options\n\n if (!apiKey || apiKey.trim() === \"\") {\n throw new Error(\"[Latitude] apiKey is required and cannot be empty\")\n }\n if (!projectSlug || projectSlug.trim() === \"\") {\n throw new Error(\"[Latitude] projectSlug is required and cannot be empty\")\n }\n\n const contextManager = new AsyncLocalStorageContextManager()\n contextManager.enable()\n\n const propagator = new CompositePropagator({\n propagators: [new W3CTraceContextPropagator(), new W3CBaggagePropagator()],\n })\n\n context.setGlobalContextManager(contextManager)\n propagation.setGlobalPropagator(propagator)\n\n const provider = new NodeTracerProvider({\n resource: new Resource({\n [ATTR_SERVICE_NAME]: SERVICE_NAME,\n }),\n spanProcessors: [new LatitudeSpanProcessor(apiKey, projectSlug, processorOptions)],\n })\n\n provider.register()\n\n const ready = registerLatitudeInstrumentations({\n instrumentations,\n tracerProvider: provider,\n }).catch((err) => {\n console.warn(\"[Latitude] Failed to register instrumentations:\", err)\n })\n\n const shutdown = async (): Promise<void> => {\n await provider.shutdown()\n }\n\n const flush = async (): Promise<void> => {\n await provider.forceFlush()\n }\n\n const handleShutdown = async () => {\n try {\n await shutdown()\n } catch (err) {\n console.error(\"Error during Latitude Telemetry shutdown:\", err)\n }\n }\n\n if (!shutdownHandlersRegistered) {\n process.once(\"SIGTERM\", handleShutdown)\n process.once(\"SIGINT\", handleShutdown)\n shutdownHandlersRegistered = true\n }\n\n return {\n provider,\n flush,\n shutdown,\n ready,\n }\n}\n","import type { TracerProvider } from \"@opentelemetry/api\"\nimport { type Instrumentation, registerInstrumentations } from \"@opentelemetry/instrumentation\"\nimport { AnthropicInstrumentation } from \"@traceloop/instrumentation-anthropic\"\nimport { BedrockInstrumentation } from \"@traceloop/instrumentation-bedrock\"\nimport { CohereInstrumentation } from \"@traceloop/instrumentation-cohere\"\nimport { LangChainInstrumentation } from \"@traceloop/instrumentation-langchain\"\nimport { LlamaIndexInstrumentation } from \"@traceloop/instrumentation-llamaindex\"\nimport { OpenAIInstrumentation } from \"@traceloop/instrumentation-openai\"\nimport { TogetherInstrumentation } from \"@traceloop/instrumentation-together\"\nimport { AIPlatformInstrumentation, VertexAIInstrumentation } from \"@traceloop/instrumentation-vertexai\"\n\n/**\n * Supported LLM instrumentation types.\n * Use these string identifiers to enable auto-instrumentation.\n */\nexport type InstrumentationType =\n | \"openai\"\n | \"anthropic\"\n | \"bedrock\"\n | \"cohere\"\n | \"langchain\"\n | \"llamaindex\"\n | \"togetherai\"\n | \"vertexai\"\n | \"aiplatform\"\n\n/**\n * Minimal interface for LLM instrumentation instances.\n * Extends OpenTelemetry's Instrumentation interface.\n */\ninterface LlmInstrumentation extends Instrumentation {\n manuallyInstrument?(module: unknown): void\n}\n\n/**\n * Options for creating LLM instrumentations.\n */\ninterface CreateInstrumentationsOptions {\n /** List of instrumentation types to enable. */\n instrumentations: InstrumentationType[]\n /**\n * Optional module references for auto-instrumentation.\n * If not provided, the instrumentation will attempt to require the module.\n * Used for Traceloop-based instrumentations.\n */\n modules?: Partial<Record<InstrumentationType, unknown>>\n /**\n * Per-instrumentation token enrichment settings.\n * @default { openai: true }\n */\n enrichTokens?: Partial<Record<InstrumentationType, boolean>>\n}\n\ninterface InstrumentationConfig {\n ctor: new (config?: Record<string, unknown>) => LlmInstrumentation\n moduleName: string\n defaultEnrichTokens?: boolean\n}\n\nconst INSTRUMENTATION_MAP: Record<InstrumentationType, InstrumentationConfig> = {\n openai: { ctor: OpenAIInstrumentation, moduleName: \"openai\", defaultEnrichTokens: true },\n anthropic: { ctor: AnthropicInstrumentation, moduleName: \"@anthropic-ai/sdk\" },\n bedrock: { ctor: BedrockInstrumentation, moduleName: \"@aws-sdk/client-bedrock-runtime\" },\n cohere: { ctor: CohereInstrumentation, moduleName: \"cohere-ai\" },\n langchain: { ctor: LangChainInstrumentation, moduleName: \"langchain\" },\n llamaindex: { ctor: LlamaIndexInstrumentation, moduleName: \"llamaindex\" },\n togetherai: { ctor: TogetherInstrumentation, moduleName: \"together-ai\", defaultEnrichTokens: false },\n vertexai: { ctor: VertexAIInstrumentation, moduleName: \"@google-cloud/vertexai\" },\n aiplatform: { ctor: AIPlatformInstrumentation, moduleName: \"@google-cloud/aiplatform\" },\n}\n\n/**\n * Internal function to create LLM instrumentation instances.\n * Not exported publicly - use registerLatitudeInstrumentations instead.\n */\nasync function createLatitudeInstrumentations(options: CreateInstrumentationsOptions): Promise<LlmInstrumentation[]> {\n const result: LlmInstrumentation[] = []\n\n for (const type of options.instrumentations) {\n const config = INSTRUMENTATION_MAP[type]\n if (!config) {\n console.warn(`[Latitude] Unknown instrumentation type: ${type}`)\n continue\n }\n\n const enrichTokens = options.enrichTokens?.[type] ?? config.defaultEnrichTokens\n const inst = new config.ctor(enrichTokens !== undefined ? { enrichTokens } : undefined)\n\n // Get module from explicit options or try to auto-require\n const moduleRef = options.modules?.[type] ?? (await tryRequire(config.moduleName))\n if (!moduleRef) {\n console.warn(\n `[Latitude] Module not found for ${type}: ${config.moduleName}. Install it or pass it explicitly in 'modules'.`,\n )\n continue\n }\n inst.manuallyInstrument?.(moduleRef)\n\n result.push(inst)\n }\n\n return result\n}\n\nasync function tryRequire(moduleName: string): Promise<unknown | undefined> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(moduleName)\n } catch {\n // Fallback to dynamic import for ESM environments\n try {\n const mod = await import(moduleName)\n return mod.default ?? mod\n } catch {\n return undefined\n }\n }\n}\n\n/**\n * Registers LLM instrumentations with the global OpenTelemetry instrumentation registry.\n *\n * This is a convenience wrapper around `createLatitudeInstrumentations` and\n * `@opentelemetry/instrumentation`'s `registerInstrumentations`.\n *\n * @example\n * ```typescript\n * import { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\"\n * import { registerLatitudeInstrumentations, LatitudeSpanProcessor } from \"@latitude-data/telemetry\"\n *\n * const provider = new NodeTracerProvider({\n * spanProcessors: [new LatitudeSpanProcessor(apiKey, projectSlug)],\n * })\n *\n * await registerLatitudeInstrumentations({\n * instrumentations: [\"openai\", \"anthropic\"],\n * tracerProvider: provider,\n * })\n *\n * provider.register()\n * ```\n */\nexport async function registerLatitudeInstrumentations(\n options: CreateInstrumentationsOptions & { tracerProvider: TracerProvider },\n): Promise<void> {\n const instrumentations = await createLatitudeInstrumentations(options)\n registerInstrumentations({\n instrumentations,\n tracerProvider: options.tracerProvider,\n })\n}\n","import type { Context } from \"@opentelemetry/api\"\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\"\nimport {\n BatchSpanProcessor,\n type ReadableSpan,\n SimpleSpanProcessor,\n type Span,\n type SpanProcessor,\n} from \"@opentelemetry/sdk-trace-node\"\nimport { ATTRIBUTES } from \"../constants/index.ts\"\nimport { env } from \"../env/index.ts\"\nimport { getLatitudeContext } from \"./context.ts\"\nimport { DEFAULT_REDACT_SPAN_PROCESSOR, RedactSpanProcessor } from \"./redact.ts\"\nimport {\n buildShouldExportSpanFromFields,\n ExportFilterSpanProcessor,\n RedactThenExportSpanProcessor,\n} from \"./span-filter.ts\"\nimport type { LatitudeSpanProcessorOptions } from \"./types.ts\"\n\nexport class LatitudeSpanProcessor implements SpanProcessor {\n private readonly tail: SpanProcessor\n\n constructor(apiKey: string, projectSlug: string, options?: LatitudeSpanProcessorOptions) {\n if (!apiKey || apiKey.trim() === \"\") {\n throw new Error(\"[Latitude] apiKey is required and cannot be empty\")\n }\n if (!projectSlug || projectSlug.trim() === \"\") {\n throw new Error(\"[Latitude] projectSlug is required and cannot be empty\")\n }\n\n const exporter =\n options?.exporter ??\n new OTLPTraceExporter({\n url: `${env.EXPORTER_URL}/v1/traces`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"X-Latitude-Project\": projectSlug,\n },\n timeoutMillis: 30_000,\n })\n\n const redact = options?.disableRedact\n ? null\n : options?.redact\n ? new RedactSpanProcessor(options.redact)\n : DEFAULT_REDACT_SPAN_PROCESSOR()\n\n const batchOrSimple = options?.disableBatch ? new SimpleSpanProcessor(exporter) : new BatchSpanProcessor(exporter)\n\n const shouldExport = buildShouldExportSpanFromFields({\n disableSmartFilter: options?.disableSmartFilter,\n shouldExportSpan: options?.shouldExportSpan,\n blockedInstrumentationScopes: options?.blockedInstrumentationScopes,\n })\n\n const redactThenExport = new RedactThenExportSpanProcessor(redact, batchOrSimple)\n this.tail = new ExportFilterSpanProcessor(shouldExport, redactThenExport)\n }\n\n onStart(span: Span, parentContext: Context): void {\n const latitudeData = getLatitudeContext(parentContext)\n\n if (latitudeData) {\n if (latitudeData.name) {\n span.setAttribute(ATTRIBUTES.name, latitudeData.name)\n // Only update span name for the capture root span (has latitude.capture.root attr)\n // Child spans keep their original names (database.query, business.validate, etc.)\n if (span.attributes[\"latitude.capture.root\"]) {\n span.updateName(latitudeData.name)\n }\n }\n if (latitudeData.tags && latitudeData.tags.length > 0) {\n span.setAttribute(ATTRIBUTES.tags, JSON.stringify(latitudeData.tags))\n }\n if (latitudeData.metadata && Object.keys(latitudeData.metadata).length > 0) {\n span.setAttribute(ATTRIBUTES.metadata, JSON.stringify(latitudeData.metadata))\n }\n if (latitudeData.sessionId) {\n span.setAttribute(ATTRIBUTES.sessionId, latitudeData.sessionId)\n }\n if (latitudeData.userId) {\n span.setAttribute(ATTRIBUTES.userId, latitudeData.userId)\n }\n }\n\n this.tail.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n this.tail.onEnd(span)\n }\n\n async forceFlush(): Promise<void> {\n await this.tail.forceFlush()\n }\n\n async shutdown(): Promise<void> {\n await this.tail.shutdown()\n }\n}\n","export const ATTRIBUTES = {\n name: \"latitude.capture.name\",\n tags: \"latitude.tags\",\n metadata: \"latitude.metadata\",\n sessionId: \"session.id\",\n userId: \"user.id\",\n} as const\n","export const SCOPE_LATITUDE = \"so.latitude.instrumentation\"\n\nexport enum InstrumentationScope {\n Manual = \"manual\",\n OpenAI = \"openai\",\n Anthropic = \"anthropic\",\n AzureOpenAI = \"azure\",\n VercelAI = \"vercelai\",\n VertexAI = \"vertexai\",\n AIPlatform = \"aiplatform\",\n MistralAI = \"mistralai\",\n Bedrock = \"bedrock\",\n Sagemaker = \"sagemaker\",\n TogetherAI = \"togetherai\",\n Replicate = \"replicate\",\n Groq = \"groq\",\n Cohere = \"cohere\",\n LiteLLM = \"litellm\",\n Langchain = \"langchain\",\n LlamaIndex = \"llamaindex\",\n DSPy = \"dspy\",\n Haystack = \"haystack\",\n Ollama = \"ollama\",\n Transformers = \"transformers\",\n AlephAlpha = \"alephalpha\",\n}\n","const DEFAULT_EXPORTER_URL =\n {\n production: \"https://ingest.latitude.so\",\n development: \"http://localhost:3002\",\n test: \"http://localhost:3002\",\n }[process.env.NODE_ENV ?? \"development\"] ?? \"http://localhost:3002\"\n\nfunction getExporterUrl() {\n if (process.env.LATITUDE_TELEMETRY_URL) {\n return process.env.LATITUDE_TELEMETRY_URL\n }\n\n return DEFAULT_EXPORTER_URL\n}\n\nexport const env = { EXPORTER_URL: getExporterUrl() } as const\n","import type * as otel from \"@opentelemetry/api\"\nimport type { ReadableSpan, Span, SpanProcessor } from \"@opentelemetry/sdk-trace-node\"\n\nexport interface RedactSpanProcessorOptions {\n attributes: (string | RegExp)[]\n mask?: (attribute: string, value: unknown) => string\n}\n\nexport class RedactSpanProcessor implements SpanProcessor {\n private options: RedactSpanProcessorOptions\n\n constructor(options: RedactSpanProcessorOptions) {\n this.options = options\n\n if (!options.mask) {\n this.options.mask = (_attribute: string, _value: unknown) => \"******\"\n }\n }\n\n onStart(_span: Span, _context: otel.Context): void {\n // Noop\n }\n\n onEnd(span: ReadableSpan): void {\n Object.assign(span.attributes, this.redactAttributes(span.attributes))\n for (const event of span.events) {\n if (!event.attributes) continue\n Object.assign(event.attributes, this.redactAttributes(event.attributes))\n }\n for (const link of span.links) {\n if (!link.attributes) continue\n Object.assign(link.attributes, this.redactAttributes(link.attributes))\n }\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve()\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve()\n }\n\n private shouldRedact(attribute: string) {\n return this.options.attributes.some((pattern) => {\n if (typeof pattern === \"string\") {\n return attribute === pattern\n } else if (pattern instanceof RegExp) {\n return pattern.test(attribute)\n }\n return false\n })\n }\n\n private redactAttributes(attributes: otel.Attributes) {\n const redacted: otel.Attributes = {}\n\n for (const [key, value] of Object.entries(attributes)) {\n if (this.shouldRedact(key)) {\n redacted[key] = this.options.mask?.(key, value)\n }\n }\n\n return redacted\n }\n}\n\nexport const DEFAULT_REDACT_SPAN_PROCESSOR = () =>\n new RedactSpanProcessor({\n attributes: [\n // HTTP security headers\n /^http\\.request\\.header\\.authorization$/i,\n /^http\\.request\\.header\\.cookie$/i,\n /^http\\.request\\.header\\.x[-_]api[-_]key$/i,\n // Database statements may contain sensitive data\n /^db\\.statement$/i,\n ],\n })\n","import type { Context } from \"@opentelemetry/api\"\nimport type { ReadableSpan, Span, SpanProcessor } from \"@opentelemetry/sdk-trace-node\"\nimport { SCOPE_LATITUDE } from \"../constants/scope.ts\"\n\n/** OpenTelemetry GenAI semantic convention attribute prefix. */\nconst GEN_AI_PREFIX = \"gen_ai.\"\n\n/** Legacy / OpenInference-style LLM attribute prefix. */\nconst LLM_PREFIX = \"llm.\"\n\nconst OPENINFERENCE_KIND = \"openinference.span.kind\"\n\n/** OTel Python instrumentation scope prefixes for LLM-related instrumentors we support. */\nconst OTEL_LLM_INSTRUMENTATION_SCOPE_PREFIXES = [\n \"opentelemetry.instrumentation.alephalpha\",\n \"opentelemetry.instrumentation.anthropic\",\n \"opentelemetry.instrumentation.bedrock\",\n \"opentelemetry.instrumentation.cohere\",\n \"opentelemetry.instrumentation.crewai\",\n \"opentelemetry.instrumentation.google_generativeai\",\n \"opentelemetry.instrumentation.groq\",\n \"opentelemetry.instrumentation.haystack\",\n \"opentelemetry.instrumentation.langchain\",\n \"opentelemetry.instrumentation.llamaindex\",\n \"opentelemetry.instrumentation.mistralai\",\n \"opentelemetry.instrumentation.ollama\",\n \"opentelemetry.instrumentation.openai\",\n \"opentelemetry.instrumentation.replicate\",\n \"opentelemetry.instrumentation.sagemaker\",\n \"opentelemetry.instrumentation.together\",\n \"opentelemetry.instrumentation.transformers\",\n \"opentelemetry.instrumentation.vertexai\",\n \"opentelemetry.instrumentation.watsonx\",\n \"openinference.instrumentation\",\n] as const\n\n/** Substrings in scope names that indicate LLM / GenAI instrumentation (e.g. Traceloop JS). */\nconst LLM_SCOPE_SUBSTRINGS = [\"openinference\", \"traceloop\", \"langsmith\", \"litellm\"] as const\n\nexport type SmartFilterOptions = {\n /**\n * When true, all spans are exported (legacy behavior).\n * Default false — only LLM-relevant spans are exported.\n */\n disableSmartFilter?: boolean\n /**\n * When smart filter is on, also export spans for which this returns true\n * (in addition to {@link isDefaultExportSpan}).\n */\n shouldExportSpan?: (span: ReadableSpan) => boolean\n /** Instrumentation scope names to drop (exact match) even if they pass the default predicate. */\n blockedInstrumentationScopes?: string[]\n}\n\n/** Input for {@link buildShouldExportSpanFromFields}; allows `undefined` field values for ergonomics. */\nexport type SmartFilterFieldsInput = {\n disableSmartFilter?: boolean | undefined\n shouldExportSpan?: ((span: ReadableSpan) => boolean) | undefined\n blockedInstrumentationScopes?: string[] | undefined\n}\n\n/**\n * Builds the export predicate from loose option fields (`exactOptionalPropertyTypes`-safe call sites).\n */\nexport function buildShouldExportSpanFromFields(fields: SmartFilterFieldsInput): (span: ReadableSpan) => boolean {\n return buildShouldExportSpan({\n ...(fields.disableSmartFilter !== undefined ? { disableSmartFilter: fields.disableSmartFilter } : {}),\n ...(fields.shouldExportSpan !== undefined ? { shouldExportSpan: fields.shouldExportSpan } : {}),\n ...(fields.blockedInstrumentationScopes !== undefined\n ? { blockedInstrumentationScopes: fields.blockedInstrumentationScopes }\n : {}),\n })\n}\n\nfunction attributeKeys(span: ReadableSpan): string[] {\n const attrs = span.attributes\n if (!attrs || typeof attrs !== \"object\") return []\n return Object.keys(attrs as Record<string, unknown>)\n}\n\nfunction instrumentationScopeName(span: ReadableSpan): string {\n return span.instrumentationLibrary?.name ?? \"\"\n}\n\n/** True if the span uses OpenTelemetry GenAI semantic conventions or common LLM attribute namespaces. */\nexport function isGenAiOrLlmAttributeSpan(span: ReadableSpan): boolean {\n for (const key of attributeKeys(span)) {\n if (key.startsWith(GEN_AI_PREFIX) || key.startsWith(LLM_PREFIX)) return true\n if (key === OPENINFERENCE_KIND || key.startsWith(\"openinference.\")) return true\n // Vercel AI SDK uses ai.* prefix\n if (key.startsWith(\"ai.\")) return true\n // Latitude context attributes\n if (key.startsWith(\"latitude.\")) return true\n }\n return false\n}\n\n/** True if the span was created with Latitude's tracer scopes. */\nexport function isLatitudeInstrumentationSpan(span: ReadableSpan): boolean {\n const name = instrumentationScopeName(span)\n return name === SCOPE_LATITUDE || name.startsWith(`${SCOPE_LATITUDE}.`)\n}\n\nfunction isKnownLlmInstrumentationScope(span: ReadableSpan): boolean {\n const name = instrumentationScopeName(span)\n if (!name) return false\n for (const prefix of OTEL_LLM_INSTRUMENTATION_SCOPE_PREFIXES) {\n if (name === prefix || name.startsWith(`${prefix}.`)) return true\n }\n const lower = name.toLowerCase()\n for (const part of LLM_SCOPE_SUBSTRINGS) {\n if (lower.includes(part)) return true\n }\n return false\n}\n\n/**\n * Default export predicate (smart filter): Latitude scopes, GenAI / LLM attributes,\n * or known LLM instrumentation scopes.\n */\nexport function isDefaultExportSpan(span: ReadableSpan): boolean {\n if (isLatitudeInstrumentationSpan(span)) return true\n if (isGenAiOrLlmAttributeSpan(span)) return true\n if (isKnownLlmInstrumentationScope(span)) return true\n return false\n}\n\nexport function buildShouldExportSpan(options: SmartFilterOptions): (span: ReadableSpan) => boolean {\n if (options.disableSmartFilter) return () => true\n const blocked = new Set(options.blockedInstrumentationScopes ?? [])\n const extra = options.shouldExportSpan\n return (span: ReadableSpan) => {\n const scope = instrumentationScopeName(span)\n if (blocked.has(scope)) return false\n if (isDefaultExportSpan(span)) return true\n if (extra?.(span)) return true\n return false\n }\n}\n\n/**\n * Drops spans that fail the export predicate before passing them to the inner processor.\n * Inner processor should perform redaction and export.\n */\nexport class ExportFilterSpanProcessor implements SpanProcessor {\n private readonly shouldExport: (span: ReadableSpan) => boolean\n private readonly inner: SpanProcessor\n\n constructor(shouldExport: (span: ReadableSpan) => boolean, inner: SpanProcessor) {\n this.shouldExport = shouldExport\n this.inner = inner\n }\n\n onStart(span: Span, parentContext: Context): void {\n this.inner.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n if (!this.shouldExport(span)) return\n this.inner.onEnd(span)\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush()\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown()\n }\n}\n\n/** Runs optional redaction then the export processor (batch/simple). */\nexport class RedactThenExportSpanProcessor implements SpanProcessor {\n private readonly redact: SpanProcessor | null\n private readonly exportProcessor: SpanProcessor\n\n constructor(redact: SpanProcessor | null, exportProcessor: SpanProcessor) {\n this.redact = redact\n this.exportProcessor = exportProcessor\n }\n\n onStart(span: Span, parentContext: Context): void {\n this.redact?.onStart(span, parentContext)\n this.exportProcessor.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n this.redact?.onEnd(span)\n this.exportProcessor.onEnd(span)\n }\n\n forceFlush(): Promise<void> {\n return this.exportProcessor.forceFlush()\n }\n\n shutdown(): Promise<void> {\n return this.exportProcessor.shutdown()\n }\n}\n"],"mappings":"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","names":["import_api","import_sdk_trace_node"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,33 +1,56 @@
|
|
|
1
|
+
import { SpanProcessor, Span, ReadableSpan, SpanExporter, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
|
|
1
2
|
import * as otel from '@opentelemetry/api';
|
|
2
|
-
import {
|
|
3
|
-
import { SpanProcessor, Span, ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-node';
|
|
4
|
-
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
3
|
+
import { TracerProvider, Context } from '@opentelemetry/api';
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
baggage?: string;
|
|
29
|
-
}): otel.Context;
|
|
5
|
+
/**
|
|
6
|
+
* Supported LLM instrumentation types.
|
|
7
|
+
* Use these string identifiers to enable auto-instrumentation.
|
|
8
|
+
*/
|
|
9
|
+
type InstrumentationType = "openai" | "anthropic" | "bedrock" | "cohere" | "langchain" | "llamaindex" | "togetherai" | "vertexai" | "aiplatform";
|
|
10
|
+
/**
|
|
11
|
+
* Options for creating LLM instrumentations.
|
|
12
|
+
*/
|
|
13
|
+
interface CreateInstrumentationsOptions {
|
|
14
|
+
/** List of instrumentation types to enable. */
|
|
15
|
+
instrumentations: InstrumentationType[];
|
|
16
|
+
/**
|
|
17
|
+
* Optional module references for auto-instrumentation.
|
|
18
|
+
* If not provided, the instrumentation will attempt to require the module.
|
|
19
|
+
* Used for Traceloop-based instrumentations.
|
|
20
|
+
*/
|
|
21
|
+
modules?: Partial<Record<InstrumentationType, unknown>>;
|
|
22
|
+
/**
|
|
23
|
+
* Per-instrumentation token enrichment settings.
|
|
24
|
+
* @default { openai: true }
|
|
25
|
+
*/
|
|
26
|
+
enrichTokens?: Partial<Record<InstrumentationType, boolean>>;
|
|
30
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Registers LLM instrumentations with the global OpenTelemetry instrumentation registry.
|
|
30
|
+
*
|
|
31
|
+
* This is a convenience wrapper around `createLatitudeInstrumentations` and
|
|
32
|
+
* `@opentelemetry/instrumentation`'s `registerInstrumentations`.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node"
|
|
37
|
+
* import { registerLatitudeInstrumentations, LatitudeSpanProcessor } from "@latitude-data/telemetry"
|
|
38
|
+
*
|
|
39
|
+
* const provider = new NodeTracerProvider({
|
|
40
|
+
* spanProcessors: [new LatitudeSpanProcessor(apiKey, projectSlug)],
|
|
41
|
+
* })
|
|
42
|
+
*
|
|
43
|
+
* await registerLatitudeInstrumentations({
|
|
44
|
+
* instrumentations: ["openai", "anthropic"],
|
|
45
|
+
* tracerProvider: provider,
|
|
46
|
+
* })
|
|
47
|
+
*
|
|
48
|
+
* provider.register()
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
declare function registerLatitudeInstrumentations(options: CreateInstrumentationsOptions & {
|
|
52
|
+
tracerProvider: TracerProvider;
|
|
53
|
+
}): Promise<void>;
|
|
31
54
|
|
|
32
55
|
interface RedactSpanProcessorOptions {
|
|
33
56
|
attributes: (string | RegExp)[];
|
|
@@ -43,81 +66,104 @@ declare class RedactSpanProcessor implements SpanProcessor {
|
|
|
43
66
|
private shouldRedact;
|
|
44
67
|
private redactAttributes;
|
|
45
68
|
}
|
|
46
|
-
declare const DEFAULT_REDACT_SPAN_PROCESSOR: () => RedactSpanProcessor;
|
|
47
69
|
|
|
48
|
-
type
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
type SmartFilterOptions = {
|
|
71
|
+
/**
|
|
72
|
+
* When true, all spans are exported (legacy behavior).
|
|
73
|
+
* Default false — only LLM-relevant spans are exported.
|
|
74
|
+
*/
|
|
75
|
+
disableSmartFilter?: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* When smart filter is on, also export spans for which this returns true
|
|
78
|
+
* (in addition to {@link isDefaultExportSpan}).
|
|
79
|
+
*/
|
|
80
|
+
shouldExportSpan?: (span: ReadableSpan) => boolean;
|
|
81
|
+
/** Instrumentation scope names to drop (exact match) even if they pass the default predicate. */
|
|
82
|
+
blockedInstrumentationScopes?: string[];
|
|
83
|
+
};
|
|
84
|
+
/** Input for {@link buildShouldExportSpanFromFields}; allows `undefined` field values for ergonomics. */
|
|
85
|
+
type SmartFilterFieldsInput = {
|
|
86
|
+
disableSmartFilter?: boolean | undefined;
|
|
87
|
+
shouldExportSpan?: ((span: ReadableSpan) => boolean) | undefined;
|
|
88
|
+
blockedInstrumentationScopes?: string[] | undefined;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Builds the export predicate from loose option fields (`exactOptionalPropertyTypes`-safe call sites).
|
|
92
|
+
*/
|
|
93
|
+
declare function buildShouldExportSpanFromFields(fields: SmartFilterFieldsInput): (span: ReadableSpan) => boolean;
|
|
94
|
+
/** True if the span uses OpenTelemetry GenAI semantic conventions or common LLM attribute namespaces. */
|
|
95
|
+
declare function isGenAiOrLlmAttributeSpan(span: ReadableSpan): boolean;
|
|
96
|
+
/** True if the span was created with Latitude's tracer scopes. */
|
|
97
|
+
declare function isLatitudeInstrumentationSpan(span: ReadableSpan): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Default export predicate (smart filter): Latitude scopes, GenAI / LLM attributes,
|
|
100
|
+
* or known LLM instrumentation scopes.
|
|
101
|
+
*/
|
|
102
|
+
declare function isDefaultExportSpan(span: ReadableSpan): boolean;
|
|
103
|
+
declare function buildShouldExportSpan(options: SmartFilterOptions): (span: ReadableSpan) => boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Drops spans that fail the export predicate before passing them to the inner processor.
|
|
106
|
+
* Inner processor should perform redaction and export.
|
|
107
|
+
*/
|
|
108
|
+
declare class ExportFilterSpanProcessor implements SpanProcessor {
|
|
109
|
+
private readonly shouldExport;
|
|
110
|
+
private readonly inner;
|
|
111
|
+
constructor(shouldExport: (span: ReadableSpan) => boolean, inner: SpanProcessor);
|
|
112
|
+
onStart(span: Span, parentContext: Context): void;
|
|
113
|
+
onEnd(span: ReadableSpan): void;
|
|
114
|
+
forceFlush(): Promise<void>;
|
|
115
|
+
shutdown(): Promise<void>;
|
|
64
116
|
}
|
|
65
|
-
|
|
66
|
-
declare
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
OpenAI = "openai",
|
|
75
|
-
TogetherAI = "togetherai",
|
|
76
|
-
VertexAI = "vertexai"
|
|
117
|
+
/** Runs optional redaction then the export processor (batch/simple). */
|
|
118
|
+
declare class RedactThenExportSpanProcessor implements SpanProcessor {
|
|
119
|
+
private readonly redact;
|
|
120
|
+
private readonly exportProcessor;
|
|
121
|
+
constructor(redact: SpanProcessor | null, exportProcessor: SpanProcessor);
|
|
122
|
+
onStart(span: Span, parentContext: Context): void;
|
|
123
|
+
onEnd(span: ReadableSpan): void;
|
|
124
|
+
forceFlush(): Promise<void>;
|
|
125
|
+
shutdown(): Promise<void>;
|
|
77
126
|
}
|
|
78
|
-
|
|
79
|
-
|
|
127
|
+
|
|
128
|
+
type ContextOptions = {
|
|
129
|
+
name?: string;
|
|
130
|
+
tags?: string[];
|
|
131
|
+
metadata?: Record<string, unknown>;
|
|
132
|
+
sessionId?: string;
|
|
133
|
+
userId?: string;
|
|
134
|
+
};
|
|
135
|
+
type InitLatitudeOptions = SmartFilterOptions & {
|
|
136
|
+
apiKey: string;
|
|
137
|
+
projectSlug: string;
|
|
138
|
+
instrumentations?: InstrumentationType[];
|
|
139
|
+
disableRedact?: boolean;
|
|
140
|
+
redact?: RedactSpanProcessorOptions;
|
|
80
141
|
disableBatch?: boolean;
|
|
81
142
|
exporter?: SpanExporter;
|
|
82
|
-
processors?: SpanProcessor[];
|
|
83
|
-
propagators?: TextMapPropagator[];
|
|
84
|
-
instrumentations?: {
|
|
85
|
-
[Instrumentation.AIPlatform]?: unknown;
|
|
86
|
-
[Instrumentation.Anthropic]?: unknown;
|
|
87
|
-
[Instrumentation.Bedrock]?: unknown;
|
|
88
|
-
[Instrumentation.Cohere]?: unknown;
|
|
89
|
-
[Instrumentation.OpenAI]?: unknown;
|
|
90
|
-
[Instrumentation.LlamaIndex]?: unknown;
|
|
91
|
-
[Instrumentation.TogetherAI]?: unknown;
|
|
92
|
-
[Instrumentation.VertexAI]?: unknown;
|
|
93
|
-
[Instrumentation.Langchain]?: {
|
|
94
|
-
callbackManagerModule?: unknown;
|
|
95
|
-
};
|
|
96
|
-
};
|
|
97
143
|
};
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
144
|
+
type LatitudeSpanProcessorOptions = SmartFilterOptions & {
|
|
145
|
+
disableRedact?: boolean;
|
|
146
|
+
redact?: RedactSpanProcessorOptions;
|
|
147
|
+
disableBatch?: boolean;
|
|
148
|
+
exporter?: SpanExporter;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
declare function capture<T>(name: string, fn: () => T | Promise<T>, options?: ContextOptions): T | Promise<T>;
|
|
152
|
+
|
|
153
|
+
declare function initLatitude(options: InitLatitudeOptions): {
|
|
154
|
+
provider: NodeTracerProvider;
|
|
155
|
+
flush: () => Promise<void>;
|
|
156
|
+
shutdown: () => Promise<void>;
|
|
157
|
+
ready: Promise<void>;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
declare class LatitudeSpanProcessor implements SpanProcessor {
|
|
161
|
+
private readonly tail;
|
|
162
|
+
constructor(apiKey: string, projectSlug: string, options?: LatitudeSpanProcessorOptions);
|
|
163
|
+
onStart(span: Span, parentContext: Context): void;
|
|
164
|
+
onEnd(span: ReadableSpan): void;
|
|
165
|
+
forceFlush(): Promise<void>;
|
|
109
166
|
shutdown(): Promise<void>;
|
|
110
|
-
private initProviderInstrumentations;
|
|
111
|
-
/**
|
|
112
|
-
* Wrap a block of code with trace-wide context attributes.
|
|
113
|
-
* Baggage entries (tags, metadata, sessionId, userId) are propagated
|
|
114
|
-
* to all spans created within the callback via BaggageSpanProcessor.
|
|
115
|
-
*
|
|
116
|
-
* If there is no active span, a root span is created so all child spans
|
|
117
|
-
* are grouped under a single trace. If a span is already active, only
|
|
118
|
-
* baggage is set without creating an extra wrapper span.
|
|
119
|
-
*/
|
|
120
|
-
capture<T>(options: CaptureOptions, fn: (ctx: TelemetryContext) => T | Promise<T>): Promise<T>;
|
|
121
167
|
}
|
|
122
168
|
|
|
123
|
-
export { type
|
|
169
|
+
export { type ContextOptions, ExportFilterSpanProcessor, type InitLatitudeOptions, type InstrumentationType, LatitudeSpanProcessor, type LatitudeSpanProcessorOptions, RedactSpanProcessor, type RedactSpanProcessorOptions, RedactThenExportSpanProcessor, type SmartFilterFieldsInput, type SmartFilterOptions, buildShouldExportSpan, buildShouldExportSpanFromFields, capture, initLatitude, isDefaultExportSpan, isGenAiOrLlmAttributeSpan, isLatitudeInstrumentationSpan, registerLatitudeInstrumentations };
|