Skip to content

Commit 90870d1

Browse files
FinleyGedreamer6680
authored andcommitted
feat: support signoz (labring#5218)
* feat: support signoz * chore: restructure otel
1 parent 9891cfa commit 90870d1

File tree

8 files changed

+541
-27
lines changed

8 files changed

+541
-27
lines changed

packages/service/common/otel/const.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const SignozBaseURL = process.env.SIGNOZ_BASE_URL;
2+
export const SignozServiceName = process.env.SIGNOZ_SERVICE_NAME || 'fastgpt';
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { LoggerProvider, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs';
2+
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
3+
import { SignozBaseURL, SignozServiceName } from '../const';
4+
import { resourceFromAttributes } from '@opentelemetry/resources';
5+
import type { Logger } from '@opentelemetry/api-logs';
6+
7+
export const getLogger = () => {
8+
if (!global.logger) {
9+
if (!SignozBaseURL) {
10+
return null;
11+
}
12+
const otlpExporter = new OTLPLogExporter({
13+
url: `${SignozBaseURL}/v1/logs`,
14+
headers: {
15+
'Content-Type': 'application/json'
16+
}
17+
});
18+
19+
const loggerProvider = new LoggerProvider({
20+
processors: [new SimpleLogRecordProcessor(otlpExporter)],
21+
resource: resourceFromAttributes({
22+
'service.name': SignozServiceName
23+
})
24+
});
25+
26+
// logsAPI.logs.setGlobalLoggerProvider(loggerProvider);
27+
global.logger = loggerProvider.getLogger('default');
28+
}
29+
30+
return global.logger;
31+
};
32+
33+
declare global {
34+
var logger: Logger;
35+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { registerOTel, OTLPHttpJsonTraceExporter } from '@vercel/otel';
2+
// Add otel logging
3+
// import { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';
4+
import { SignozBaseURL, SignozServiceName } from '../const';
5+
import { addLog } from '../../system/log';
6+
// diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);
7+
8+
export function connectSignoz() {
9+
if (!SignozBaseURL) {
10+
addLog.warn('Signoz is not configured');
11+
return;
12+
}
13+
addLog.info(`Connecting signoz, ${SignozBaseURL}, ${SignozServiceName}`);
14+
return registerOTel({
15+
serviceName: SignozServiceName,
16+
traceExporter: new OTLPHttpJsonTraceExporter({
17+
url: `${SignozBaseURL}/v1/traces`
18+
})
19+
});
20+
}

packages/service/common/system/log.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ import chalk from 'chalk';
33
import { LogLevelEnum } from './log/constant';
44
import { connectionMongo } from '../mongo/index';
55
import { getMongoLog } from './log/schema';
6+
import { getLogger } from '../otel/log';
67

78
export enum EventTypeEnum {
89
outLinkBot = '[Outlink bot]',
910
feishuBot = '[Feishu bot]',
1011
wxOffiaccount = '[Offiaccount bot]'
1112
}
1213

14+
const logger = getLogger();
15+
1316
const logMap = {
1417
[LogLevelEnum.debug]: {
1518
levelLog: chalk.green('[Debug]')
@@ -57,6 +60,17 @@ export const addLog = {
5760

5861
level === LogLevelEnum.error && console.error(obj);
5962

63+
if (logger) {
64+
logger.emit({
65+
severityNumber: level.valueOf(),
66+
severityText: ['debug', 'info', 'warn', 'error'][level],
67+
body: {
68+
msg,
69+
obj
70+
}
71+
});
72+
}
73+
6074
// store log
6175
if (level >= STORE_LOG_LEVEL && connectionMongo.connection.readyState === 1) {
6276
(async () => {

packages/service/package.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77
"@fastgpt/global": "workspace:*",
88
"@modelcontextprotocol/sdk": "^1.12.1",
99
"@node-rs/jieba": "2.0.1",
10+
"@opentelemetry/api": "^1.9.0",
11+
"@opentelemetry/api-logs": "^0.203.0",
12+
"@opentelemetry/exporter-logs-otlp-http": "^0.203.0",
13+
"@opentelemetry/resources": "^2.0.1",
14+
"@opentelemetry/sdk-logs": "^0.203.0",
15+
"@opentelemetry/winston-transport": "^0.14.0",
16+
"@vercel/otel": "^1.13.0",
1017
"@xmldom/xmldom": "^0.8.10",
1118
"@zilliz/milvus2-sdk-node": "2.4.2",
1219
"axios": "^1.8.2",
@@ -39,10 +46,13 @@
3946
"papaparse": "5.4.1",
4047
"pdfjs-dist": "4.10.38",
4148
"pg": "^8.10.0",
49+
"pino": "^9.7.0",
50+
"pino-opentelemetry-transport": "^1.0.1",
4251
"request-ip": "^3.3.0",
4352
"tiktoken": "1.0.17",
4453
"tunnel": "^0.0.6",
45-
"turndown": "^7.1.2"
54+
"turndown": "^7.1.2",
55+
"winston": "^3.17.0"
4656
},
4757
"devDependencies": {
4858
"@types/cookie": "^0.5.2",

pnpm-lock.yaml

Lines changed: 449 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

projects/app/.env.template

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,6 @@ CONFIG_JSON_PATH=
8888
# # 日志来源ID前缀
8989
# CHAT_LOG_SOURCE_ID_PREFIX=fastgpt-
9090

91+
# Signoz
92+
SIGNOZ_BASE_URL=
93+
SIGNOZ_SERVICE_NAME=

projects/app/src/instrumentation.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ export async function register() {
1818
{ startCron },
1919
{ startTrainingQueue },
2020
{ preLoadWorker },
21-
{ loadSystemModels }
21+
{ loadSystemModels },
22+
{ connectSignoz }
2223
] = await Promise.all([
2324
import('@fastgpt/service/common/mongo/init'),
2425
import('@fastgpt/service/common/mongo/index'),
@@ -30,9 +31,13 @@ export async function register() {
3031
import('@/service/common/system/cron'),
3132
import('@/service/core/dataset/training/utils'),
3233
import('@fastgpt/service/worker/preload'),
33-
import('@fastgpt/service/core/ai/config/utils')
34+
import('@fastgpt/service/core/ai/config/utils'),
35+
import('@fastgpt/service/common/otel/trace/register')
3436
]);
3537

38+
// connect to signoz
39+
connectSignoz();
40+
3641
// 执行初始化流程
3742
systemStartCb();
3843
initGlobalVariables();

0 commit comments

Comments
 (0)