👷 build: integrated otel for instrumenting backend side of Next.js (#9073)

This commit is contained in:
Neko
2025-09-23 15:34:48 +08:00
committed by GitHub
parent 652e0ff415
commit d54113036a
6 changed files with 80 additions and 1 deletions
@@ -35,7 +35,7 @@ exporters:
service:
pipelines:
metrics:
receivers: [prometheus]
receivers: [prometheus, otlp]
exporters: [prometheusremotewrite]
traces:
receivers: [otlp]
+1
View File
@@ -151,6 +151,7 @@
"@lobechat/electron-server-ipc": "workspace:*",
"@lobechat/file-loaders": "workspace:*",
"@lobechat/model-runtime": "workspace:*",
"@lobechat/observability-otel": "workspace:*",
"@lobechat/prompts": "workspace:*",
"@lobechat/utils": "workspace:*",
"@lobechat/web-crawler": "workspace:*",
+25
View File
@@ -0,0 +1,25 @@
{
"name": "@lobechat/observability-otel",
"version": "1.0.0",
"private": true,
"exports": {
"./node": "./src/node.ts"
},
"dependencies": {
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/auto-instrumentations-node": "^0.64.1",
"@opentelemetry/exporter-metrics-otlp-http": "^0.203.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.203.0",
"@opentelemetry/instrumentation": "^0.203.0",
"@opentelemetry/instrumentation-http": "^0.203.0",
"@opentelemetry/instrumentation-pg": "^0.56.0",
"@opentelemetry/resources": "^2.0.1",
"@opentelemetry/sdk-metrics": "^2.0.1",
"@opentelemetry/sdk-node": "^0.203.0",
"@opentelemetry/sdk-trace-node": "^2.0.1",
"@opentelemetry/semantic-conventions": "^1.36.0",
"@vercel/otel": "^1.13.0",
"import-in-the-middle": "^1.14.2",
"require-in-the-middle": "^7.5.2"
}
}
+44
View File
@@ -0,0 +1,44 @@
import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
import { PgInstrumentation } from '@opentelemetry/instrumentation-pg';
import { resourceFromAttributes } from '@opentelemetry/resources';
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
import { NodeSDK } from '@opentelemetry/sdk-node';
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
export function register(options?: { debug?: true | DiagLogLevel, version?: string; }) {
const attributes: Record<string, string> = {
[ATTR_SERVICE_NAME]: 'lobe-chat',
};
if (typeof options?.version !== 'undefined') {
attributes[ATTR_SERVICE_VERSION] = options.version;
}
if (typeof options?.debug !== 'undefined') {
diag.setLogger(
new DiagConsoleLogger(),
options.debug === true ? DiagLogLevel.DEBUG : options.debug,
);
}
const sdk = new NodeSDK({
instrumentations: [
new PgInstrumentation(),
new HttpInstrumentation(),
getNodeAutoInstrumentations(),
],
metricReader: new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter(),
}),
resource: resourceFromAttributes(attributes),
traceExporter: new OTLPTraceExporter(),
});
sdk.start();
}
export {DiagLogLevel} from '@opentelemetry/api';
+4
View File
@@ -0,0 +1,4 @@
import { register } from '@lobechat/observability-otel/node'
import { version } from '../package.json';
register({ version })
+5
View File
@@ -0,0 +1,5 @@
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs' && process.env.ENABLE_TELEMETRY) {
await import('./instrumentation.node');
}
}