feat(webapp): upgrade otel packages and add more metrics

This commit is contained in:
nicktrn
2025-08-29 18:02:39 +01:00
parent 847ea866b6
commit c22dbe96a7
8 changed files with 696 additions and 647 deletions
+2
View File
@@ -352,6 +352,8 @@ const EnvironmentSchema = z.object({
INTERNAL_OTEL_METRIC_EXPORTER_AUTH_HEADERS: z.string().optional(),
INTERNAL_OTEL_METRIC_EXPORTER_ENABLED: z.string().default("0"),
INTERNAL_OTEL_METRIC_EXPORTER_INTERVAL_MS: z.coerce.number().int().default(30_000),
INTERNAL_OTEL_HOST_METRICS_ENABLED: BoolEnv.default(true),
INTERNAL_OTEL_NODEJS_METRICS_ENABLED: BoolEnv.default(true),
ORG_SLACK_INTEGRATION_CLIENT_ID: z.string().optional(),
ORG_SLACK_INTEGRATION_CLIENT_SECRET: z.string().optional(),
@@ -1,263 +0,0 @@
import { z } from "zod";
import type { ResourceAttributes } from "@opentelemetry/resources";
import {
SEMRESATTRS_AWS_ECS_CLUSTER_ARN,
SEMRESATTRS_AWS_ECS_CONTAINER_ARN,
SEMRESATTRS_AWS_ECS_LAUNCHTYPE,
SEMRESATTRS_AWS_ECS_TASK_ARN,
SEMRESATTRS_AWS_ECS_TASK_FAMILY,
SEMRESATTRS_AWS_ECS_TASK_REVISION,
SEMRESATTRS_AWS_LOG_GROUP_NAMES,
SEMRESATTRS_AWS_LOG_STREAM_NAMES,
SEMRESATTRS_CLOUD_AVAILABILITY_ZONE,
SEMRESATTRS_CLOUD_PLATFORM,
SEMRESATTRS_CLOUD_PROVIDER,
SEMRESATTRS_CLOUD_REGION,
SEMRESATTRS_CONTAINER_NAME,
SEMRESATTRS_CONTAINER_ID,
SEMRESATTRS_CONTAINER_IMAGE_NAME,
SEMRESATTRS_CONTAINER_IMAGE_TAG,
CLOUDPLATFORMVALUES_AWS_ECS,
CLOUDPROVIDERVALUES_AWS,
} from "@opentelemetry/semantic-conventions";
import { tryCatch } from "@trigger.dev/core/utils";
import { logger } from "~/services/logger.server";
// Minimal schema for ECS task metadata
const ECSTaskMetadataSchema = z.object({
Cluster: z.string().optional(),
TaskARN: z.string().optional(),
Family: z.string().optional(),
Revision: z.string().optional(),
AvailabilityZone: z.string().optional(),
LaunchType: z.string().optional(),
ServiceName: z.string().optional(),
});
const ECSLogOptions = z.object({
"awslogs-group": z.string().optional(),
"awslogs-region": z.string().optional(),
"awslogs-stream": z.string().optional(),
mode: z.string().optional(),
});
// Minimal schema for container metadata
const ECSContainerMetadataSchema = z.object({
DockerId: z.string().optional(),
Name: z.string().optional(),
Image: z.string().optional(),
ImageID: z.string().optional(),
ContainerARN: z.string().optional(),
LogOptions: ECSLogOptions.optional(),
});
// Cache for ECS metadata to avoid repeated fetches
let ecsMetadataCache: ResourceAttributes | null = null;
/**
* Fetches ECS task metadata from the v4 endpoint
*/
async function fetchECSTaskMetadata(metadataUri: string): Promise<ResourceAttributes> {
const [error, response] = await tryCatch(
fetch(`${metadataUri}/task`, {
signal: AbortSignal.timeout(5000),
})
);
if (error) {
logger.warn("Failed to fetch ECS task metadata", { error });
return {};
}
if (!response.ok) {
logger.warn("ECS task metadata fetch failed", { status: response.status });
return {};
}
const [jsonError, taskJson] = await tryCatch(response.json());
if (jsonError) {
logger.warn("Failed to parse ECS task metadata", { error: jsonError });
return {};
}
const parseResult = ECSTaskMetadataSchema.safeParse(taskJson);
if (!parseResult.success) {
logger.warn("ECS task metadata validation issues", { issues: parseResult.error.issues });
return {};
}
const taskData = parseResult.data;
const attributes: ResourceAttributes = {};
if (taskData.TaskARN) {
attributes[SEMRESATTRS_AWS_ECS_TASK_ARN] = taskData.TaskARN;
}
if (taskData.Cluster) {
attributes[SEMRESATTRS_AWS_ECS_CLUSTER_ARN] = taskData.Cluster;
}
if (taskData.LaunchType) {
attributes[SEMRESATTRS_AWS_ECS_LAUNCHTYPE] = taskData.LaunchType;
}
if (taskData.Family) {
attributes[SEMRESATTRS_AWS_ECS_TASK_FAMILY] = taskData.Family;
}
if (taskData.Revision) {
attributes[SEMRESATTRS_AWS_ECS_TASK_REVISION] = taskData.Revision;
}
if (taskData.AvailabilityZone) {
attributes[SEMRESATTRS_CLOUD_AVAILABILITY_ZONE] = taskData.AvailabilityZone;
}
if (taskData.ServiceName) {
// Custom attribute for ECS service name
attributes["aws.ecs.service.name"] = taskData.ServiceName;
}
return attributes;
}
/**
* Fetches ECS container metadata from the v4 endpoint
*/
async function fetchECSContainerMetadata(metadataUri: string): Promise<ResourceAttributes> {
const [error, response] = await tryCatch(
fetch(metadataUri, {
signal: AbortSignal.timeout(5000),
})
);
if (error) {
logger.warn("Failed to fetch ECS container metadata", { error });
return {};
}
if (!response.ok) {
logger.warn("ECS container metadata fetch failed", { status: response.status });
return {};
}
const [jsonError, containerJson] = await tryCatch(response.json());
if (jsonError) {
logger.warn("Failed to parse ECS container metadata", { error: jsonError });
return {};
}
const parseResult = ECSContainerMetadataSchema.safeParse(containerJson);
if (!parseResult.success) {
logger.warn("ECS container metadata validation issues", { issues: parseResult.error.issues });
return {};
}
const containerData = parseResult.data;
const attributes: ResourceAttributes = {};
if (containerData.Name) {
attributes[SEMRESATTRS_CONTAINER_NAME] = containerData.Name;
}
if (containerData.DockerId) {
attributes[SEMRESATTRS_CONTAINER_ID] = containerData.DockerId;
}
if (containerData.Image) {
const [name, tag] = containerData.Image.split(":");
if (name) {
attributes[SEMRESATTRS_CONTAINER_IMAGE_NAME] = name;
}
if (tag) {
attributes[SEMRESATTRS_CONTAINER_IMAGE_TAG] = tag;
}
}
if (containerData.ImageID) {
// Custom attribute for image ID
attributes["container.image.id"] = containerData.ImageID;
}
if (containerData.ContainerARN) {
attributes[SEMRESATTRS_AWS_ECS_CONTAINER_ARN] = containerData.ContainerARN;
}
const logOptions = containerData.LogOptions;
if (logOptions?.["awslogs-group"]) {
attributes[SEMRESATTRS_AWS_LOG_GROUP_NAMES] = [logOptions["awslogs-group"]];
}
if (logOptions?.["awslogs-stream"]) {
attributes[SEMRESATTRS_AWS_LOG_STREAM_NAMES] = [logOptions["awslogs-stream"]];
}
if (logOptions?.mode) {
// Custom attribute for log mode
attributes["aws.log.mode"] = [logOptions.mode];
}
return attributes;
}
/**
* Fetches ECS metadata from the Task Metadata Endpoint V4
* Returns resource attributes for OpenTelemetry
*/
async function fetchECSMetadata(metadataUri: string): Promise<ResourceAttributes> {
// Return cached metadata if available
if (ecsMetadataCache !== null) {
return ecsMetadataCache;
}
if (!metadataUri) {
// Not running in ECS
ecsMetadataCache = {};
return ecsMetadataCache;
}
// Fetch task metadata and CloudWatch logs config in parallel
const [taskAttributes, containerAttributes] = await Promise.all([
fetchECSTaskMetadata(metadataUri),
fetchECSContainerMetadata(metadataUri),
]);
const attributes: ResourceAttributes = {
[SEMRESATTRS_CLOUD_PROVIDER]: CLOUDPROVIDERVALUES_AWS,
[SEMRESATTRS_CLOUD_PLATFORM]: CLOUDPLATFORMVALUES_AWS_ECS,
...taskAttributes,
...containerAttributes,
};
const region = process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION;
if (region) {
attributes[SEMRESATTRS_CLOUD_REGION] = region;
}
logger.info("🔦 Fetched ECS metadata", { attributes });
ecsMetadataCache = attributes;
return attributes;
}
/**
* Fetches async resource attributes
* Designed to be used with the Resource constructor's asyncAttributesPromise parameter
*
* Usage:
* ```
* new Resource(
* { [SEMRESATTRS_SERVICE_NAME]: 'my-service' },
* getAsyncResourceAttributes()
* )
* ```
*/
export async function getAsyncResourceAttributes(): Promise<ResourceAttributes> {
const metadataUri = process.env.ECS_CONTAINER_METADATA_URI_V4;
if (!metadataUri) {
return {};
}
return fetchECSMetadata(metadataUri);
}
@@ -0,0 +1,153 @@
import { type ExportResult, ExportResultCode } from "@opentelemetry/core";
import type {
PushMetricExporter,
ResourceMetrics,
MetricData,
DataPoint,
Histogram,
ExponentialHistogram,
} from "@opentelemetry/sdk-metrics";
/**
* Compact metric exporter that logs metrics in a single-line format
* Similar to Prometheus text format for better readability
*/
export class CompactMetricExporter implements PushMetricExporter {
/**
* Export metrics in a compact format
*/
export(metrics: ResourceMetrics, resultCallback: (result: ExportResult) => void): void {
try {
this._exportMetrics(metrics);
resultCallback({ code: ExportResultCode.SUCCESS });
} catch (error) {
resultCallback({
code: ExportResultCode.FAILED,
error: error instanceof Error ? error : new Error(String(error)),
});
}
}
/**
* Shutdown the exporter
*/
async shutdown(): Promise<void> {
return Promise.resolve();
}
/**
* Force flush any buffered data
*/
async forceFlush(): Promise<void> {
return Promise.resolve();
}
/**
* Process and log metrics in compact format
*/
private _exportMetrics(resourceMetrics: ResourceMetrics): void {
for (const scopeMetric of resourceMetrics.scopeMetrics) {
for (const metric of scopeMetric.metrics) {
this._exportMetric(metric);
}
}
}
/**
* Export a single metric
*/
private _exportMetric(metric: MetricData): void {
const metricName = metric.descriptor.name;
for (const dataPoint of metric.dataPoints) {
const formattedLine = this._formatDataPoint(metricName, dataPoint);
if (formattedLine) {
console.log(formattedLine);
}
}
}
/**
* Format a data point into a single line
*/
private _formatDataPoint(
metricName: string,
dataPoint: DataPoint<number> | DataPoint<Histogram> | DataPoint<ExponentialHistogram>
): string | null {
// Extract attributes/labels
const labels = this._formatLabels(dataPoint.attributes);
// Extract value based on data point type
const value = this._extractValue(dataPoint);
if (value === null || value === undefined) {
return null;
}
// Format as: metric_name{label1="value1",label2="value2"} = value
if (labels) {
return `${metricName}{${labels}} = ${value}`;
}
return `${metricName} = ${value}`;
}
/**
* Format attributes as Prometheus-style labels
*/
private _formatLabels(attributes: Record<string, unknown>): string {
const entries = Object.entries(attributes);
if (entries.length === 0) {
return "";
}
return entries.map(([key, value]) => `${key}="${String(value)}"`).join(",");
}
/**
* Extract the numeric value from a data point
*/
private _extractValue(
dataPoint: DataPoint<number> | DataPoint<Histogram> | DataPoint<ExponentialHistogram>
): number | null {
const value = dataPoint.value;
// Check if value is a simple number (Gauge, Sum, UpDownSum)
if (typeof value === "number") {
return value;
}
// Check if value is a Histogram or ExponentialHistogram
if (this._isHistogram(value) || this._isExponentialHistogram(value)) {
return value.sum ?? null;
}
return null;
}
/**
* Type guard for Histogram
*/
private _isHistogram(value: unknown): value is Histogram {
return (
value !== null &&
typeof value === "object" &&
"sum" in value &&
"count" in value &&
"buckets" in value
);
}
/**
* Type guard for ExponentialHistogram
*/
private _isExponentialHistogram(value: unknown): value is ExponentialHistogram {
return (
value !== null &&
typeof value === "object" &&
"sum" in value &&
"count" in value &&
"scale" in value
);
}
}
@@ -14,8 +14,8 @@
* limitations under the License.
*/
import { ExportResult, ExportResultCode, hrTimeToMicroseconds } from "@opentelemetry/core";
import { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
import { type ExportResult, ExportResultCode, hrTimeToMicroseconds } from "@opentelemetry/core";
import type { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
export class LoggerSpanExporter implements SpanExporter {
/**
@@ -47,11 +47,13 @@ export class LoggerSpanExporter implements SpanExporter {
* @param span
*/
private _exportInfo(span: ReadableSpan) {
const parentSpanId = span.parentSpanContext?.spanId;
return {
traceId: span.spanContext().traceId,
parentId:
span.parentSpanId && span.parentSpanId !== "" && span.parentSpanId !== "0000000000000000"
? span.parentSpanId
parentSpanId && parentSpanId !== "" && parentSpanId !== "0000000000000000"
? parentSpanId
: undefined,
traceState: span.spanContext().traceState?.serialize(),
message: span.name,
+257 -60
View File
@@ -1,18 +1,17 @@
import {
Attributes,
Context,
type Attributes,
type Context,
DiagConsoleLogger,
DiagLogLevel,
Link,
Span,
SpanKind,
SpanOptions,
type Link,
type Span,
type SpanKind,
type SpanOptions,
SpanStatusCode,
Tracer,
diag,
trace,
metrics,
Meter,
type Meter,
} from "@opentelemetry/api";
import { logs, SeverityNumber } from "@opentelemetry/api-logs";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
@@ -21,44 +20,44 @@ import { BatchLogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs
import { type Instrumentation, registerInstrumentations } from "@opentelemetry/instrumentation";
import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
import {
MeterProvider,
ConsoleMetricExporter,
PeriodicExportingMetricReader,
} from "@opentelemetry/sdk-metrics";
import { MeterProvider, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-proto";
import { Resource } from "@opentelemetry/resources";
import {
BatchSpanProcessor,
ParentBasedSampler,
Sampler,
type Sampler,
SamplingDecision,
SamplingResult,
type SamplingResult,
SimpleSpanProcessor,
type SpanProcessor,
TraceIdRatioBasedSampler,
} from "@opentelemetry/sdk-trace-base";
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
import {
SEMRESATTRS_SERVICE_INSTANCE_ID,
SEMRESATTRS_SERVICE_NAME,
SEMRESATTRS_HOST_NAME,
} from "@opentelemetry/semantic-conventions";
import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
import { PrismaInstrumentation } from "@prisma/instrumentation";
import { HostMetrics } from "@opentelemetry/host-metrics";
import { AwsInstrumentation } from "@opentelemetry/instrumentation-aws-sdk";
import { awsEcsDetector, awsEc2Detector } from "@opentelemetry/resource-detector-aws";
import {
detectResources,
resourceFromAttributes,
serviceInstanceIdDetector,
osDetector,
hostDetector,
processDetector,
} from "@opentelemetry/resources";
import { env } from "~/env.server";
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
import type { AuthenticatedEnvironment } from "~/services/apiAuth.server";
import { singleton } from "~/utils/singleton";
import { LoggerSpanExporter } from "./telemetry/loggerExporter.server";
import { CompactMetricExporter } from "./telemetry/compactMetricExporter.server";
import { logger } from "~/services/logger.server";
import { flattenAttributes } from "@trigger.dev/core/v3";
import { randomUUID } from "node:crypto";
import { prisma } from "~/db.server";
import { hostname } from "node:os";
import { getAsyncResourceAttributes } from "./telemetry/asyncResourceAttributes.server";
import { metricsRegister } from "~/metrics.server";
export const SEMINTATTRS_FORCE_RECORDING = "forceRecording";
const SERVICE_INSTANCE_ID = randomUUID();
class CustomWebappSampler implements Sampler {
constructor(private readonly _baseSampler: Sampler) {}
@@ -172,14 +171,22 @@ export async function emitWarnLog(message: string, params: Record<string, unknow
}
function getResource() {
return new Resource(
{
[SEMRESATTRS_SERVICE_NAME]: env.SERVICE_NAME,
[SEMRESATTRS_SERVICE_INSTANCE_ID]: SERVICE_INSTANCE_ID,
[SEMRESATTRS_HOST_NAME]: hostname(),
},
getAsyncResourceAttributes()
);
const detectedResource = detectResources({
detectors: [
serviceInstanceIdDetector,
osDetector,
hostDetector,
processDetector,
awsEcsDetector,
awsEc2Detector,
],
});
const baseResource = resourceFromAttributes({
[ATTR_SERVICE_NAME]: env.SERVICE_NAME,
});
return baseResource.merge(detectedResource);
}
function setupTelemetry() {
@@ -198,16 +205,7 @@ function setupTelemetry() {
const samplingRate = 1.0 / Math.max(parseInt(env.INTERNAL_OTEL_TRACE_SAMPLING_RATE, 10), 1);
const provider = new NodeTracerProvider({
forceFlushTimeoutMillis: 15_000,
resource: getResource(),
sampler: new ParentBasedSampler({
root: new CustomWebappSampler(new TraceIdRatioBasedSampler(samplingRate)),
}),
spanLimits: {
attributeCountLimit: 1024,
},
});
const spanProcessors: SpanProcessor[] = [];
if (env.INTERNAL_OTEL_TRACE_EXPORTER_URL) {
const headers = parseInternalTraceHeaders() ?? {};
@@ -218,7 +216,7 @@ function setupTelemetry() {
headers,
});
provider.addSpanProcessor(
spanProcessors.push(
new BatchSpanProcessor(exporter, {
maxExportBatchSize: 512,
scheduledDelayMillis: 1000,
@@ -235,11 +233,22 @@ function setupTelemetry() {
console.log(`🔦 Tracer: Logger exporter enabled (sampling = ${samplingRate})`);
const loggerExporter = new LoggerSpanExporter();
provider.addSpanProcessor(new SimpleSpanProcessor(loggerExporter));
spanProcessors.push(new SimpleSpanProcessor(loggerExporter));
}
}
const provider = new NodeTracerProvider({
forceFlushTimeoutMillis: 15_000,
resource: getResource(),
sampler: new ParentBasedSampler({
root: new CustomWebappSampler(new TraceIdRatioBasedSampler(samplingRate)),
}),
spanLimits: {
attributeCountLimit: 1024,
},
spanProcessors,
});
if (env.INTERNAL_OTEL_LOG_EXPORTER_URL) {
const headers = parseInternalTraceHeaders() ?? {};
@@ -249,22 +258,21 @@ function setupTelemetry() {
headers,
});
const batchLogExporter = new BatchLogRecordProcessor(logExporter, {
maxExportBatchSize: 64,
scheduledDelayMillis: 200,
exportTimeoutMillis: 30000,
maxQueueSize: 512,
});
const loggerProvider = new LoggerProvider({
resource: getResource(),
logRecordLimits: {
attributeCountLimit: 1000,
},
processors: [batchLogExporter],
});
loggerProvider.addLogRecordProcessor(
new BatchLogRecordProcessor(logExporter, {
maxExportBatchSize: 64,
scheduledDelayMillis: 200,
exportTimeoutMillis: 30000,
maxQueueSize: 512,
})
);
logs.setGlobalLoggerProvider(loggerProvider);
console.log(
@@ -277,6 +285,9 @@ function setupTelemetry() {
let instrumentations: Instrumentation[] = [
new HttpInstrumentation(),
new ExpressInstrumentation(),
new AwsInstrumentation({
suppressInternalInstrumentation: true,
}),
];
if (env.INTERNAL_OTEL_TRACE_INSTRUMENT_PRISMA_ENABLED === "1") {
@@ -319,12 +330,14 @@ function setupMetrics() {
const meter = meterProvider.getMeter("trigger.dev", "3.3.12");
configurePrismaMetrics(meter);
configurePrismaMetrics({ meter });
configureNodejsMetrics({ meter });
configureHostMetrics({ meterProvider });
return meter;
}
function configurePrismaMetrics(meter: Meter) {
function configurePrismaMetrics({ meter }: { meter: Meter }) {
const totalGauge = meter.createObservableGauge("db.pool.connections.total", {
description: "Open Prisma-pool connections",
unit: "connections",
@@ -361,6 +374,189 @@ function configurePrismaMetrics(meter: Meter) {
);
}
function configureNodejsMetrics({ meter }: { meter: Meter }) {
if (!env.INTERNAL_OTEL_NODEJS_METRICS_ENABLED) {
return;
}
console.log("🔦 Metrics: Node.js runtime metrics enabled (handles, requests, event loop)");
// UV Threadpool size - based on UV_THREADPOOL_SIZE env var (default 4)
const uvThreadpoolSizeGauge = meter.createObservableGauge("nodejs.uv_threadpool.size", {
description: "Size of the libuv threadpool",
unit: "threads",
});
// Active handles - total and by type
const activeHandlesGauge = meter.createObservableGauge("nodejs.active_handles", {
description: "Number of active libuv handles grouped by handle type",
unit: "handles",
});
const activeHandlesTotalGauge = meter.createObservableGauge("nodejs.active_handles.total", {
description: "Total number of active handles",
unit: "handles",
});
// Active requests - total and by type
const activeRequestsGauge = meter.createObservableGauge("nodejs.active_requests", {
description: "Number of active libuv requests grouped by request type",
unit: "requests",
});
const activeRequestsTotalGauge = meter.createObservableGauge("nodejs.active_requests.total", {
description: "Total number of active requests",
unit: "requests",
});
// Event loop lag metrics
const eventLoopLagMinGauge = meter.createObservableGauge("nodejs.eventloop.lag.min", {
description: "Event loop minimum delay",
unit: "s",
});
const eventLoopLagMaxGauge = meter.createObservableGauge("nodejs.eventloop.lag.max", {
description: "Event loop maximum delay",
unit: "s",
});
const eventLoopLagMeanGauge = meter.createObservableGauge("nodejs.eventloop.lag.mean", {
description: "Event loop mean delay",
unit: "s",
});
const eventLoopLagP50Gauge = meter.createObservableGauge("nodejs.eventloop.lag.p50", {
description: "Event loop 50th percentile delay",
unit: "s",
});
const eventLoopLagP90Gauge = meter.createObservableGauge("nodejs.eventloop.lag.p90", {
description: "Event loop 90th percentile delay",
unit: "s",
});
const eventLoopLagP99Gauge = meter.createObservableGauge("nodejs.eventloop.lag.p99", {
description: "Event loop 99th percentile delay",
unit: "s",
});
// Get UV threadpool size (defaults to 4 if not set)
const uvThreadpoolSize = parseInt(process.env.UV_THREADPOOL_SIZE || "4", 10);
// Single helper to read metrics from prom-client
async function readNodeMetrics() {
const metrics = await metricsRegister.getMetricsAsJSON();
// Get handle metrics with types
const activeHandles = metrics.find((m) => m.name === "nodejs_active_handles");
const activeHandlesTotal = metrics.find((m) => m.name === "nodejs_active_handles_total");
// Get request metrics with types
const activeRequests = metrics.find((m) => m.name === "nodejs_active_requests");
const activeRequestsTotal = metrics.find((m) => m.name === "nodejs_active_requests_total");
// Event loop metrics
const eventLoopLagMin = metrics.find((m) => m.name === "nodejs_eventloop_lag_min_seconds");
const eventLoopLagMax = metrics.find((m) => m.name === "nodejs_eventloop_lag_max_seconds");
const eventLoopLagMean = metrics.find((m) => m.name === "nodejs_eventloop_lag_mean_seconds");
const eventLoopLagP50 = metrics.find((m) => m.name === "nodejs_eventloop_lag_p50_seconds");
const eventLoopLagP90 = metrics.find((m) => m.name === "nodejs_eventloop_lag_p90_seconds");
const eventLoopLagP99 = metrics.find((m) => m.name === "nodejs_eventloop_lag_p99_seconds");
// Extract handle types
const handlesByType: Record<string, number> = {};
if (activeHandles?.values) {
for (const value of activeHandles.values) {
const type = value.labels?.type;
if (type) {
handlesByType[type] = value.value;
}
}
}
// Extract request types
const requestsByType: Record<string, number> = {};
if (activeRequests?.values) {
for (const value of activeRequests.values) {
const type = value.labels?.type;
if (type) {
requestsByType[type] = value.value;
}
}
}
return {
threadpoolSize: uvThreadpoolSize,
handlesByType,
handlesTotal: activeHandlesTotal?.values?.[0]?.value ?? 0,
requestsByType,
requestsTotal: activeRequestsTotal?.values?.[0]?.value ?? 0,
eventLoop: {
min: eventLoopLagMin?.values?.[0]?.value ?? 0,
max: eventLoopLagMax?.values?.[0]?.value ?? 0,
mean: eventLoopLagMean?.values?.[0]?.value ?? 0,
p50: eventLoopLagP50?.values?.[0]?.value ?? 0,
p90: eventLoopLagP90?.values?.[0]?.value ?? 0,
p99: eventLoopLagP99?.values?.[0]?.value ?? 0,
},
};
}
meter.addBatchObservableCallback(
async (res) => {
const {
threadpoolSize,
handlesByType,
handlesTotal,
requestsByType,
requestsTotal,
eventLoop,
} = await readNodeMetrics();
// Observe UV threadpool size
res.observe(uvThreadpoolSizeGauge, threadpoolSize);
// Observe handle metrics by type
for (const [type, count] of Object.entries(handlesByType)) {
res.observe(activeHandlesGauge, count, { type });
}
res.observe(activeHandlesTotalGauge, handlesTotal);
// Observe request metrics by type
for (const [type, count] of Object.entries(requestsByType)) {
res.observe(activeRequestsGauge, count, { type });
}
res.observe(activeRequestsTotalGauge, requestsTotal);
// Observe event loop metrics
res.observe(eventLoopLagMinGauge, eventLoop.min);
res.observe(eventLoopLagMaxGauge, eventLoop.max);
res.observe(eventLoopLagMeanGauge, eventLoop.mean);
res.observe(eventLoopLagP50Gauge, eventLoop.p50);
res.observe(eventLoopLagP90Gauge, eventLoop.p90);
res.observe(eventLoopLagP99Gauge, eventLoop.p99);
},
[
uvThreadpoolSizeGauge,
activeHandlesGauge,
activeHandlesTotalGauge,
activeRequestsGauge,
activeRequestsTotalGauge,
eventLoopLagMinGauge,
eventLoopLagMaxGauge,
eventLoopLagMeanGauge,
eventLoopLagP50Gauge,
eventLoopLagP90Gauge,
eventLoopLagP99Gauge,
]
);
}
function configureHostMetrics({ meterProvider }: { meterProvider: MeterProvider }) {
if (!env.INTERNAL_OTEL_HOST_METRICS_ENABLED) {
return;
}
console.log("🔦 Metrics: Host metrics enabled (CPU, memory, network)");
const hostMetrics = new HostMetrics({ meterProvider });
hostMetrics.start();
}
const SemanticEnvResources = {
ENV_ID: "$trigger.env.id",
ENV_TYPE: "$trigger.env.type",
@@ -423,6 +619,7 @@ function createMetricsExporter() {
headers,
});
} else {
return new ConsoleMetricExporter();
console.log(`🔦 Tracer: Compact metric exporter enabled`);
return new CompactMetricExporter();
}
}
+19 -16
View File
@@ -53,8 +53,8 @@
"@electric-sql/react": "^0.3.5",
"@headlessui/react": "^1.7.8",
"@heroicons/react": "^2.0.12",
"@internal/redis": "workspace:*",
"@internal/cache": "workspace:*",
"@internal/redis": "workspace:*",
"@internal/run-engine": "workspace:*",
"@internal/schedule-engine": "workspace:*",
"@internal/tracing": "workspace:*",
@@ -63,21 +63,24 @@
"@kapaai/react-sdk": "^0.1.3",
"@lezer/highlight": "^1.1.6",
"@opentelemetry/api": "1.9.0",
"@opentelemetry/api-logs": "0.52.1",
"@opentelemetry/core": "1.25.1",
"@opentelemetry/exporter-logs-otlp-http": "0.52.1",
"@opentelemetry/exporter-metrics-otlp-proto": "0.52.1",
"@opentelemetry/exporter-trace-otlp-http": "0.52.1",
"@opentelemetry/instrumentation": "0.52.1",
"@opentelemetry/instrumentation-express": "^0.36.1",
"@opentelemetry/instrumentation-http": "0.52.1",
"@opentelemetry/resources": "1.25.1",
"@opentelemetry/sdk-logs": "0.52.1",
"@opentelemetry/sdk-metrics": "1.25.1",
"@opentelemetry/sdk-node": "0.52.1",
"@opentelemetry/sdk-trace-base": "1.25.1",
"@opentelemetry/sdk-trace-node": "1.25.1",
"@opentelemetry/semantic-conventions": "1.25.1",
"@opentelemetry/api-logs": "0.203.0",
"@opentelemetry/core": "2.0.1",
"@opentelemetry/exporter-logs-otlp-http": "0.203.0",
"@opentelemetry/exporter-metrics-otlp-proto": "0.203.0",
"@opentelemetry/exporter-trace-otlp-http": "0.203.0",
"@opentelemetry/host-metrics": "^0.36.0",
"@opentelemetry/instrumentation": "0.203.0",
"@opentelemetry/instrumentation-aws-sdk": "^0.57.0",
"@opentelemetry/instrumentation-express": "^0.52.0",
"@opentelemetry/instrumentation-http": "0.203.0",
"@opentelemetry/resource-detector-aws": "^2.3.0",
"@opentelemetry/resources": "2.0.1",
"@opentelemetry/sdk-logs": "0.203.0",
"@opentelemetry/sdk-metrics": "2.0.1",
"@opentelemetry/sdk-node": "0.203.0",
"@opentelemetry/sdk-trace-base": "2.0.1",
"@opentelemetry/sdk-trace-node": "2.0.1",
"@opentelemetry/semantic-conventions": "1.36.0",
"@popperjs/core": "^2.11.8",
"@prisma/instrumentation": "^6.14.0",
"@radix-ui/react-accordion": "^1.2.11",
+4 -3
View File
@@ -1,12 +1,13 @@
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
import { InMemorySpanExporter, SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { context, trace } from "@opentelemetry/api";
import { trace } from "@opentelemetry/api";
export function createInMemoryTracing() {
// Initialize the tracer provider and exporter
const provider = new NodeTracerProvider();
const exporter = new InMemorySpanExporter();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(exporter)],
});
provider.register();
// Retrieve the tracer
+255 -301
View File
@@ -297,50 +297,59 @@ importers:
specifier: 1.9.0
version: 1.9.0
'@opentelemetry/api-logs':
specifier: 0.52.1
version: 0.52.1
specifier: 0.203.0
version: 0.203.0
'@opentelemetry/core':
specifier: 1.25.1
version: 1.25.1(@opentelemetry/api@1.9.0)
specifier: 2.0.1
version: 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-logs-otlp-http':
specifier: 0.52.1
version: 0.52.1(@opentelemetry/api@1.9.0)
specifier: 0.203.0
version: 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-metrics-otlp-proto':
specifier: 0.52.1
version: 0.52.1(@opentelemetry/api@1.9.0)
specifier: 0.203.0
version: 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-http':
specifier: 0.52.1
version: 0.52.1(@opentelemetry/api@1.9.0)
specifier: 0.203.0
version: 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/host-metrics':
specifier: ^0.36.0
version: 0.36.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation':
specifier: 0.52.1
version: 0.52.1(@opentelemetry/api@1.9.0)
specifier: 0.203.0
version: 0.203.0(@opentelemetry/api@1.9.0)(supports-color@10.0.0)
'@opentelemetry/instrumentation-aws-sdk':
specifier: ^0.57.0
version: 0.57.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation-express':
specifier: ^0.36.1
version: 0.36.1(@opentelemetry/api@1.9.0)
specifier: ^0.52.0
version: 0.52.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation-http':
specifier: 0.52.1
version: 0.52.1(@opentelemetry/api@1.9.0)
specifier: 0.203.0
version: 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resource-detector-aws':
specifier: ^2.3.0
version: 2.3.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources':
specifier: 1.25.1
version: 1.25.1(@opentelemetry/api@1.9.0)
specifier: 2.0.1
version: 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs':
specifier: 0.52.1
version: 0.52.1(@opentelemetry/api@1.9.0)
specifier: 0.203.0
version: 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics':
specifier: 1.25.1
version: 1.25.1(@opentelemetry/api@1.9.0)
specifier: 2.0.1
version: 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-node':
specifier: 0.52.1
version: 0.52.1(@opentelemetry/api@1.9.0)
specifier: 0.203.0
version: 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base':
specifier: 1.25.1
version: 1.25.1(@opentelemetry/api@1.9.0)
specifier: 2.0.1
version: 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-node':
specifier: 1.25.1
version: 1.25.1(@opentelemetry/api@1.9.0)
specifier: 2.0.1
version: 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions':
specifier: 1.25.1
version: 1.25.1
specifier: 1.36.0
version: 1.36.0
'@popperjs/core':
specifier: ^2.11.8
version: 2.11.8
@@ -2006,7 +2015,7 @@ importers:
version: link:../../packages/trigger-sdk
'@vercel/otel':
specifier: ^1.13.0
version: 1.13.0(@opentelemetry/api-logs@0.203.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.203.0)(@opentelemetry/resources@1.25.1)(@opentelemetry/sdk-logs@0.203.0)(@opentelemetry/sdk-metrics@1.25.1)(@opentelemetry/sdk-trace-base@1.25.1)
version: 1.13.0(@opentelemetry/api-logs@0.203.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.203.0)(@opentelemetry/resources@1.30.1)(@opentelemetry/sdk-logs@0.203.0)(@opentelemetry/sdk-metrics@1.30.0)(@opentelemetry/sdk-trace-base@1.30.1)
'@vercel/postgres':
specifier: ^0.10.0
version: 0.10.0
@@ -8552,13 +8561,6 @@ packages:
'@opentelemetry/api': 1.9.0
dev: false
/@opentelemetry/api-logs@0.49.1:
resolution: {integrity: sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==}
engines: {node: '>=14'}
dependencies:
'@opentelemetry/api': 1.9.0
dev: false
/@opentelemetry/api-logs@0.52.1:
resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==}
engines: {node: '>=14'}
@@ -8589,15 +8591,6 @@ packages:
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
engines: {node: '>=8.0.0'}
/@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
dependencies:
'@opentelemetry/api': 1.9.0
dev: false
/@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==}
engines: {node: '>=14'}
@@ -8656,6 +8649,21 @@ packages:
'@opentelemetry/semantic-conventions': 1.36.0
dev: false
/@opentelemetry/exporter-logs-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-g/2Y2noc/l96zmM+g0LdeuyYKINyBwN6FJySoU15LHPLcMN/1a0wNk2SegwKcxrRdE7Xsm7fkIR5n6XFe3QpPw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@grpc/grpc-js': 1.12.6
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-logs-otlp-http@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-s0hys1ljqlMTbXx2XiplmMJg9wG570Z5lH7wMvrZX6lcODI56sG4HL03jklF63tBeyNwK2RV1/ntXGo3HgG4Qw==}
engines: {node: ^18.19.0 || >=20.6.0}
@@ -8670,62 +8678,94 @@ packages:
'@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-logs-otlp-http@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.0.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.52.1
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-metrics-otlp-http@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-oAHPOy1sZi58bwqXaucd19F/v7+qE2EuVslQOEeLQT94CDuZJJ4tbWzx8DpYBTrOSzKqqrMtx9+PMxkrcbxOyQ==}
engines: {node: '>=14'}
/@opentelemetry/exporter-logs-otlp-proto@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-nl/7S91MXn5R1aIzoWtMKGvqxgJgepB/sH9qW0rZvZtabnsjbf8OQ1uSx3yogtvLr0GzwD596nQKz2fV7q2RBw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/api-logs': 0.203.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-metrics-otlp-proto@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-m9aEOzKkjznNxm+0NbyEV834Wza9asRaFA4VyWY3b1XltqbdStRmOYSZHq0VzcecOe24uD41zFqHweL2fA3y6g==}
engines: {node: '>=14'}
/@opentelemetry/exporter-metrics-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-FCCj9nVZpumPQSEI57jRAA89hQQgONuoC35Lt+rayWY/mzCAc6BQT7RFyFaZKJ2B7IQ8kYjOCPsF/HGFWjdQkQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-metrics-otlp-http': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.0.0
dependencies:
'@grpc/grpc-js': 1.12.6
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-grpc-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-metrics-otlp-proto@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-OZnhyd9npU7QbyuHXFEPVm3LnjZYifuKpT3kTnF84mXeEQ84pJJZgyLBpU4FSkSwUkt/zbMyNAI7y5+jYTWGIg==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-prometheus@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-2jLuNuw5m4sUj/SncDf/mFPabUxMZmmYetx5RKIMIQyPnl6G6ooFzfeE8aXNRf8YD1ZXNlCnRPcISxjveGJHNg==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-trace-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-322coOTf81bm6cAA8+ML6A+m4r2xTCdmAZzGNTboPXRzhwPt4JEmovsFAs+grpdarObd68msOJ9FfH3jxM6wqA==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@grpc/grpc-js': 1.12.6
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0):
@@ -8742,20 +8782,6 @@ packages:
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.0.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-trace-otlp-http@0.57.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-BJl35PSkwoMlGEOrzjCG1ih6zqZoAZJIR4xyqSKC2BqPtwuRjID0vWBaEdP9xrxxJTEIEQw+gEY/0pUgicX0ew==}
engines: {node: '>=14'}
@@ -8770,31 +8796,41 @@ packages:
'@opentelemetry/sdk-trace-base': 1.30.0(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-trace-otlp-proto@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==}
engines: {node: '>=14'}
/@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-1xwNTJ86L0aJmWRwENCJlH4LULMG2sOXWIVw+Szta4fkqKVY50Eo4HoVKKq6U9QEytrWCr8+zjw0q/ZOeXpcAQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.0.0
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/exporter-zipkin@1.25.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==}
engines: {node: '>=14'}
/@opentelemetry/exporter-zipkin@2.0.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-a9eeyHIipfdxzCfc2XPrE+/TI3wmrZUDFtG2RRXHSbZZULAny7SyybSvaDvS77a7iib5MPiAvluwVvbGTsHxsw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.0.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.25.1
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.36.0
dev: false
/@opentelemetry/host-metrics@0.36.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-14lNY57qa21V3ZOl6xrqLMHR0HGlnPIApR6hr3oCw/Dqs5IzxhTwt2X8Stn82vWJJis7j/ezn11oODsizHj2dQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
systeminformation: 5.23.8
dev: false
/@opentelemetry/instrumentation-amqplib@0.46.1(@opentelemetry/api@1.9.0):
@@ -8811,6 +8847,21 @@ packages:
- supports-color
dev: false
/@opentelemetry/instrumentation-aws-sdk@0.57.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-RfbyjaeZzX3mPhuaRHlSAQyfX3skfeWOl30jrqSXtE9k0DPdnIqpHhdYS0C/DEDuZbwTmruVJ4cUwMBw5Z6FAg==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)(supports-color@10.0.0)
'@opentelemetry/propagation-utils': 0.31.3(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.36.0
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation-connect@0.43.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==}
engines: {node: '>=14'}
@@ -8838,20 +8889,6 @@ packages:
- supports-color
dev: false
/@opentelemetry/instrumentation-express@0.36.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-ltIE4kIMa+83QjW/p7oe7XCESF29w3FQ9/T1VgShdX7fzm56K2a0xfEX1vF8lnHRGERYxIWX9D086C6gJOjVGA==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.49.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.25.1
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation-express@0.47.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==}
engines: {node: '>=14'}
@@ -8866,6 +8903,20 @@ packages:
- supports-color
dev: false
/@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-W7pizN0Wh1/cbNhhTf7C62NpyYw7VfCFTYg0DYieSTrtPBT1vmoSZei19wfKLnrMsz3sHayCg0HxCVL2c+cz5w==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)(supports-color@10.0.0)
'@opentelemetry/semantic-conventions': 1.36.0
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation-fetch@0.203.0(@opentelemetry/api@1.9.0)(supports-color@10.0.0):
resolution: {integrity: sha512-Z+mls3rOP2BaVykDZLLZPvchjj9l2oj3dYG1GTnrc27Y8o3biE+5M1b0izblycbbQHXjMPHQCpmjHbLMQuWtBg==}
engines: {node: ^18.19.0 || >=20.6.0}
@@ -8947,21 +8998,6 @@ packages:
- supports-color
dev: false
/@opentelemetry/instrumentation-http@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.25.1
semver: 7.6.3
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation-http@0.57.2(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==}
engines: {node: '>=14'}
@@ -9184,23 +9220,6 @@ packages:
- supports-color
dev: false
/@opentelemetry/instrumentation@0.49.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.49.1
'@types/shimmer': 1.0.2
import-in-the-middle: 1.7.1
require-in-the-middle: 7.1.1(supports-color@10.0.0)
semver: 7.6.3
shimmer: 1.2.1
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==}
engines: {node: '>=14'}
@@ -9246,17 +9265,6 @@ packages:
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.0.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/otlp-exporter-base@0.57.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-QQl4Ngm3D6H8SDO0EM642ncTxjRsf/HDq7+IWIA0eaEK/NTsJeQ3iYJiZj3F4jkALnvyeM1kkwd+DHtqxTBx9Q==}
engines: {node: '>=14'}
@@ -9268,17 +9276,17 @@ packages:
'@opentelemetry/otlp-transformer': 0.57.0(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/otlp-grpc-exporter-base@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==}
engines: {node: '>=14'}
/@opentelemetry/otlp-grpc-exporter-base@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-te0Ze1ueJF+N/UOFl5jElJW4U0pZXQ8QklgSfJ2linHN0JJsuaHG8IabEUi2iqxY8ZBDlSiz1Trfv5JcjWWWwQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.0.0
'@opentelemetry/api': ^1.3.0
dependencies:
'@grpc/grpc-js': 1.12.6
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.0):
@@ -9297,22 +9305,6 @@ packages:
protobufjs: 7.3.2
dev: false
/@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.3.0 <1.10.0'
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.52.1
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
protobufjs: 7.3.2
dev: false
/@opentelemetry/otlp-transformer@0.57.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-yHX7sdwkdAmSa6Jbi3caSLDWy0PCHS1pKQeKz8AIWSyQqL7IojHKgdk9A+7eRd98Z1n9YTdwWSWLnObvIqhEhQ==}
engines: {node: '>=14'}
@@ -9329,24 +9321,33 @@ packages:
protobufjs: 7.3.2
dev: false
/@opentelemetry/propagator-b3@1.25.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==}
engines: {node: '>=14'}
/@opentelemetry/propagation-utils@0.31.3(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-ZI6LKjyo+QYYZY5SO8vfoCQ9A69r1/g+pyjvtu5RSK38npINN1evEmwqbqhbg2CdcIK3a4PN6pDAJz/yC5/gAA==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/api': ^1.0.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/propagator-jaeger@1.25.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==}
engines: {node: '>=14'}
/@opentelemetry/propagator-b3@2.0.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-Hc09CaQ8Tf5AGLmf449H726uRoBNGPBL4bjr7AnnUpzWMvhdn61F78z9qb6IqB737TffBsokGAK1XykFEZ1igw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/propagator-jaeger@2.0.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-7PMdPBmGVH2eQNb/AtSJizQNgeNTfh6jQFqys6lfhd6P4r+m/nTh3gKPPpaCXVdRQ+z93vfKk+4UGty390283w==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/redis-common@0.36.2:
@@ -9354,15 +9355,16 @@ packages:
engines: {node: '>=14'}
dev: false
/@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==}
engines: {node: '>=14'}
/@opentelemetry/resource-detector-aws@2.3.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-PkD/lyXG3B3REq1Y6imBLckljkJYXavtqGYSryAeJYvGOf5Ds3doR+BCGjmKeF6ObAtI5MtpBeUStTDtGtBsWA==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/api': ^1.0.0
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.25.1
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.36.0
dev: false
/@opentelemetry/resources@1.30.0(@opentelemetry/api@1.9.0):
@@ -9410,18 +9412,6 @@ packages:
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.4.0 <1.10.0'
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.52.1
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/sdk-logs@0.57.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-6Kbxdu/QE9LWH7+WSLmYo3DjAq+c55TiCLXiXu6b/2m2muy5SyOG2m0MrGqetyRpfYSSbIqHmJoqNVTN3+2a9g==}
engines: {node: '>=14'}
@@ -9434,18 +9424,6 @@ packages:
'@opentelemetry/resources': 1.30.0(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.3.0 <1.10.0'
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
lodash.merge: 4.6.2
dev: false
/@opentelemetry/sdk-metrics@1.30.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-5kcj6APyRMvv6dEIP5plz2qfJAD4OMipBRT11u/pa1a68rHKI2Ln+iXVkAGKgx8o7CXbD7FdPypTUY88ZQgP4Q==}
engines: {node: '>=14'}
@@ -9468,42 +9446,39 @@ packages:
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
dev: false
/@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==}
engines: {node: '>=14'}
/@opentelemetry/sdk-node@0.203.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-zRMvrZGhGVMvAbbjiNQW3eKzW/073dlrSiAKPVWmkoQzah9wfynpVPeL55f9fVIm0GaBxTLcPeukWGy0/Wj7KQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.3.0 <1.10.0'
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.52.1
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-grpc': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-http': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-proto': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-zipkin': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-node': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.25.1
'@opentelemetry/api-logs': 0.203.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-logs-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-logs-otlp-http': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-logs-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-metrics-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-metrics-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-prometheus': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-zipkin': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)(supports-color@10.0.0)
'@opentelemetry/propagator-b3': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/propagator-jaeger': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.36.0
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.25.1
dev: false
/@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-RKQDaDIkV7PwizmHw+rE/FgfB2a6MBx+AEVVlAHXRG1YYxLiBpPX2KhmoB99R5vA4b72iJrjle68NDWnbrE9Dg==}
engines: {node: '>=14'}
@@ -9540,21 +9515,6 @@ packages:
'@opentelemetry/semantic-conventions': 1.36.0
dev: false
/@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/propagator-b3': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/propagator-jaeger': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
semver: 7.6.3
dev: false
/@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==}
engines: {node: ^18.19.0 || >=20.6.0}
@@ -18151,10 +18111,6 @@ packages:
'@types/node': 20.14.14
dev: true
/@types/shimmer@1.0.2:
resolution: {integrity: sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==}
dev: false
/@types/shimmer@1.2.0:
resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==}
dev: false
@@ -18591,7 +18547,7 @@ packages:
resolution: {integrity: sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==}
dev: true
/@vercel/otel@1.13.0(@opentelemetry/api-logs@0.203.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.203.0)(@opentelemetry/resources@1.25.1)(@opentelemetry/sdk-logs@0.203.0)(@opentelemetry/sdk-metrics@1.25.1)(@opentelemetry/sdk-trace-base@1.25.1):
/@vercel/otel@1.13.0(@opentelemetry/api-logs@0.203.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.203.0)(@opentelemetry/resources@1.30.1)(@opentelemetry/sdk-logs@0.203.0)(@opentelemetry/sdk-metrics@1.30.0)(@opentelemetry/sdk-trace-base@1.30.1):
resolution: {integrity: sha512-esRkt470Y2jRK1B1g7S1vkt4Csu44gp83Zpu8rIyPoqy2BKgk4z7ik1uSMswzi45UogLHFl6yR5TauDurBQi4Q==}
engines: {node: '>=18'}
peerDependencies:
@@ -18606,10 +18562,10 @@ packages:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.203.0
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)(supports-color@10.0.0)
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 1.30.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0)
dev: false
/@vercel/postgres@0.10.0:
@@ -24583,15 +24539,6 @@ packages:
module-details-from-path: 1.0.3
dev: false
/import-in-the-middle@1.7.1:
resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==}
dependencies:
acorn: 8.14.1
acorn-import-assertions: 1.9.0(acorn@8.14.1)
cjs-module-lexer: 1.2.3
module-details-from-path: 1.0.3
dev: false
/import-meta-resolve@4.1.0:
resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
dev: false
@@ -31891,6 +31838,13 @@ packages:
tslib: 2.8.1
dev: true
/systeminformation@5.23.8:
resolution: {integrity: sha512-Osd24mNKe6jr/YoXLLK3k8TMdzaxDffhpCxgkfgBHcapykIkd50HXThM3TCEuHO2pPuCsSx2ms/SunqhU5MmsQ==}
engines: {node: '>=8.0.0'}
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
hasBin: true
dev: false
/table@6.9.0:
resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
engines: {node: '>=10.0.0'}