From c52ae1f9daead6c542bedd1bb8e9d167ec3e5c67 Mon Sep 17 00:00:00 2001 From: Chris Toshok Date: Tue, 18 Feb 2025 16:18:03 -0800 Subject: [PATCH] Fix otel errors (#31) Running the prior code in wrangler (but _not_ `npm run dev`) was generating errors during otel initialization. I was ultimately unable to figure out why, or how to fix them: ``` (warn) Initializing OpenTelemetry (error) Error initializing OpenTelemetry TypeError: Class constructor OTLPExporterBase2 cannot be invoked without 'new' ``` In the end, it was easier to just boil the ocean a little: With claude's help, write a custom otlp exporter and use that. Also use BasicTracerProvider instead of WebTracerProvider. This version is enough to generate spans from within local wrangler. --- app/lib/.server/otel.ts | 197 ++++++++++++++++++++++++++++++++++++++-- package.json | 8 +- pnpm-lock.yaml | 165 +++++++++++++++++++++------------ 3 files changed, 300 insertions(+), 70 deletions(-) diff --git a/app/lib/.server/otel.ts b/app/lib/.server/otel.ts index b48fbb72..9da00de8 100644 --- a/app/lib/.server/otel.ts +++ b/app/lib/.server/otel.ts @@ -1,13 +1,189 @@ -import { Resource } from '@opentelemetry/resources'; -import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions'; -import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'; -import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'; -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; -import { ZoneContextManager } from '@opentelemetry/context-zone'; -import { SpanStatusCode, type Attributes, context, trace } from '@opentelemetry/api'; import type { Tracer } from '@opentelemetry/api'; +import { SpanStatusCode, type Attributes, context, trace } from '@opentelemetry/api'; +import { ZoneContextManager } from '@opentelemetry/context-zone'; +import type { ExportResult } from '@opentelemetry/core'; +import { ExportResultCode } from '@opentelemetry/core'; +import type { ExportServiceError, OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base'; +import { OTLPExporterError } from '@opentelemetry/otlp-exporter-base'; +import { createExportTraceServiceRequest } from '@opentelemetry/otlp-transformer'; +import { Resource } from '@opentelemetry/resources'; +import type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base'; +import { ConsoleSpanExporter, SimpleSpanProcessor, BasicTracerProvider } from '@opentelemetry/sdk-trace-base'; +import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions'; + import type { AppLoadContext } from '@remix-run/cloudflare'; +// used to implement concurrencyLimit in the otlp exporter +class Semaphore { + private _permits: number; + private _tasks: (() => void)[] = []; + + constructor(permits: number) { + this._permits = permits; + } + + async acquire(): Promise { + if (this._permits > 0) { + this._permits -= 1; + return Promise.resolve(); + } + + return new Promise((resolve) => { + this._tasks.push(resolve); + }); + } + + release(): void { + this._permits += 1; + + const nextTask = this._tasks.shift(); + + if (nextTask) { + this._permits -= 1; + nextTask(); + } + } +} + +interface OTLPExporterConfig extends OTLPExporterConfigBase { + retryCount?: number; + retryIntervalMillis?: number; +} + +const defaultOptions = { + url: 'https://api.honeycomb.io/v1/traces', + concurrencyLimit: 5, + timeoutMillis: 5000, + headers: {}, + retryCount: 3, + retryIntervalMillis: 100, +} as const; + +export class OTLPExporter implements SpanExporter { + private readonly _config: OTLPExporterConfig; + private _shutdownOnce: boolean; + private _activeExports: Promise[]; + private _semaphore: Semaphore; + + constructor(config: OTLPExporterConfig) { + this._config = { + ...config, + headers: { ...config.headers }, + }; + this._shutdownOnce = false; + this._activeExports = []; + this._semaphore = new Semaphore(this._config.concurrencyLimit || defaultOptions.concurrencyLimit); + } + + export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void { + if (this._shutdownOnce) { + console.warn('Exporter has been shutdown, skipping export.'); + resultCallback({ code: ExportResultCode.FAILED }); + + return; + } + + const exportPromise = this._export(spans); + this._activeExports.push(exportPromise); + + // Clean up completed exports + exportPromise + .then(() => { + resultCallback({ code: ExportResultCode.SUCCESS }); + }) + .catch((error) => { + console.warn('CustomOTLPSpanExporter export failed:', error); + resultCallback({ code: ExportResultCode.FAILED, error }); + }) + .finally(() => { + const index = this._activeExports.indexOf(exportPromise); + + if (index !== -1) { + this._activeExports.splice(index, 1); + } + }); + } + + private async _export(spans: ReadableSpan[]): Promise { + if (spans.length === 0) { + return; + } + + let currentRetry = 0; + + // types involving config objects with optional fields are such a pain, hence the defaults here. + const { retryCount = defaultOptions.retryCount, retryIntervalMillis = defaultOptions.retryIntervalMillis } = + this._config; + + while (currentRetry < retryCount!) { + try { + await this._semaphore.acquire(); + + try { + await this._sendSpans(spans); + return; + } finally { + this._semaphore.release(); + } + } catch (error) { + currentRetry++; + + if (currentRetry === retryCount) { + throw new OTLPExporterError( + `Failed to export spans after ${retryCount} retries. most recent error is ${error instanceof Error ? error.toString() : error}`, + ); + } + + // Wait before retrying + await new Promise((resolve) => setTimeout(resolve, retryIntervalMillis * currentRetry)); + } + } + } + + private async _sendSpans(spans: ReadableSpan[]): Promise { + const {url = defaultOptions.url, timeoutMillis = defaultOptions.timeoutMillis, headers = defaultOptions.headers } = this._config; + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), timeoutMillis); + + const exportMessage = createExportTraceServiceRequest(spans, { + useHex: true, + useLongBits: false, + }); + + try { + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + ...headers, + }, + body: JSON.stringify(exportMessage), + signal: controller.signal, + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + } finally { + clearTimeout(timeoutId); + } + } + + async shutdown(): Promise { + if (this._shutdownOnce) { + console.warn('Exporter has already been shutdown.'); + return; + } + + this._shutdownOnce = true; + await this.forceFlush(); + } + + async forceFlush(): Promise { + await Promise.all(this._activeExports); + } +} + export function createTracer(context: AppLoadContext) { const honeycombApiKey = (context.cloudflare.env as any).HONEYCOMB_API_KEY; const honeycombDataset = (context.cloudflare.env as any).HONEYCOMB_DATASET; @@ -17,10 +193,10 @@ export function createTracer(context: AppLoadContext) { return undefined; } - console.warn('Initializing OpenTelemetry'); + console.info('Initializing OpenTelemetry'); try { - const exporter = new OTLPTraceExporter({ + const exporter = new OTLPExporter({ url: 'https://api.honeycomb.io/v1/traces', headers: { 'x-honeycomb-team': honeycombApiKey, @@ -33,7 +209,7 @@ export function createTracer(context: AppLoadContext) { [ATTR_SERVICE_VERSION]: `${__APP_VERSION}; ${__COMMIT_HASH}`, }); - const provider = new WebTracerProvider({ + const provider = new BasicTracerProvider({ resource, spanProcessors: [new SimpleSpanProcessor(exporter), new SimpleSpanProcessor(new ConsoleSpanExporter())], }); @@ -63,6 +239,7 @@ export function ensureTracer() { if (!tracer) { tracer = trace.getTracerProvider().getTracer('nut-server'); } + return tracer; } diff --git a/package.json b/package.json index f0482998..b3d38b5a 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,13 @@ "node": ">=18.18.0" }, "dependencies": { + "@ai-sdk/amazon-bedrock": "1.0.6", "@ai-sdk/anthropic": "^0.0.39", "@ai-sdk/cohere": "^1.0.3", "@ai-sdk/google": "^0.0.52", "@ai-sdk/mistral": "^0.0.43", "@ai-sdk/openai": "^0.0.66", "@anthropic-ai/sdk": "^0.33.1", - "@ai-sdk/amazon-bedrock": "1.0.6", "@codemirror/autocomplete": "^6.18.3", "@codemirror/commands": "^6.7.1", "@codemirror/lang-cpp": "^6.0.2", @@ -56,16 +56,18 @@ "@iconify-json/ph": "^1.2.1", "@iconify-json/svg-spinners": "^1.2.1", "@lezer/highlight": "^1.2.1", + "@microlabs/otel-cf-workers": "1.0.0-rc.49", "@nanostores/react": "^0.7.3", "@octokit/rest": "^21.0.2", "@octokit/types": "^13.6.2", "@openrouter/ai-sdk-provider": "^0.0.5", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-zone": "^1.30.1", - "@opentelemetry/exporter-trace-otlp-http": "^0.57.1", + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/otlp-exporter-base": "^0.53.0", + "@opentelemetry/otlp-transformer": "^0.53.0", "@opentelemetry/resources": "^1.30.1", "@opentelemetry/sdk-trace-base": "^1.30.1", - "@opentelemetry/sdk-trace-web": "^1.30.1", "@opentelemetry/semantic-conventions": "^1.30.0", "@radix-ui/react-context-menu": "^2.2.2", "@radix-ui/react-dialog": "^1.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 034125bb..1c4293cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,6 +89,9 @@ importers: '@lezer/highlight': specifier: ^1.2.1 version: 1.2.1 + '@microlabs/otel-cf-workers': + specifier: 1.0.0-rc.49 + version: 1.0.0-rc.49(@opentelemetry/api@1.9.0) '@nanostores/react': specifier: ^0.7.3 version: 0.7.3(nanostores@0.10.3)(react@18.3.1) @@ -107,18 +110,21 @@ importers: '@opentelemetry/context-zone': specifier: ^1.30.1 version: 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': - specifier: ^0.57.1 - version: 0.57.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': + specifier: ^1.26.0 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': + specifier: ^0.53.0 + version: 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': + specifier: ^0.53.0 + version: 0.53.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': specifier: ^1.30.1 version: 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': specifier: ^1.30.1 version: 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-web': - specifier: ^1.30.1 - version: 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': specifier: ^1.30.0 version: 1.30.0 @@ -1569,6 +1575,11 @@ packages: '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + '@microlabs/otel-cf-workers@1.0.0-rc.49': + resolution: {integrity: sha512-wPfaHxFAOOHlLxvWVGhdsMf+lcSsjtysfHOwk7hnTdUdim1f3trTVxaa0fl7xF/AdZ1LgGbLI9xbCEz14qSzNw==} + peerDependencies: + '@opentelemetry/api': ~1.9.0 + '@nanostores/react@0.7.3': resolution: {integrity: sha512-/XuLAMENRu/Q71biW4AZ4qmU070vkZgiQ28gaTSNRPm2SZF5zGAR81zPE1MaMB4SeOp6ZTst92NBaG75XSspNg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1662,8 +1673,8 @@ packages: peerDependencies: zod: ^3.0.0 - '@opentelemetry/api-logs@0.57.1': - resolution: {integrity: sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==} + '@opentelemetry/api-logs@0.53.0': + resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} engines: {node: '>=14'} '@opentelemetry/api@1.9.0': @@ -1681,29 +1692,41 @@ packages: resolution: {integrity: sha512-N6CACt5sxXD6XzS2jJPqstNJZ/QFqeW56IiKfHb6hYOelCXVvYfxheF7byAeRXa7+N8rmXUP7aRdupALXP5hdQ==} engines: {node: '>=14'} + '@opentelemetry/core@1.26.0': + resolution: {integrity: sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@1.30.1': resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-trace-otlp-http@0.57.1': - resolution: {integrity: sha512-43dLEjlf6JGxpVt9RaRlJAvjHG1wGsbAuNd67RIDy/95zfKk2aNovtiGUgFdS/kcvgvS90upIUbgn0xUd9JjMg==} + '@opentelemetry/exporter-trace-otlp-http@0.53.0': + resolution: {integrity: sha512-m7F5ZTq+V9mKGWYpX8EnZ7NjoqAU7VemQ1E2HAG+W/u0wpY1x0OmbxAXfGKFHCspdJk8UKlwPGrpcB8nay3P8A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-exporter-base@0.53.0': + resolution: {integrity: sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-transformer@0.53.0': + resolution: {integrity: sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.57.1': - resolution: {integrity: sha512-GNBJAEYfeiYJQ3O2dvXgiNZ/qjWrBxSb1L1s7iV/jKBRGMN3Nv+miTk2SLeEobF5E5ZK4rVcHKlBZ71bPVIv/g==} + '@opentelemetry/resources@1.26.0': + resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-transformer@0.57.1': - resolution: {integrity: sha512-EX67y+ukNNfFrOLyjYGw8AMy0JPIlEX1dW60SGUNZWW2hSQyyolX7EqFuHP5LtXLjJHNfzx5SMBVQ3owaQCNDw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@opentelemetry/api': '>=1.0.0 <1.10.0' '@opentelemetry/resources@1.30.1': resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} @@ -1711,29 +1734,33 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-logs@0.57.1': - resolution: {integrity: sha512-jGdObb/BGWu6Peo3cL3skx/Rl1Ak/wDDO3vpPrrThGbqE7isvkCsX6uE+OAt8Ayjm9YC8UGkohWbLR09JmM0FA==} + '@opentelemetry/sdk-logs@0.53.0': + resolution: {integrity: sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-metrics@1.30.1': - resolution: {integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==} + '@opentelemetry/sdk-metrics@1.26.0': + resolution: {integrity: sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-trace-base@1.26.0': + resolution: {integrity: sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-trace-base@1.30.1': resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-web@1.30.1': - resolution: {integrity: sha512-AUo2e+1uyTGMB36VlbvBqnCogVzQhpC7dRcVVdCrt+cFHLpFRRJcd45J2obGTgs0XiAwNLyq5bhkW3JF2NZA+A==} + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' '@opentelemetry/semantic-conventions@1.28.0': resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} @@ -7771,6 +7798,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@microlabs/otel-cf-workers@1.0.0-rc.49(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.30.0 + '@nanostores/react@0.7.3(nanostores@0.10.3)(react@18.3.1)': dependencies: nanostores: 0.10.3 @@ -7888,7 +7926,7 @@ snapshots: '@ai-sdk/provider-utils': 1.0.2(zod@3.23.8) zod: 3.23.8 - '@opentelemetry/api-logs@0.57.1': + '@opentelemetry/api-logs@0.53.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -7906,55 +7944,73 @@ snapshots: transitivePeerDependencies: - '@opentelemetry/api' + '@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/exporter-trace-otlp-http@0.57.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-http@0.53.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base@0.57.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-exporter-base@0.53.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer@0.57.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-transformer@0.53.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.1 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) protobufjs: 7.4.0 + '@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/sdk-logs@0.57.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-logs@0.53.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.1 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-metrics@1.26.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -7963,12 +8019,7 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/sdk-trace-web@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/semantic-conventions@1.27.0': {} '@opentelemetry/semantic-conventions@1.28.0': {}