mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-14 03:30:19 +00:00
👷 build: integrated otel for instrumenting backend side of Next.js (#9073)
This commit is contained in:
@@ -35,7 +35,7 @@ exporters:
|
||||
service:
|
||||
pipelines:
|
||||
metrics:
|
||||
receivers: [prometheus]
|
||||
receivers: [prometheus, otlp]
|
||||
exporters: [prometheusremotewrite]
|
||||
traces:
|
||||
receivers: [otlp]
|
||||
|
||||
@@ -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:*",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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';
|
||||
@@ -0,0 +1,4 @@
|
||||
import { register } from '@lobechat/observability-otel/node'
|
||||
import { version } from '../package.json';
|
||||
|
||||
register({ version })
|
||||
@@ -0,0 +1,5 @@
|
||||
export async function register() {
|
||||
if (process.env.NEXT_RUNTIME === 'nodejs' && process.env.ENABLE_TELEMETRY) {
|
||||
await import('./instrumentation.node');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user