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.
This commit is contained in:
Chris Toshok 2025-02-18 16:18:03 -08:00 committed by GitHub
parent 78a56faa55
commit c52ae1f9da
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 300 additions and 70 deletions

View File

@ -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<void> {
if (this._permits > 0) {
this._permits -= 1;
return Promise.resolve();
}
return new Promise<void>((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<void>[];
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<void> {
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<void> {
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<void> {
if (this._shutdownOnce) {
console.warn('Exporter has already been shutdown.');
return;
}
this._shutdownOnce = true;
await this.forceFlush();
}
async forceFlush(): Promise<void> {
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;
}

View File

@ -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",

View File

@ -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': {}