Commit 44a474d4 by Finley Ge Committed by GitHub

feat: support signoz (#5218)

* feat: support signoz

* chore: restructure otel
parent b50c4373
export const SignozBaseURL = process.env.SIGNOZ_BASE_URL;
export const SignozServiceName = process.env.SIGNOZ_SERVICE_NAME || 'fastgpt';
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;
}
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`
})
});
}
...@@ -3,6 +3,7 @@ import chalk from 'chalk'; ...@@ -3,6 +3,7 @@ import chalk from 'chalk';
import { LogLevelEnum } from './log/constant'; import { LogLevelEnum } from './log/constant';
import { connectionMongo } from '../mongo/index'; import { connectionMongo } from '../mongo/index';
import { getMongoLog } from './log/schema'; import { getMongoLog } from './log/schema';
import { getLogger } from '../otel/log';
export enum EventTypeEnum { export enum EventTypeEnum {
outLinkBot = '[Outlink bot]', outLinkBot = '[Outlink bot]',
...@@ -10,6 +11,8 @@ export enum EventTypeEnum { ...@@ -10,6 +11,8 @@ export enum EventTypeEnum {
wxOffiaccount = '[Offiaccount bot]' wxOffiaccount = '[Offiaccount bot]'
} }
const logger = getLogger();
const logMap = { const logMap = {
[LogLevelEnum.debug]: { [LogLevelEnum.debug]: {
levelLog: chalk.green('[Debug]') levelLog: chalk.green('[Debug]')
...@@ -57,6 +60,17 @@ export const addLog = { ...@@ -57,6 +60,17 @@ export const addLog = {
level === LogLevelEnum.error && console.error(obj); level === LogLevelEnum.error && console.error(obj);
if (logger) {
logger.emit({
severityNumber: level.valueOf(),
severityText: ['debug', 'info', 'warn', 'error'][level],
body: {
msg,
obj
}
});
}
// store log // store log
if (level >= STORE_LOG_LEVEL && connectionMongo.connection.readyState === 1) { if (level >= STORE_LOG_LEVEL && connectionMongo.connection.readyState === 1) {
(async () => { (async () => {
......
...@@ -7,6 +7,13 @@ ...@@ -7,6 +7,13 @@
"@fastgpt/global": "workspace:*", "@fastgpt/global": "workspace:*",
"@modelcontextprotocol/sdk": "^1.12.1", "@modelcontextprotocol/sdk": "^1.12.1",
"@node-rs/jieba": "2.0.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", "@xmldom/xmldom": "^0.8.10",
"@zilliz/milvus2-sdk-node": "2.4.2", "@zilliz/milvus2-sdk-node": "2.4.2",
"axios": "^1.8.2", "axios": "^1.8.2",
...@@ -39,10 +46,13 @@ ...@@ -39,10 +46,13 @@
"papaparse": "5.4.1", "papaparse": "5.4.1",
"pdfjs-dist": "4.10.38", "pdfjs-dist": "4.10.38",
"pg": "^8.10.0", "pg": "^8.10.0",
"pino": "^9.7.0",
"pino-opentelemetry-transport": "^1.0.1",
"request-ip": "^3.3.0", "request-ip": "^3.3.0",
"tiktoken": "1.0.17", "tiktoken": "1.0.17",
"tunnel": "^0.0.6", "tunnel": "^0.0.6",
"turndown": "^7.1.2" "turndown": "^7.1.2",
"winston": "^3.17.0"
}, },
"devDependencies": { "devDependencies": {
"@types/cookie": "^0.5.2", "@types/cookie": "^0.5.2",
......
...@@ -88,3 +88,6 @@ CONFIG_JSON_PATH= ...@@ -88,3 +88,6 @@ CONFIG_JSON_PATH=
# # 日志来源ID前缀 # # 日志来源ID前缀
# CHAT_LOG_SOURCE_ID_PREFIX=fastgpt- # CHAT_LOG_SOURCE_ID_PREFIX=fastgpt-
# Signoz
SIGNOZ_BASE_URL=
SIGNOZ_SERVICE_NAME=
...@@ -18,7 +18,8 @@ export async function register() { ...@@ -18,7 +18,8 @@ export async function register() {
{ startCron }, { startCron },
{ startTrainingQueue }, { startTrainingQueue },
{ preLoadWorker }, { preLoadWorker },
{ loadSystemModels } { loadSystemModels },
{ connectSignoz }
] = await Promise.all([ ] = await Promise.all([
import('@fastgpt/service/common/mongo/init'), import('@fastgpt/service/common/mongo/init'),
import('@fastgpt/service/common/mongo/index'), import('@fastgpt/service/common/mongo/index'),
...@@ -30,9 +31,13 @@ export async function register() { ...@@ -30,9 +31,13 @@ export async function register() {
import('@/service/common/system/cron'), import('@/service/common/system/cron'),
import('@/service/core/dataset/training/utils'), import('@/service/core/dataset/training/utils'),
import('@fastgpt/service/worker/preload'), import('@fastgpt/service/worker/preload'),
import('@fastgpt/service/core/ai/config/utils') import('@fastgpt/service/core/ai/config/utils'),
import('@fastgpt/service/common/otel/trace/register')
]); ]);
// connect to signoz
connectSignoz();
// 执行初始化流程 // 执行初始化流程
systemStartCb(); systemStartCb();
initGlobalVariables(); initGlobalVariables();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment