reroute-js 0.25.2 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -52
- package/cli/bin.d.ts +1 -1
- package/cli/bin.js +446 -150
- package/cli/bin.js.map +13 -9
- package/cli/index.d.ts +1 -1
- package/cli/index.js +4 -4
- package/cli/index.js.map +1 -1
- package/cli/src/cli.d.ts +1 -1
- package/cli/src/commands/analyze.d.ts +1 -1
- package/cli/src/commands/build.d.ts +1 -1
- package/cli/src/commands/dev.d.ts +1 -1
- package/cli/src/commands/gen.d.ts +1 -1
- package/cli/src/commands/gen.d.ts.map +1 -1
- package/cli/src/commands/index.d.ts +1 -1
- package/cli/src/commands/init.d.ts +1 -1
- package/cli/src/commands/lib/assets.d.ts +1 -1
- package/cli/src/commands/lib/bundler.d.ts +1 -1
- package/cli/src/commands/lib/command.d.ts +1 -1
- package/cli/src/commands/lib/env.d.ts +1 -1
- package/cli/src/commands/lib/index.d.ts +1 -1
- package/cli/src/commands/lib/log.d.ts +1 -1
- package/cli/src/commands/lib/markdown/availability.d.ts +1 -1
- package/cli/src/commands/lib/markdown/index.d.ts +1 -1
- package/cli/src/commands/lib/markdown/processor.d.ts +1 -1
- package/cli/src/commands/lib/production.d.ts +1 -1
- package/cli/src/commands/lib/server.d.ts +1 -1
- package/cli/src/commands/lib/streaming/analyzer.d.ts +1 -1
- package/cli/src/commands/lib/streaming/suspense.d.ts +1 -1
- package/cli/src/commands/lib/tailwind.d.ts +1 -1
- package/cli/src/commands/lib/terminal-ui.d.ts +1 -1
- package/cli/src/commands/lib/version.d.ts +1 -1
- package/cli/src/commands/og.d.ts +1 -1
- package/cli/src/commands/start.d.ts +1 -1
- package/cli/src/index.d.ts +1 -1
- package/core/index.d.ts +1 -1
- package/core/index.js +912 -589
- package/core/index.js.map +22 -14
- package/core/src/bundler/hash.d.ts +1 -1
- package/core/src/bundler/index.d.ts +1 -1
- package/core/src/config.d.ts +243 -2
- package/core/src/config.d.ts.map +1 -1
- package/core/src/content/discovery.d.ts +1 -1
- package/core/src/content/index.d.ts +1 -1
- package/core/src/content/metadata.d.ts +1 -1
- package/core/src/index.d.ts +1 -1
- package/core/src/llms/extractor.d.ts +1 -1
- package/core/src/llms/formatter.d.ts +1 -1
- package/core/src/llms/full-generator.d.ts +1 -1
- package/core/src/llms/index-generator.d.ts +1 -1
- package/core/src/llms/index.d.ts +1 -1
- package/core/src/og/discovery.d.ts +1 -1
- package/core/src/og/index.d.ts +1 -1
- package/core/src/og/meta.d.ts +1 -1
- package/core/src/og/render.d.ts +1 -1
- package/core/src/og/types.d.ts +1 -1
- package/core/src/robots/discovery.d.ts +1 -1
- package/core/src/robots/generator.d.ts +1 -1
- package/core/src/robots/index.d.ts +1 -1
- package/core/src/robots/policies.d.ts +1 -1
- package/core/src/rss/discovery.d.ts +1 -1
- package/core/src/rss/generator.d.ts +1 -1
- package/core/src/rss/index.d.ts +1 -1
- package/core/src/sitemap/discovery.d.ts +1 -1
- package/core/src/sitemap/generator.d.ts +1 -1
- package/core/src/sitemap/index.d.ts +1 -1
- package/core/src/ssr/index.d.ts +1 -1
- package/core/src/ssr/lib/cache.d.ts +1 -1
- package/core/src/ssr/lib/collections.d.ts +1 -1
- package/core/src/ssr/lib/compression.d.ts +1 -1
- package/core/src/ssr/lib/compute/content.d.ts +1 -1
- package/core/src/ssr/lib/compute/index.d.ts +1 -1
- package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
- package/core/src/ssr/lib/compute/routes.d.ts +1 -1
- package/core/src/ssr/lib/data.d.ts +1 -1
- package/core/src/ssr/lib/html.d.ts +1 -1
- package/core/src/ssr/lib/imports.d.ts +1 -1
- package/core/src/ssr/lib/index.d.ts +1 -1
- package/core/src/ssr/lib/layouts.d.ts +1 -1
- package/core/src/ssr/lib/metadata.d.ts +1 -1
- package/core/src/ssr/lib/mime.d.ts +1 -1
- package/core/src/ssr/lib/modules.d.ts +1 -1
- package/core/src/ssr/lib/path.d.ts +1 -1
- package/core/src/ssr/lib/preload.d.ts +1 -1
- package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
- package/core/src/ssr/lib/scripts/data.d.ts +2 -2
- package/core/src/ssr/lib/scripts/data.d.ts.map +1 -1
- package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
- package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
- package/core/src/ssr/lib/scripts/index.d.ts +1 -1
- package/core/src/ssr/lib/seed.d.ts +1 -1
- package/core/src/ssr/lib/setup.d.ts +4 -2
- package/core/src/ssr/lib/setup.d.ts.map +1 -1
- package/core/src/ssr/lib/styles.d.ts +1 -1
- package/core/src/ssr/lib/template.d.ts +1 -1
- package/core/src/ssr/lib/types.d.ts +1 -1
- package/core/src/ssr/render.d.ts +4 -2
- package/core/src/ssr/render.d.ts.map +1 -1
- package/core/src/ssr/stream.d.ts +4 -2
- package/core/src/ssr/stream.d.ts.map +1 -1
- package/elysia/index.d.ts +1 -1
- package/elysia/index.js +715 -468
- package/elysia/index.js.map +15 -11
- package/elysia/src/index.d.ts +1 -1
- package/elysia/src/libs/assets.d.ts +1 -1
- package/elysia/src/libs/cache.d.ts +1 -1
- package/elysia/src/libs/caching.d.ts +1 -1
- package/elysia/src/libs/http.d.ts +1 -1
- package/elysia/src/libs/image.d.ts +1 -1
- package/elysia/src/libs/index.d.ts +1 -1
- package/elysia/src/libs/llms.d.ts +1 -1
- package/elysia/src/libs/response.d.ts +1 -1
- package/elysia/src/libs/serving.d.ts +1 -1
- package/elysia/src/plugin.d.ts +1 -1
- package/elysia/src/routes/artifacts.d.ts +1 -1
- package/elysia/src/routes/content.d.ts +1 -1
- package/elysia/src/routes/content.d.ts.map +1 -1
- package/elysia/src/routes/image.d.ts +1 -1
- package/elysia/src/routes/index.d.ts +1 -1
- package/elysia/src/routes/internal.d.ts +1 -1
- package/elysia/src/routes/llms.d.ts +1 -1
- package/elysia/src/routes/og.d.ts +1 -1
- package/elysia/src/routes/redirects.d.ts +1 -1
- package/elysia/src/routes/robots.d.ts +1 -1
- package/elysia/src/routes/rss.d.ts +1 -1
- package/elysia/src/routes/search.d.ts +1 -1
- package/elysia/src/routes/sitemap.d.ts +1 -1
- package/elysia/src/routes/ssr.d.ts +1 -1
- package/elysia/src/routes/ssr.d.ts.map +1 -1
- package/elysia/src/routes/static.d.ts +1 -1
- package/elysia/src/routes/static.d.ts.map +1 -1
- package/elysia/src/types.d.ts +1 -1
- package/package.json +2 -9
- package/react/index.d.ts +1 -1
- package/react/index.js +2 -2
- package/react/index.js.map +1 -1
- package/react/src/components/ClientOnly.d.ts +1 -1
- package/react/src/components/ContentRoute.d.ts +1 -1
- package/react/src/components/Image.d.ts +1 -1
- package/react/src/components/LazyRoute.d.ts +1 -1
- package/react/src/components/Link.d.ts +1 -1
- package/react/src/components/Markdown.d.ts +1 -1
- package/react/src/components/Outlet.d.ts +1 -1
- package/react/src/components/index.d.ts +1 -1
- package/react/src/hooks/index.d.ts +1 -1
- package/react/src/hooks/useContent.d.ts +1 -1
- package/react/src/hooks/useData.d.ts +1 -1
- package/react/src/hooks/useFeed.d.ts +1 -1
- package/react/src/hooks/useLayoutData.d.ts +1 -1
- package/react/src/hooks/useLlms.d.ts +1 -1
- package/react/src/hooks/useNavigate.d.ts +1 -1
- package/react/src/hooks/useParams.d.ts +1 -1
- package/react/src/hooks/useRouter.d.ts +1 -1
- package/react/src/hooks/useSearch.d.ts +1 -1
- package/react/src/hooks/useSearchParams.d.ts +1 -1
- package/react/src/hooks/useToc.d.ts +1 -1
- package/react/src/index.d.ts +1 -1
- package/react/src/lib/collection.d.ts +1 -1
- package/react/src/lib/content.d.ts +1 -1
- package/react/src/lib/head.d.ts +1 -1
- package/react/src/lib/index.d.ts +1 -1
- package/react/src/lib/lazy-route.d.ts +1 -1
- package/react/src/lib/route-loader.d.ts +1 -1
- package/react/src/providers/ContentProvider.d.ts +1 -1
- package/react/src/providers/RerouteProvider.d.ts +1 -1
- package/react/src/providers/RouterProvider.d.ts +1 -1
- package/react/src/providers/index.d.ts +1 -1
- package/react/src/types/any.d.ts +1 -1
- package/react/src/types/index.d.ts +1 -1
- package/react/src/types/router.d.ts +1 -1
- package/telemetry/react.d.ts +2 -2
- package/telemetry/react.d.ts.map +1 -1
- package/telemetry/react.js +167 -185
- package/telemetry/react.js.map +7 -6
- package/telemetry/{index.d.ts → server.d.ts} +2 -2
- package/telemetry/server.d.ts.map +1 -0
- package/telemetry/server.js +1134 -0
- package/telemetry/server.js.map +44 -0
- package/telemetry/src/{browser/react.d.ts → react/api.d.ts} +4 -12
- package/telemetry/src/react/api.d.ts.map +1 -0
- package/telemetry/{browser.d.ts → src/react/index.d.ts} +4 -3
- package/telemetry/src/react/index.d.ts.map +1 -0
- package/telemetry/src/{browser/index.d.ts → react/telemetry.d.ts} +13 -13
- package/telemetry/src/react/telemetry.d.ts.map +1 -0
- package/telemetry/src/server/index.d.ts +3 -101
- package/telemetry/src/server/index.d.ts.map +1 -1
- package/telemetry/src/server/instrumentation.d.ts +62 -0
- package/telemetry/src/server/instrumentation.d.ts.map +1 -0
- package/telemetry/src/server/plugin.d.ts +72 -0
- package/telemetry/src/server/plugin.d.ts.map +1 -0
- package/telemetry/browser.d.ts.map +0 -1
- package/telemetry/browser.js +0 -382
- package/telemetry/browser.js.map +0 -10
- package/telemetry/index.d.ts.map +0 -1
- package/telemetry/index.js +0 -509
- package/telemetry/index.js.map +0 -10
- package/telemetry/src/browser/index.d.ts.map +0 -1
- package/telemetry/src/browser/react.d.ts.map +0 -1
package/telemetry/index.js
DELETED
|
@@ -1,509 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* reroute-js v0.25.2
|
|
3
|
-
*
|
|
4
|
-
* @license MIT
|
|
5
|
-
* @copyright 2025 stewones <hi@stewan.io>
|
|
6
|
-
* @see https://github.com/stewones/reroute
|
|
7
|
-
*
|
|
8
|
-
* Built with Bun <3
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
// packages/telemetry/src/server/index.ts
|
|
12
|
-
import os from "node:os";
|
|
13
|
-
import { opentelemetry } from "@elysiajs/opentelemetry";
|
|
14
|
-
import {
|
|
15
|
-
metrics,
|
|
16
|
-
SpanStatusCode,
|
|
17
|
-
trace
|
|
18
|
-
} from "@opentelemetry/api";
|
|
19
|
-
import { logs, SeverityNumber } from "@opentelemetry/api-logs";
|
|
20
|
-
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-proto";
|
|
21
|
-
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-proto";
|
|
22
|
-
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
|
|
23
|
-
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
24
|
-
import {
|
|
25
|
-
BatchLogRecordProcessor,
|
|
26
|
-
LoggerProvider
|
|
27
|
-
} from "@opentelemetry/sdk-logs";
|
|
28
|
-
import {
|
|
29
|
-
MeterProvider,
|
|
30
|
-
PeriodicExportingMetricReader
|
|
31
|
-
} from "@opentelemetry/sdk-metrics";
|
|
32
|
-
import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-node";
|
|
33
|
-
import {
|
|
34
|
-
ATTR_SERVICE_NAME,
|
|
35
|
-
ATTR_SERVICE_VERSION
|
|
36
|
-
} from "@opentelemetry/semantic-conventions";
|
|
37
|
-
import { ATTR_HOST_NAME } from "@opentelemetry/semantic-conventions/incubating";
|
|
38
|
-
function getErrorDetails(error) {
|
|
39
|
-
if (error instanceof Error) {
|
|
40
|
-
return {
|
|
41
|
-
name: error.name,
|
|
42
|
-
message: error.message,
|
|
43
|
-
stack: error.stack || ""
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
if (typeof error === "object" && error !== null) {
|
|
47
|
-
const err = error;
|
|
48
|
-
return {
|
|
49
|
-
name: String(err.name || err.code || "UnknownError"),
|
|
50
|
-
message: String(err.message || err.error || JSON.stringify(error)),
|
|
51
|
-
stack: String(err.stack || "")
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
return {
|
|
55
|
-
name: "UnknownError",
|
|
56
|
-
message: String(error),
|
|
57
|
-
stack: ""
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function telemetry(options = {}) {
|
|
61
|
-
const SERVICE_NAME = options.serviceName || "reroute-app";
|
|
62
|
-
const SERVICE_VERSION = options.serviceVersion || process.env.npm_package_version || "1.0.0";
|
|
63
|
-
const OTLP_ENDPOINT = options.otlpEndpoint || process.env.OTEL_EXPORTER_OTLP_ENDPOINT || "http://localhost:4318";
|
|
64
|
-
const IS_PRODUCTION = options.isProduction ?? true;
|
|
65
|
-
const ENABLE_SYSTEM_METRICS = options.enableSystemMetrics ?? true;
|
|
66
|
-
const METRICS_INTERVAL = options.metricsInterval ?? 5000;
|
|
67
|
-
const ENABLE_PROXY = options.proxy ?? false;
|
|
68
|
-
const PROXY_VERBOSE = options.proxyVerbose ?? false;
|
|
69
|
-
console.log(`[telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`);
|
|
70
|
-
if (ENABLE_PROXY) {
|
|
71
|
-
console.log("[telemetry] Browser telemetry proxy enabled at /api/telemetry/*");
|
|
72
|
-
}
|
|
73
|
-
const otlpHeaders = {};
|
|
74
|
-
if (options.apiKey || process.env.SIGNOZ_API_KEY) {
|
|
75
|
-
otlpHeaders.Authorization = `Bearer ${options.apiKey || process.env.SIGNOZ_API_KEY}`;
|
|
76
|
-
}
|
|
77
|
-
const traceExporter = new OTLPTraceExporter({
|
|
78
|
-
url: `${OTLP_ENDPOINT}/v1/traces`,
|
|
79
|
-
headers: Object.keys(otlpHeaders).length > 0 ? otlpHeaders : undefined,
|
|
80
|
-
timeoutMillis: 5000
|
|
81
|
-
});
|
|
82
|
-
const logExporter = new OTLPLogExporter({
|
|
83
|
-
url: `${OTLP_ENDPOINT}/v1/logs`,
|
|
84
|
-
headers: Object.keys(otlpHeaders).length > 0 ? otlpHeaders : undefined,
|
|
85
|
-
timeoutMillis: 5000
|
|
86
|
-
});
|
|
87
|
-
const metricExporter = new OTLPMetricExporter({
|
|
88
|
-
url: `${OTLP_ENDPOINT}/v1/metrics`,
|
|
89
|
-
headers: Object.keys(otlpHeaders).length > 0 ? otlpHeaders : undefined,
|
|
90
|
-
timeoutMillis: 5000
|
|
91
|
-
});
|
|
92
|
-
const HOSTNAME = process.env.OTEL_RESOURCE_ATTRIBUTES?.match(/host\.name=([^,]+)/)?.[1] || process.env.HOSTNAME || os.hostname();
|
|
93
|
-
const resource = resourceFromAttributes({
|
|
94
|
-
[ATTR_SERVICE_NAME]: SERVICE_NAME,
|
|
95
|
-
[ATTR_SERVICE_VERSION]: SERVICE_VERSION,
|
|
96
|
-
[ATTR_HOST_NAME]: HOSTNAME
|
|
97
|
-
});
|
|
98
|
-
let logger = null;
|
|
99
|
-
try {
|
|
100
|
-
const loggerProvider = new LoggerProvider({
|
|
101
|
-
resource,
|
|
102
|
-
processors: [new BatchLogRecordProcessor(logExporter)]
|
|
103
|
-
});
|
|
104
|
-
logs.setGlobalLoggerProvider(loggerProvider);
|
|
105
|
-
logger = loggerProvider.getLogger(SERVICE_NAME, SERVICE_VERSION);
|
|
106
|
-
} catch (error) {
|
|
107
|
-
console.error("[telemetry] Failed to initialize logger:", error);
|
|
108
|
-
}
|
|
109
|
-
let meter = null;
|
|
110
|
-
try {
|
|
111
|
-
const meterProvider = new MeterProvider({
|
|
112
|
-
resource,
|
|
113
|
-
readers: [
|
|
114
|
-
new PeriodicExportingMetricReader({
|
|
115
|
-
exporter: metricExporter,
|
|
116
|
-
exportIntervalMillis: METRICS_INTERVAL
|
|
117
|
-
})
|
|
118
|
-
]
|
|
119
|
-
});
|
|
120
|
-
metrics.setGlobalMeterProvider(meterProvider);
|
|
121
|
-
meter = meterProvider.getMeter(SERVICE_NAME, SERVICE_VERSION);
|
|
122
|
-
} catch (error) {
|
|
123
|
-
console.error("[telemetry] Failed to initialize meter:", error);
|
|
124
|
-
}
|
|
125
|
-
let httpRequestCounter = null;
|
|
126
|
-
let httpRequestDuration = null;
|
|
127
|
-
let httpErrorCounter = null;
|
|
128
|
-
let httpActiveRequests = null;
|
|
129
|
-
let activeConnections = null;
|
|
130
|
-
if (meter) {
|
|
131
|
-
try {
|
|
132
|
-
httpRequestCounter = meter.createCounter("http.server.request.count", {
|
|
133
|
-
description: "Total HTTP requests",
|
|
134
|
-
unit: "requests"
|
|
135
|
-
});
|
|
136
|
-
httpRequestDuration = meter.createHistogram("http.server.request.duration", {
|
|
137
|
-
description: "HTTP request duration",
|
|
138
|
-
unit: "milliseconds"
|
|
139
|
-
});
|
|
140
|
-
httpErrorCounter = meter.createCounter("http.server.error.count", {
|
|
141
|
-
description: "Total HTTP errors",
|
|
142
|
-
unit: "errors"
|
|
143
|
-
});
|
|
144
|
-
httpActiveRequests = meter.createUpDownCounter("http.server.active_requests", {
|
|
145
|
-
description: "Active HTTP requests",
|
|
146
|
-
unit: "requests"
|
|
147
|
-
});
|
|
148
|
-
activeConnections = meter.createUpDownCounter("app.connections.active", {
|
|
149
|
-
description: "Active connections",
|
|
150
|
-
unit: "connections"
|
|
151
|
-
});
|
|
152
|
-
} catch (error) {
|
|
153
|
-
console.error("[telemetry] Failed to create HTTP metrics:", error);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
if (ENABLE_SYSTEM_METRICS && meter) {
|
|
157
|
-
try {
|
|
158
|
-
const memoryUsage = meter.createObservableGauge("app.memory.usage", {
|
|
159
|
-
description: "Process memory usage",
|
|
160
|
-
unit: "bytes"
|
|
161
|
-
});
|
|
162
|
-
memoryUsage.addCallback((result) => {
|
|
163
|
-
try {
|
|
164
|
-
const usage = process.memoryUsage();
|
|
165
|
-
result.observe(usage.heapUsed, {
|
|
166
|
-
type: "heap",
|
|
167
|
-
"host.name": HOSTNAME
|
|
168
|
-
});
|
|
169
|
-
result.observe(usage.rss, { type: "rss", "host.name": HOSTNAME });
|
|
170
|
-
result.observe(usage.external, {
|
|
171
|
-
type: "external",
|
|
172
|
-
"host.name": HOSTNAME
|
|
173
|
-
});
|
|
174
|
-
} catch (error) {
|
|
175
|
-
console.error("[telemetry] Memory usage callback failed:", error);
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
const systemCpuUsage = meter.createObservableGauge("system.cpu.utilization", {
|
|
179
|
-
description: "System CPU utilization",
|
|
180
|
-
unit: "1"
|
|
181
|
-
});
|
|
182
|
-
systemCpuUsage.addCallback((result) => {
|
|
183
|
-
try {
|
|
184
|
-
const cpus = os.cpus();
|
|
185
|
-
let totalIdle = 0;
|
|
186
|
-
let totalTick = 0;
|
|
187
|
-
cpus.forEach((cpu) => {
|
|
188
|
-
const times = cpu.times;
|
|
189
|
-
totalIdle += times.idle;
|
|
190
|
-
totalTick += times.user + times.nice + times.sys + times.idle + times.irq;
|
|
191
|
-
});
|
|
192
|
-
const usage = 1 - totalIdle / totalTick;
|
|
193
|
-
result.observe(usage, {
|
|
194
|
-
"service.name": SERVICE_NAME,
|
|
195
|
-
"host.name": HOSTNAME
|
|
196
|
-
});
|
|
197
|
-
} catch (error) {
|
|
198
|
-
console.error("[telemetry] CPU usage callback failed:", error);
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
const systemMemoryUsage = meter.createObservableGauge("system.memory.utilization", {
|
|
202
|
-
description: "System memory utilization",
|
|
203
|
-
unit: "1"
|
|
204
|
-
});
|
|
205
|
-
systemMemoryUsage.addCallback((result) => {
|
|
206
|
-
try {
|
|
207
|
-
const totalMem = os.totalmem();
|
|
208
|
-
const freeMem = os.freemem();
|
|
209
|
-
const usage = (totalMem - freeMem) / totalMem;
|
|
210
|
-
result.observe(usage, {
|
|
211
|
-
"service.name": SERVICE_NAME,
|
|
212
|
-
"host.name": HOSTNAME
|
|
213
|
-
});
|
|
214
|
-
} catch (error) {
|
|
215
|
-
console.error("[telemetry] System memory callback failed:", error);
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
} catch (error) {
|
|
219
|
-
console.error("[telemetry] Failed to create system metrics:", error);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
const shutdown = async () => {
|
|
223
|
-
console.log("[telemetry] Shutting down...");
|
|
224
|
-
try {
|
|
225
|
-
await logs.disable();
|
|
226
|
-
} catch (error) {
|
|
227
|
-
console.error("[telemetry] Shutdown error:", error);
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
process.on("SIGTERM", async () => {
|
|
231
|
-
await shutdown();
|
|
232
|
-
process.exit(0);
|
|
233
|
-
});
|
|
234
|
-
return (app) => {
|
|
235
|
-
app = app.use(opentelemetry({
|
|
236
|
-
serviceName: SERVICE_NAME,
|
|
237
|
-
spanProcessors: [new BatchSpanProcessor(traceExporter)]
|
|
238
|
-
})).onBeforeHandle(function trackIncomingRequest({ request, store }) {
|
|
239
|
-
const startTime = Date.now();
|
|
240
|
-
const url = new URL(request.url);
|
|
241
|
-
const route = url.pathname;
|
|
242
|
-
store.startTime = startTime;
|
|
243
|
-
store.route = route;
|
|
244
|
-
try {
|
|
245
|
-
activeConnections?.add(1);
|
|
246
|
-
httpActiveRequests?.add(1, {
|
|
247
|
-
"http.request.method": request.method,
|
|
248
|
-
route
|
|
249
|
-
});
|
|
250
|
-
} catch (error) {
|
|
251
|
-
console.error("[telemetry] Failed to track active requests:", error);
|
|
252
|
-
}
|
|
253
|
-
try {
|
|
254
|
-
logger?.emit({
|
|
255
|
-
severityNumber: SeverityNumber.INFO,
|
|
256
|
-
severityText: "INFO",
|
|
257
|
-
body: `→ ${request.method} ${route}`,
|
|
258
|
-
attributes: {
|
|
259
|
-
"http.request.method": request.method,
|
|
260
|
-
"url.full": request.url,
|
|
261
|
-
"http.route": route,
|
|
262
|
-
"url.scheme": url.protocol.replace(":", ""),
|
|
263
|
-
"server.address": url.host,
|
|
264
|
-
"service.name": SERVICE_NAME
|
|
265
|
-
}
|
|
266
|
-
});
|
|
267
|
-
} catch (error) {
|
|
268
|
-
console.error("[telemetry] Failed to log incoming request:", error);
|
|
269
|
-
}
|
|
270
|
-
try {
|
|
271
|
-
httpRequestCounter?.add(1, {
|
|
272
|
-
"http.request.method": request.method,
|
|
273
|
-
"http.route": route,
|
|
274
|
-
"url.scheme": url.protocol.replace(":", "")
|
|
275
|
-
});
|
|
276
|
-
} catch (error) {
|
|
277
|
-
console.error("[telemetry] Failed to increment request counter:", error);
|
|
278
|
-
}
|
|
279
|
-
}).onError(function handleRequestError({ error, request, set, store }) {
|
|
280
|
-
const errorDetails = getErrorDetails(error);
|
|
281
|
-
const duration = Date.now() - (store.startTime || Date.now());
|
|
282
|
-
try {
|
|
283
|
-
const currentSpan = trace.getActiveSpan();
|
|
284
|
-
if (currentSpan) {
|
|
285
|
-
const errorObj = error instanceof Error ? error : new Error(errorDetails.message);
|
|
286
|
-
currentSpan.recordException(errorObj);
|
|
287
|
-
currentSpan.setStatus({
|
|
288
|
-
code: SpanStatusCode.ERROR,
|
|
289
|
-
message: `${errorDetails.name}: ${errorDetails.message}`
|
|
290
|
-
});
|
|
291
|
-
currentSpan.setAttributes({
|
|
292
|
-
error: true,
|
|
293
|
-
"error.type": errorDetails.name,
|
|
294
|
-
"error.message": errorDetails.message,
|
|
295
|
-
"error.stack": errorDetails.stack,
|
|
296
|
-
"http.request.url": request.url,
|
|
297
|
-
"http.request.method": request.method,
|
|
298
|
-
"http.response.status_code": typeof set.status === "number" ? set.status : 500,
|
|
299
|
-
"service.name": SERVICE_NAME,
|
|
300
|
-
"service.version": SERVICE_VERSION,
|
|
301
|
-
"deployment.environment": IS_PRODUCTION ? "production" : "development",
|
|
302
|
-
"error.timestamp": new Date().toISOString()
|
|
303
|
-
});
|
|
304
|
-
currentSpan.addEvent("exception", {
|
|
305
|
-
"exception.type": errorDetails.name,
|
|
306
|
-
"exception.message": errorDetails.message,
|
|
307
|
-
"exception.stacktrace": errorDetails.stack,
|
|
308
|
-
"exception.escaped": "false"
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
} catch (spanError) {
|
|
312
|
-
console.error("[telemetry] Failed to record exception in span:", spanError);
|
|
313
|
-
}
|
|
314
|
-
try {
|
|
315
|
-
logger?.emit({
|
|
316
|
-
severityNumber: SeverityNumber.ERROR,
|
|
317
|
-
severityText: "ERROR",
|
|
318
|
-
body: `${errorDetails.name}: ${errorDetails.message}`,
|
|
319
|
-
attributes: {
|
|
320
|
-
"error.type": errorDetails.name,
|
|
321
|
-
"error.message": errorDetails.message,
|
|
322
|
-
"error.stack": errorDetails.stack,
|
|
323
|
-
"http.request.method": request.method,
|
|
324
|
-
"url.full": request.url,
|
|
325
|
-
"http.response.status_code": typeof set.status === "number" ? set.status : 500,
|
|
326
|
-
"service.name": SERVICE_NAME
|
|
327
|
-
}
|
|
328
|
-
});
|
|
329
|
-
} catch (logError) {
|
|
330
|
-
console.error("[telemetry] Failed to log error:", logError);
|
|
331
|
-
}
|
|
332
|
-
try {
|
|
333
|
-
const statusCode = typeof set.status === "number" ? set.status : 500;
|
|
334
|
-
httpErrorCounter?.add(1, {
|
|
335
|
-
"http.request.method": request.method,
|
|
336
|
-
"http.response.status_code": statusCode,
|
|
337
|
-
"error.type": errorDetails.name
|
|
338
|
-
});
|
|
339
|
-
httpRequestDuration?.record(duration, {
|
|
340
|
-
"http.request.method": request.method,
|
|
341
|
-
"http.response.status_code": statusCode,
|
|
342
|
-
error: true
|
|
343
|
-
});
|
|
344
|
-
} catch (metricsError) {
|
|
345
|
-
console.error("[telemetry] Failed to record error metrics:", metricsError);
|
|
346
|
-
}
|
|
347
|
-
}).onAfterResponse(function recordResponseMetrics({ request, set, store }) {
|
|
348
|
-
const statusCode = typeof set.status === "number" ? set.status : 200;
|
|
349
|
-
const duration = Date.now() - (store.startTime || Date.now());
|
|
350
|
-
const route = store.route || new URL(request.url).pathname;
|
|
351
|
-
const url = new URL(request.url);
|
|
352
|
-
try {
|
|
353
|
-
activeConnections?.add(-1);
|
|
354
|
-
httpActiveRequests?.add(-1, {
|
|
355
|
-
"http.request.method": request.method,
|
|
356
|
-
route
|
|
357
|
-
});
|
|
358
|
-
} catch (error) {
|
|
359
|
-
console.error("[telemetry] Failed to decrement active requests:", error);
|
|
360
|
-
}
|
|
361
|
-
try {
|
|
362
|
-
const currentSpan = trace.getActiveSpan();
|
|
363
|
-
if (currentSpan) {
|
|
364
|
-
currentSpan.setAttributes({
|
|
365
|
-
"http.response.status_code": statusCode,
|
|
366
|
-
"http.request.url": request.url,
|
|
367
|
-
"http.request.method": request.method,
|
|
368
|
-
"http.route": route,
|
|
369
|
-
"http.duration_ms": duration
|
|
370
|
-
});
|
|
371
|
-
if (statusCode >= 400) {
|
|
372
|
-
currentSpan.setStatus({
|
|
373
|
-
code: SpanStatusCode.ERROR,
|
|
374
|
-
message: `HTTP ${statusCode}`
|
|
375
|
-
});
|
|
376
|
-
currentSpan.setAttribute("error", true);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
} catch (spanError) {
|
|
380
|
-
console.error("[telemetry] Failed to set span attributes:", spanError);
|
|
381
|
-
}
|
|
382
|
-
try {
|
|
383
|
-
const isError = statusCode >= 400;
|
|
384
|
-
logger?.emit({
|
|
385
|
-
severityNumber: isError ? SeverityNumber.ERROR : SeverityNumber.INFO,
|
|
386
|
-
severityText: isError ? "ERROR" : "INFO",
|
|
387
|
-
body: `← ${request.method} ${route} → ${statusCode} (${duration}ms)`,
|
|
388
|
-
attributes: {
|
|
389
|
-
"http.request.method": request.method,
|
|
390
|
-
"url.full": request.url,
|
|
391
|
-
"http.route": route,
|
|
392
|
-
"http.response.status_code": statusCode,
|
|
393
|
-
"http.duration_ms": duration,
|
|
394
|
-
"url.scheme": url.protocol.replace(":", ""),
|
|
395
|
-
"server.address": url.host,
|
|
396
|
-
"service.name": SERVICE_NAME
|
|
397
|
-
}
|
|
398
|
-
});
|
|
399
|
-
} catch (logError) {
|
|
400
|
-
console.error("[telemetry] Failed to log response:", logError);
|
|
401
|
-
}
|
|
402
|
-
try {
|
|
403
|
-
httpRequestDuration?.record(duration, {
|
|
404
|
-
"http.request.method": request.method,
|
|
405
|
-
"http.route": route,
|
|
406
|
-
"http.response.status_code": statusCode,
|
|
407
|
-
"url.scheme": url.protocol.replace(":", "")
|
|
408
|
-
});
|
|
409
|
-
} catch (metricsError) {
|
|
410
|
-
console.error("[telemetry] Failed to record request duration:", metricsError);
|
|
411
|
-
}
|
|
412
|
-
});
|
|
413
|
-
if (ENABLE_PROXY) {
|
|
414
|
-
const API_KEY = options.apiKey || process.env.SIGNOZ_API_KEY;
|
|
415
|
-
app.post("/api/telemetry/v1/traces", async function forwardBrowserTraces({ body }) {
|
|
416
|
-
const headers = {
|
|
417
|
-
"Content-Type": "application/json"
|
|
418
|
-
};
|
|
419
|
-
if (API_KEY) {
|
|
420
|
-
headers.Authorization = `Bearer ${API_KEY}`;
|
|
421
|
-
}
|
|
422
|
-
try {
|
|
423
|
-
const controller = new AbortController;
|
|
424
|
-
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
425
|
-
const response = await fetch(`${OTLP_ENDPOINT}/v1/traces`, {
|
|
426
|
-
method: "POST",
|
|
427
|
-
headers,
|
|
428
|
-
body: JSON.stringify(body),
|
|
429
|
-
signal: controller.signal
|
|
430
|
-
});
|
|
431
|
-
clearTimeout(timeoutId);
|
|
432
|
-
if (PROXY_VERBOSE) {
|
|
433
|
-
console.log(`[telemetry-proxy] Traces forwarded: ${response.status}`);
|
|
434
|
-
}
|
|
435
|
-
if (!response.ok) {
|
|
436
|
-
console.error(`[telemetry-proxy] OTLP error: ${response.status} ${response.statusText}`);
|
|
437
|
-
return new Response(null, { status: 200 });
|
|
438
|
-
}
|
|
439
|
-
return new Response(null, { status: 200 });
|
|
440
|
-
} catch (error) {
|
|
441
|
-
console.error("[telemetry-proxy] Failed to forward traces:", error);
|
|
442
|
-
return new Response(null, { status: 200 });
|
|
443
|
-
}
|
|
444
|
-
}).post("/api/telemetry/v1/metrics", async function forwardBrowserMetrics({ body }) {
|
|
445
|
-
const headers = {
|
|
446
|
-
"Content-Type": "application/json"
|
|
447
|
-
};
|
|
448
|
-
if (API_KEY) {
|
|
449
|
-
headers.Authorization = `Bearer ${API_KEY}`;
|
|
450
|
-
}
|
|
451
|
-
try {
|
|
452
|
-
const controller = new AbortController;
|
|
453
|
-
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
454
|
-
const response = await fetch(`${OTLP_ENDPOINT}/v1/metrics`, {
|
|
455
|
-
method: "POST",
|
|
456
|
-
headers,
|
|
457
|
-
body: JSON.stringify(body),
|
|
458
|
-
signal: controller.signal
|
|
459
|
-
});
|
|
460
|
-
clearTimeout(timeoutId);
|
|
461
|
-
if (PROXY_VERBOSE && !response.ok) {
|
|
462
|
-
console.error(`[telemetry-proxy] OTLP error: ${response.status}`);
|
|
463
|
-
}
|
|
464
|
-
return new Response(null, { status: 200 });
|
|
465
|
-
} catch (error) {
|
|
466
|
-
console.error("[telemetry-proxy] Failed to forward metrics:", error);
|
|
467
|
-
return new Response(null, { status: 200 });
|
|
468
|
-
}
|
|
469
|
-
}).post("/api/telemetry/v1/logs", async function forwardBrowserLogs({ body }) {
|
|
470
|
-
const headers = {
|
|
471
|
-
"Content-Type": "application/json"
|
|
472
|
-
};
|
|
473
|
-
if (API_KEY) {
|
|
474
|
-
headers.Authorization = `Bearer ${API_KEY}`;
|
|
475
|
-
}
|
|
476
|
-
try {
|
|
477
|
-
const controller = new AbortController;
|
|
478
|
-
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
479
|
-
const response = await fetch(`${OTLP_ENDPOINT}/v1/logs`, {
|
|
480
|
-
method: "POST",
|
|
481
|
-
headers,
|
|
482
|
-
body: JSON.stringify(body),
|
|
483
|
-
signal: controller.signal
|
|
484
|
-
});
|
|
485
|
-
clearTimeout(timeoutId);
|
|
486
|
-
if (PROXY_VERBOSE && !response.ok) {
|
|
487
|
-
console.error(`[telemetry-proxy] OTLP logs error: ${response.status}`);
|
|
488
|
-
}
|
|
489
|
-
return new Response(null, { status: 200 });
|
|
490
|
-
} catch (error) {
|
|
491
|
-
console.error("[telemetry-proxy] Failed to forward logs:", error);
|
|
492
|
-
return new Response(null, { status: 200 });
|
|
493
|
-
}
|
|
494
|
-
}).get("/api/telemetry/health", function telemetryHealthCheck() {
|
|
495
|
-
return {
|
|
496
|
-
status: "ok",
|
|
497
|
-
otlpEndpoint: OTLP_ENDPOINT,
|
|
498
|
-
timestamp: new Date().toISOString()
|
|
499
|
-
};
|
|
500
|
-
});
|
|
501
|
-
}
|
|
502
|
-
return app;
|
|
503
|
-
};
|
|
504
|
-
}
|
|
505
|
-
export {
|
|
506
|
-
telemetry
|
|
507
|
-
};
|
|
508
|
-
|
|
509
|
-
//# debugId=FAB88F8126BC5B1164756E2164756E21
|
package/telemetry/index.js.map
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../packages/telemetry/src/server/index.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import os from 'node:os';\nimport { opentelemetry } from '@elysiajs/opentelemetry';\nimport {\n\ttype Counter,\n\ttype Histogram,\n\tmetrics,\n\tSpanStatusCode,\n\ttrace,\n\ttype UpDownCounter,\n} from '@opentelemetry/api';\nimport { logs, SeverityNumber } from '@opentelemetry/api-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport {\n\tBatchLogRecordProcessor,\n\tLoggerProvider,\n} from '@opentelemetry/sdk-logs';\nimport {\n\tMeterProvider,\n\tPeriodicExportingMetricReader,\n} from '@opentelemetry/sdk-metrics';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-node';\nimport {\n\tATTR_SERVICE_NAME,\n\tATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions';\nimport { ATTR_HOST_NAME } from '@opentelemetry/semantic-conventions/incubating';\nimport type { Elysia } from 'elysia';\n\nexport interface ServerTelemetryOptions {\n\t/**\n\t * Service name for telemetry\n\t * @default 'reroute-app'\n\t */\n\tserviceName?: string;\n\n\t/**\n\t * Service version\n\t * @default process.env.npm_package_version || '1.0.0'\n\t */\n\tserviceVersion?: string;\n\n\t/**\n\t * OTLP endpoint URL\n\t * @default process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318'\n\t */\n\totlpEndpoint?: string;\n\n\t/**\n\t * API key for authentication (optional, only needed for SigNoz Cloud)\n\t */\n\tapiKey?: string;\n\n\t/**\n\t * Whether running in production\n\t * @default process.env.NODE_ENV === 'production'\n\t */\n\tisProduction?: boolean;\n\n\t/**\n\t * Enable system metrics (CPU, memory, connections)\n\t * @default true\n\t */\n\tenableSystemMetrics?: boolean;\n\n\t/**\n\t * Metric export interval in milliseconds\n\t * @default 5000\n\t */\n\tmetricsInterval?: number;\n\n\t/**\n\t * Enable browser telemetry proxy\n\t * Creates /api/telemetry/* endpoints to forward browser traces\n\t * This avoids CORS issues and ad blockers\n\t * @default false\n\t */\n\tproxy?: boolean;\n\n\t/**\n\t * Enable verbose logging for proxy\n\t * @default false\n\t */\n\tproxyVerbose?: boolean;\n}\n\n// Helper to extract error details\nfunction getErrorDetails(error: unknown): {\n\tname: string;\n\tmessage: string;\n\tstack: string;\n} {\n\tif (error instanceof Error) {\n\t\treturn {\n\t\t\tname: error.name,\n\t\t\tmessage: error.message,\n\t\t\tstack: error.stack || '',\n\t\t};\n\t}\n\n\tif (typeof error === 'object' && error !== null) {\n\t\tconst err = error as Record<string, unknown>;\n\t\treturn {\n\t\t\tname: String(err.name || err.code || 'UnknownError'),\n\t\t\tmessage: String(err.message || err.error || JSON.stringify(error)),\n\t\t\tstack: String(err.stack || ''),\n\t\t};\n\t}\n\n\treturn {\n\t\tname: 'UnknownError',\n\t\tmessage: String(error),\n\t\tstack: '',\n\t};\n}\n\n/**\n * Server-side telemetry plugin for Elysia\n *\n * Automatically captures:\n * - HTTP requests and responses\n * - Errors with full stack traces\n * - System metrics (CPU, memory)\n * - Request/response sizes\n * - Active connections\n *\n * @example\n * ```typescript\n * import { Elysia } from 'elysia';\n * import { telemetry } from 'reroute-js/telemetry/server';\n *\n * new Elysia()\n * .use(telemetry({\n * serviceName: 'My App',\n * isProduction: true,\n * }))\n * .listen(3000);\n * ```\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Telemetry middleware initialization\nexport function telemetry(options: ServerTelemetryOptions = {}) {\n\tconst SERVICE_NAME = options.serviceName || 'reroute-app';\n\tconst SERVICE_VERSION =\n\t\toptions.serviceVersion || process.env.npm_package_version || '1.0.0';\n\tconst OTLP_ENDPOINT =\n\t\toptions.otlpEndpoint ||\n\t\tprocess.env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n\t\t'http://localhost:4318';\n\tconst IS_PRODUCTION =\n\t\toptions.isProduction ?? process.env.NODE_ENV === 'production';\n\tconst ENABLE_SYSTEM_METRICS = options.enableSystemMetrics ?? true;\n\tconst METRICS_INTERVAL = options.metricsInterval ?? 5000;\n\tconst ENABLE_PROXY = options.proxy ?? false;\n\tconst PROXY_VERBOSE = options.proxyVerbose ?? false;\n\n\tconsole.log(`[telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`);\n\tif (ENABLE_PROXY) {\n\t\tconsole.log(\n\t\t\t'[telemetry] Browser telemetry proxy enabled at /api/telemetry/*',\n\t\t);\n\t}\n\n\t// Secure headers for API authentication (optional)\n\tconst otlpHeaders: Record<string, string> = {};\n\tif (options.apiKey || process.env.SIGNOZ_API_KEY) {\n\t\totlpHeaders.Authorization = `Bearer ${options.apiKey || process.env.SIGNOZ_API_KEY}`;\n\t}\n\n\t// Configure OTLP exporters with timeouts\n\tconst traceExporter = new OTLPTraceExporter({\n\t\turl: `${OTLP_ENDPOINT}/v1/traces`,\n\t\theaders: Object.keys(otlpHeaders).length > 0 ? otlpHeaders : undefined,\n\t\ttimeoutMillis: 5000, // 5 second timeout\n\t});\n\n\tconst logExporter = new OTLPLogExporter({\n\t\turl: `${OTLP_ENDPOINT}/v1/logs`,\n\t\theaders: Object.keys(otlpHeaders).length > 0 ? otlpHeaders : undefined,\n\t\ttimeoutMillis: 5000, // 5 second timeout\n\t});\n\n\tconst metricExporter = new OTLPMetricExporter({\n\t\turl: `${OTLP_ENDPOINT}/v1/metrics`,\n\t\theaders: Object.keys(otlpHeaders).length > 0 ? otlpHeaders : undefined,\n\t\ttimeoutMillis: 5000, // 5 second timeout\n\t});\n\n\t// Create resource with service information\n\t// In Docker, prefer env var over os.hostname() (which returns container ID)\n\tconst HOSTNAME =\n\t\tprocess.env.OTEL_RESOURCE_ATTRIBUTES?.match(/host\\.name=([^,]+)/)?.[1] ||\n\t\tprocess.env.HOSTNAME ||\n\t\tos.hostname();\n\n\tconst resource = resourceFromAttributes({\n\t\t[ATTR_SERVICE_NAME]: SERVICE_NAME,\n\t\t[ATTR_SERVICE_VERSION]: SERVICE_VERSION,\n\t\t[ATTR_HOST_NAME]: HOSTNAME,\n\t});\n\n\t// Set up Logs with error handling\n\tlet logger: ReturnType<LoggerProvider['getLogger']> | null = null;\n\ttry {\n\t\tconst loggerProvider = new LoggerProvider({\n\t\t\tresource,\n\t\t\tprocessors: [new BatchLogRecordProcessor(logExporter)],\n\t\t});\n\t\tlogs.setGlobalLoggerProvider(loggerProvider);\n\t\tlogger = loggerProvider.getLogger(SERVICE_NAME, SERVICE_VERSION);\n\t} catch (error) {\n\t\tconsole.error('[telemetry] Failed to initialize logger:', error);\n\t}\n\n\t// Set up Metrics with error handling\n\tlet meter: ReturnType<MeterProvider['getMeter']> | null = null;\n\ttry {\n\t\tconst meterProvider = new MeterProvider({\n\t\t\tresource,\n\t\t\treaders: [\n\t\t\t\tnew PeriodicExportingMetricReader({\n\t\t\t\t\texporter: metricExporter,\n\t\t\t\t\texportIntervalMillis: METRICS_INTERVAL,\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\t\tmetrics.setGlobalMeterProvider(meterProvider);\n\t\tmeter = meterProvider.getMeter(SERVICE_NAME, SERVICE_VERSION);\n\t} catch (error) {\n\t\tconsole.error('[telemetry] Failed to initialize meter:', error);\n\t}\n\n\t// Create HTTP metrics with null checks\n\tlet httpRequestCounter: Counter | null = null;\n\tlet httpRequestDuration: Histogram | null = null;\n\tlet httpErrorCounter: Counter | null = null;\n\tlet httpActiveRequests: UpDownCounter | null = null;\n\tlet activeConnections: UpDownCounter | null = null;\n\n\tif (meter) {\n\t\ttry {\n\t\t\thttpRequestCounter = meter.createCounter('http.server.request.count', {\n\t\t\t\tdescription: 'Total HTTP requests',\n\t\t\t\tunit: 'requests',\n\t\t\t});\n\n\t\t\thttpRequestDuration = meter.createHistogram(\n\t\t\t\t'http.server.request.duration',\n\t\t\t\t{\n\t\t\t\t\tdescription: 'HTTP request duration',\n\t\t\t\t\tunit: 'milliseconds',\n\t\t\t\t},\n\t\t\t);\n\n\t\t\thttpErrorCounter = meter.createCounter('http.server.error.count', {\n\t\t\t\tdescription: 'Total HTTP errors',\n\t\t\t\tunit: 'errors',\n\t\t\t});\n\n\t\t\thttpActiveRequests = meter.createUpDownCounter(\n\t\t\t\t'http.server.active_requests',\n\t\t\t\t{\n\t\t\t\t\tdescription: 'Active HTTP requests',\n\t\t\t\t\tunit: 'requests',\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tactiveConnections = meter.createUpDownCounter('app.connections.active', {\n\t\t\t\tdescription: 'Active connections',\n\t\t\t\tunit: 'connections',\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error('[telemetry] Failed to create HTTP metrics:', error);\n\t\t}\n\t}\n\n\t// Create system metrics (optional) with error handling\n\tif (ENABLE_SYSTEM_METRICS && meter) {\n\t\ttry {\n\t\t\t// Reuse HOSTNAME from resource (already computed above)\n\n\t\t\tconst memoryUsage = meter.createObservableGauge('app.memory.usage', {\n\t\t\t\tdescription: 'Process memory usage',\n\t\t\t\tunit: 'bytes',\n\t\t\t});\n\n\t\t\tmemoryUsage.addCallback((result) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst usage = process.memoryUsage();\n\t\t\t\t\tresult.observe(usage.heapUsed, {\n\t\t\t\t\t\ttype: 'heap',\n\t\t\t\t\t\t'host.name': HOSTNAME,\n\t\t\t\t\t});\n\t\t\t\t\tresult.observe(usage.rss, { type: 'rss', 'host.name': HOSTNAME });\n\t\t\t\t\tresult.observe(usage.external, {\n\t\t\t\t\t\ttype: 'external',\n\t\t\t\t\t\t'host.name': HOSTNAME,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[telemetry] Memory usage callback failed:', error);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst systemCpuUsage = meter.createObservableGauge(\n\t\t\t\t'system.cpu.utilization',\n\t\t\t\t{\n\t\t\t\t\tdescription: 'System CPU utilization',\n\t\t\t\t\tunit: '1',\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tsystemCpuUsage.addCallback((result) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst cpus = os.cpus();\n\t\t\t\t\tlet totalIdle = 0;\n\t\t\t\t\tlet totalTick = 0;\n\n\t\t\t\t\tcpus.forEach((cpu) => {\n\t\t\t\t\t\tconst times = cpu.times;\n\t\t\t\t\t\ttotalIdle += times.idle;\n\t\t\t\t\t\ttotalTick +=\n\t\t\t\t\t\t\ttimes.user + times.nice + times.sys + times.idle + times.irq;\n\t\t\t\t\t});\n\n\t\t\t\t\tconst usage = 1 - totalIdle / totalTick;\n\t\t\t\t\tresult.observe(usage, {\n\t\t\t\t\t\t'service.name': SERVICE_NAME,\n\t\t\t\t\t\t'host.name': HOSTNAME,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[telemetry] CPU usage callback failed:', error);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst systemMemoryUsage = meter.createObservableGauge(\n\t\t\t\t'system.memory.utilization',\n\t\t\t\t{\n\t\t\t\t\tdescription: 'System memory utilization',\n\t\t\t\t\tunit: '1',\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tsystemMemoryUsage.addCallback((result) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst totalMem = os.totalmem();\n\t\t\t\t\tconst freeMem = os.freemem();\n\t\t\t\t\tconst usage = (totalMem - freeMem) / totalMem;\n\n\t\t\t\t\tresult.observe(usage, {\n\t\t\t\t\t\t'service.name': SERVICE_NAME,\n\t\t\t\t\t\t'host.name': HOSTNAME,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[telemetry] System memory callback failed:', error);\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error('[telemetry] Failed to create system metrics:', error);\n\t\t}\n\t}\n\n\t// Graceful shutdown with error handling\n\tconst shutdown = async () => {\n\t\tconsole.log('[telemetry] Shutting down...');\n\t\ttry {\n\t\t\t// Note: We can't reference loggerProvider/meterProvider here since they're in try blocks\n\t\t\t// The providers will be cleaned up automatically\n\t\t\tawait logs.disable();\n\t\t} catch (error) {\n\t\t\tconsole.error('[telemetry] Shutdown error:', error);\n\t\t}\n\t};\n\n\tprocess.on('SIGTERM', async () => {\n\t\tawait shutdown();\n\t\tprocess.exit(0);\n\t});\n\n\treturn (app: Elysia) => {\n\t\tapp = app\n\t\t\t.use(\n\t\t\t\topentelemetry({\n\t\t\t\t\tserviceName: SERVICE_NAME,\n\t\t\t\t\tspanProcessors: [new BatchSpanProcessor(traceExporter)],\n\t\t\t\t}),\n\t\t\t)\n\t\t\t// Track incoming requests\n\t\t\t.onBeforeHandle(function trackIncomingRequest({ request, store }) {\n\t\t\t\tconst startTime = Date.now();\n\t\t\t\tconst url = new URL(request.url);\n\t\t\t\tconst route = url.pathname;\n\n\t\t\t\t(store as Record<string, unknown>).startTime = startTime;\n\t\t\t\t(store as Record<string, unknown>).route = route;\n\n\t\t\t\t// Track active requests - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\tactiveConnections?.add(1);\n\t\t\t\t\thttpActiveRequests?.add(1, {\n\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\troute,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[telemetry] Failed to track active requests:', error);\n\t\t\t\t}\n\n\t\t\t\t// Log incoming request - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\tlogger?.emit({\n\t\t\t\t\t\tseverityNumber: SeverityNumber.INFO,\n\t\t\t\t\t\tseverityText: 'INFO',\n\t\t\t\t\t\tbody: `→ ${request.method} ${route}`,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\t\t'url.full': request.url,\n\t\t\t\t\t\t\t'http.route': route,\n\t\t\t\t\t\t\t'url.scheme': url.protocol.replace(':', ''),\n\t\t\t\t\t\t\t'server.address': url.host,\n\t\t\t\t\t\t\t'service.name': SERVICE_NAME,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[telemetry] Failed to log incoming request:', error);\n\t\t\t\t}\n\n\t\t\t\t// Increment request counter - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\thttpRequestCounter?.add(1, {\n\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\t'http.route': route,\n\t\t\t\t\t\t'url.scheme': url.protocol.replace(':', ''),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'[telemetry] Failed to increment request counter:',\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})\n\t\t\t// Handle errors with full context\n\t\t\t// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Error handling with context\n\t\t\t.onError(function handleRequestError({ error, request, set, store }) {\n\t\t\t\tconst errorDetails = getErrorDetails(error);\n\t\t\t\tconst duration =\n\t\t\t\t\tDate.now() -\n\t\t\t\t\t(((store as Record<string, unknown>).startTime as number) ||\n\t\t\t\t\t\tDate.now());\n\n\t\t\t\t// Record exception in span - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\tconst currentSpan = trace.getActiveSpan();\n\t\t\t\t\tif (currentSpan) {\n\t\t\t\t\t\tconst errorObj =\n\t\t\t\t\t\t\terror instanceof Error ? error : new Error(errorDetails.message);\n\n\t\t\t\t\t\tcurrentSpan.recordException(errorObj);\n\t\t\t\t\t\tcurrentSpan.setStatus({\n\t\t\t\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\t\t\t\tmessage: `${errorDetails.name}: ${errorDetails.message}`,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcurrentSpan.setAttributes({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t'error.type': errorDetails.name,\n\t\t\t\t\t\t\t'error.message': errorDetails.message,\n\t\t\t\t\t\t\t'error.stack': errorDetails.stack,\n\t\t\t\t\t\t\t'http.request.url': request.url,\n\t\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\t\t'http.response.status_code':\n\t\t\t\t\t\t\t\ttypeof set.status === 'number' ? set.status : 500,\n\t\t\t\t\t\t\t'service.name': SERVICE_NAME,\n\t\t\t\t\t\t\t'service.version': SERVICE_VERSION,\n\t\t\t\t\t\t\t'deployment.environment': IS_PRODUCTION\n\t\t\t\t\t\t\t\t? 'production'\n\t\t\t\t\t\t\t\t: 'development',\n\t\t\t\t\t\t\t'error.timestamp': new Date().toISOString(),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcurrentSpan.addEvent('exception', {\n\t\t\t\t\t\t\t'exception.type': errorDetails.name,\n\t\t\t\t\t\t\t'exception.message': errorDetails.message,\n\t\t\t\t\t\t\t'exception.stacktrace': errorDetails.stack,\n\t\t\t\t\t\t\t'exception.escaped': 'false',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch (spanError) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'[telemetry] Failed to record exception in span:',\n\t\t\t\t\t\tspanError,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Log error - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\tlogger?.emit({\n\t\t\t\t\t\tseverityNumber: SeverityNumber.ERROR,\n\t\t\t\t\t\tseverityText: 'ERROR',\n\t\t\t\t\t\tbody: `${errorDetails.name}: ${errorDetails.message}`,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t'error.type': errorDetails.name,\n\t\t\t\t\t\t\t'error.message': errorDetails.message,\n\t\t\t\t\t\t\t'error.stack': errorDetails.stack,\n\t\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\t\t'url.full': request.url,\n\t\t\t\t\t\t\t'http.response.status_code':\n\t\t\t\t\t\t\t\ttypeof set.status === 'number' ? set.status : 500,\n\t\t\t\t\t\t\t'service.name': SERVICE_NAME,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} catch (logError) {\n\t\t\t\t\tconsole.error('[telemetry] Failed to log error:', logError);\n\t\t\t\t}\n\n\t\t\t\t// Increment error counter - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\tconst statusCode = typeof set.status === 'number' ? set.status : 500;\n\t\t\t\t\thttpErrorCounter?.add(1, {\n\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\t'http.response.status_code': statusCode,\n\t\t\t\t\t\t'error.type': errorDetails.name,\n\t\t\t\t\t});\n\n\t\t\t\t\thttpRequestDuration?.record(duration, {\n\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\t'http.response.status_code': statusCode,\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t});\n\t\t\t\t} catch (metricsError) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'[telemetry] Failed to record error metrics:',\n\t\t\t\t\t\tmetricsError,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})\n\t\t\t// Record response metrics\n\t\t\t// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Response metrics recording\n\t\t\t.onAfterResponse(function recordResponseMetrics({ request, set, store }) {\n\t\t\t\tconst statusCode = typeof set.status === 'number' ? set.status : 200;\n\t\t\t\tconst duration =\n\t\t\t\t\tDate.now() -\n\t\t\t\t\t(((store as Record<string, unknown>).startTime as number) ||\n\t\t\t\t\t\tDate.now());\n\t\t\t\tconst route =\n\t\t\t\t\t((store as Record<string, unknown>).route as string) ||\n\t\t\t\t\tnew URL(request.url).pathname;\n\t\t\t\tconst url = new URL(request.url);\n\n\t\t\t\t// Decrement active requests - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\tactiveConnections?.add(-1);\n\t\t\t\t\thttpActiveRequests?.add(-1, {\n\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\troute,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'[telemetry] Failed to decrement active requests:',\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Set span attributes - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\tconst currentSpan = trace.getActiveSpan();\n\t\t\t\t\tif (currentSpan) {\n\t\t\t\t\t\tcurrentSpan.setAttributes({\n\t\t\t\t\t\t\t'http.response.status_code': statusCode,\n\t\t\t\t\t\t\t'http.request.url': request.url,\n\t\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\t\t'http.route': route,\n\t\t\t\t\t\t\t'http.duration_ms': duration,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (statusCode >= 400) {\n\t\t\t\t\t\t\tcurrentSpan.setStatus({\n\t\t\t\t\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\t\t\t\t\tmessage: `HTTP ${statusCode}`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcurrentSpan.setAttribute('error', true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (spanError) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'[telemetry] Failed to set span attributes:',\n\t\t\t\t\t\tspanError,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Log response - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\tconst isError = statusCode >= 400;\n\t\t\t\t\tlogger?.emit({\n\t\t\t\t\t\tseverityNumber: isError\n\t\t\t\t\t\t\t? SeverityNumber.ERROR\n\t\t\t\t\t\t\t: SeverityNumber.INFO,\n\t\t\t\t\t\tseverityText: isError ? 'ERROR' : 'INFO',\n\t\t\t\t\t\tbody: `← ${request.method} ${route} → ${statusCode} (${duration}ms)`,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\t\t'url.full': request.url,\n\t\t\t\t\t\t\t'http.route': route,\n\t\t\t\t\t\t\t'http.response.status_code': statusCode,\n\t\t\t\t\t\t\t'http.duration_ms': duration,\n\t\t\t\t\t\t\t'url.scheme': url.protocol.replace(':', ''),\n\t\t\t\t\t\t\t'server.address': url.host,\n\t\t\t\t\t\t\t'service.name': SERVICE_NAME,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} catch (logError) {\n\t\t\t\t\tconsole.error('[telemetry] Failed to log response:', logError);\n\t\t\t\t}\n\n\t\t\t\t// Record metrics - wrapped in try/catch to prevent blocking\n\t\t\t\ttry {\n\t\t\t\t\thttpRequestDuration?.record(duration, {\n\t\t\t\t\t\t'http.request.method': request.method,\n\t\t\t\t\t\t'http.route': route,\n\t\t\t\t\t\t'http.response.status_code': statusCode,\n\t\t\t\t\t\t'url.scheme': url.protocol.replace(':', ''),\n\t\t\t\t\t});\n\t\t\t\t} catch (metricsError) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'[telemetry] Failed to record request duration:',\n\t\t\t\t\t\tmetricsError,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Optionally add browser telemetry proxy\n\t\tif (ENABLE_PROXY) {\n\t\t\tconst API_KEY = options.apiKey || process.env.SIGNOZ_API_KEY;\n\n\t\t\tapp\n\t\t\t\t.post(\n\t\t\t\t\t'/api/telemetry/v1/traces',\n\t\t\t\t\t// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Traces endpoint handler\n\t\t\t\t\tasync function forwardBrowserTraces({ body }) {\n\t\t\t\t\t\tconst headers: Record<string, string> = {\n\t\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (API_KEY) {\n\t\t\t\t\t\t\theaders.Authorization = `Bearer ${API_KEY}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Create an AbortController for timeout\n\t\t\t\t\t\t\tconst controller = new AbortController();\n\t\t\t\t\t\t\tconst timeoutId = setTimeout(() => controller.abort(), 5000); // 5 second timeout\n\n\t\t\t\t\t\t\tconst response = await fetch(`${OTLP_ENDPOINT}/v1/traces`, {\n\t\t\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tclearTimeout(timeoutId);\n\n\t\t\t\t\t\t\tif (PROXY_VERBOSE) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t`[telemetry-proxy] Traces forwarded: ${response.status}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t`[telemetry-proxy] OTLP error: ${response.status} ${response.statusText}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t// Return 200 to browser even if backend fails - don't block user experience\n\t\t\t\t\t\t\t\treturn new Response(null, { status: 200 });\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn new Response(null, { status: 200 });\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t'[telemetry-proxy] Failed to forward traces:',\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// Return 200 to browser even on error - don't block user experience\n\t\t\t\t\t\t\treturn new Response(null, { status: 200 });\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\t.post(\n\t\t\t\t\t'/api/telemetry/v1/metrics',\n\t\t\t\t\tasync function forwardBrowserMetrics({ body }) {\n\t\t\t\t\t\tconst headers: Record<string, string> = {\n\t\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (API_KEY) {\n\t\t\t\t\t\t\theaders.Authorization = `Bearer ${API_KEY}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Create an AbortController for timeout\n\t\t\t\t\t\t\tconst controller = new AbortController();\n\t\t\t\t\t\t\tconst timeoutId = setTimeout(() => controller.abort(), 5000); // 5 second timeout\n\n\t\t\t\t\t\t\tconst response = await fetch(`${OTLP_ENDPOINT}/v1/metrics`, {\n\t\t\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tclearTimeout(timeoutId);\n\n\t\t\t\t\t\t\tif (PROXY_VERBOSE && !response.ok) {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t`[telemetry-proxy] OTLP error: ${response.status}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Return 200 to browser even if backend fails - don't block user experience\n\t\t\t\t\t\t\treturn new Response(null, { status: 200 });\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t'[telemetry-proxy] Failed to forward metrics:',\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// Return 200 to browser even on error - don't block user experience\n\t\t\t\t\t\t\treturn new Response(null, { status: 200 });\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\t.post(\n\t\t\t\t\t'/api/telemetry/v1/logs',\n\t\t\t\t\tasync function forwardBrowserLogs({ body }) {\n\t\t\t\t\t\tconst headers: Record<string, string> = {\n\t\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (API_KEY) {\n\t\t\t\t\t\t\theaders.Authorization = `Bearer ${API_KEY}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Create an AbortController for timeout\n\t\t\t\t\t\t\tconst controller = new AbortController();\n\t\t\t\t\t\t\tconst timeoutId = setTimeout(() => controller.abort(), 5000); // 5 second timeout\n\n\t\t\t\t\t\t\tconst response = await fetch(`${OTLP_ENDPOINT}/v1/logs`, {\n\t\t\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tclearTimeout(timeoutId);\n\n\t\t\t\t\t\t\tif (PROXY_VERBOSE && !response.ok) {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t`[telemetry-proxy] OTLP logs error: ${response.status}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Return 200 to browser even if backend fails - don't block user experience\n\t\t\t\t\t\t\treturn new Response(null, { status: 200 });\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error('[telemetry-proxy] Failed to forward logs:', error);\n\t\t\t\t\t\t\t// Return 200 to browser even on error - don't block user experience\n\t\t\t\t\t\t\treturn new Response(null, { status: 200 });\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\t.get('/api/telemetry/health', function telemetryHealthCheck() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: 'ok',\n\t\t\t\t\t\totlpEndpoint: OTLP_ENDPOINT,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t}\n\n\t\treturn app;\n\t};\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "FAB88F8126BC5B1164756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/telemetry/src/browser/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,WAAW,uBAAuB;IACvC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAOD;;;;;;;;;;;;;;GAcG;AAEH,wBAAsB,oBAAoB,CACzC,OAAO,GAAE,uBAA4B,iBA8IrC;AAiND;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACzB,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAM,OAqC1D;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACzB,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAM,QAY1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACzB,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAM,QA0CvD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,kBAMtC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../../../../packages/telemetry/src/browser/react.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,SAAS,EAMd,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,uBAAuB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAID,UAAU,oBAAoB;IAC7B,gBAAgB,EAAE,CACjB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAClD;QACJ,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC;QAC1E,SAAS,EAAE,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QAChE,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACxC,GAAG,EAAE,MAAM,IAAI,CAAC;KAChB,CAAC;IACF,gBAAgB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAClD,IAAI,CAAC;IACV,gBAAgB,EAAE,CACjB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAC/C,IAAI,CAAC;CACV;AAwCD,wBAAgB,iBAAiB,CAAC,EACjC,QAAQ,EACR,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,eAAe,EACf,oBAAoB,GACpB,EAAE,uBAAuB,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAgGnD;AAED,wBAAgB,YAAY,yBAM3B"}
|