feat: support signoz (#5218)

* feat: support signoz

* chore: restructure otel
This commit is contained in:
Finley Ge
2025-07-16 15:20:17 +08:00
committed by GitHub
parent b50c4373b3
commit 44a474d49f
8 changed files with 541 additions and 27 deletions

View File

@@ -0,0 +1,2 @@
export const SignozBaseURL = process.env.SIGNOZ_BASE_URL;
export const SignozServiceName = process.env.SIGNOZ_SERVICE_NAME || 'fastgpt';

View File

@@ -0,0 +1,35 @@
import { LoggerProvider, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs';
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
import { SignozBaseURL, SignozServiceName } from '../const';
import { resourceFromAttributes } from '@opentelemetry/resources';
import type { Logger } from '@opentelemetry/api-logs';
export const getLogger = () => {
if (!global.logger) {
if (!SignozBaseURL) {
return null;
}
const otlpExporter = new OTLPLogExporter({
url: `${SignozBaseURL}/v1/logs`,
headers: {
'Content-Type': 'application/json'
}
});
const loggerProvider = new LoggerProvider({
processors: [new SimpleLogRecordProcessor(otlpExporter)],
resource: resourceFromAttributes({
'service.name': SignozServiceName
})
});
// logsAPI.logs.setGlobalLoggerProvider(loggerProvider);
global.logger = loggerProvider.getLogger('default');
}
return global.logger;
};
declare global {
var logger: Logger;
}

View File

@@ -0,0 +1,20 @@
import { registerOTel, OTLPHttpJsonTraceExporter } from '@vercel/otel';
// Add otel logging
// import { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';
import { SignozBaseURL, SignozServiceName } from '../const';
import { addLog } from '../../system/log';
// diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);
export function connectSignoz() {
if (!SignozBaseURL) {
addLog.warn('Signoz is not configured');
return;
}
addLog.info(`Connecting signoz, ${SignozBaseURL}, ${SignozServiceName}`);
return registerOTel({
serviceName: SignozServiceName,
traceExporter: new OTLPHttpJsonTraceExporter({
url: `${SignozBaseURL}/v1/traces`
})
});
}

View File

@@ -3,6 +3,7 @@ import chalk from 'chalk';
import { LogLevelEnum } from './log/constant';
import { connectionMongo } from '../mongo/index';
import { getMongoLog } from './log/schema';
import { getLogger } from '../otel/log';
export enum EventTypeEnum {
outLinkBot = '[Outlink bot]',
@@ -10,6 +11,8 @@ export enum EventTypeEnum {
wxOffiaccount = '[Offiaccount bot]'
}
const logger = getLogger();
const logMap = {
[LogLevelEnum.debug]: {
levelLog: chalk.green('[Debug]')
@@ -57,6 +60,17 @@ export const addLog = {
level === LogLevelEnum.error && console.error(obj);
if (logger) {
logger.emit({
severityNumber: level.valueOf(),
severityText: ['debug', 'info', 'warn', 'error'][level],
body: {
msg,
obj
}
});
}
// store log
if (level >= STORE_LOG_LEVEL && connectionMongo.connection.readyState === 1) {
(async () => {

View File

@@ -7,6 +7,13 @@
"@fastgpt/global": "workspace:*",
"@modelcontextprotocol/sdk": "^1.12.1",
"@node-rs/jieba": "2.0.1",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/api-logs": "^0.203.0",
"@opentelemetry/exporter-logs-otlp-http": "^0.203.0",
"@opentelemetry/resources": "^2.0.1",
"@opentelemetry/sdk-logs": "^0.203.0",
"@opentelemetry/winston-transport": "^0.14.0",
"@vercel/otel": "^1.13.0",
"@xmldom/xmldom": "^0.8.10",
"@zilliz/milvus2-sdk-node": "2.4.2",
"axios": "^1.8.2",
@@ -39,10 +46,13 @@
"papaparse": "5.4.1",
"pdfjs-dist": "4.10.38",
"pg": "^8.10.0",
"pino": "^9.7.0",
"pino-opentelemetry-transport": "^1.0.1",
"request-ip": "^3.3.0",
"tiktoken": "1.0.17",
"tunnel": "^0.0.6",
"turndown": "^7.1.2"
"turndown": "^7.1.2",
"winston": "^3.17.0"
},
"devDependencies": {
"@types/cookie": "^0.5.2",