Skip to content

Commit 6424d60

Browse files
committed
feat: 测试post 请求 在trace中的展示
1 parent 7b2cacd commit 6424d60

17 files changed

Lines changed: 3214 additions & 480 deletions

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,13 @@ curl 'http://localhost:7001/api/users' \
4646
-H 'sec-ch-ua-platform: "macOS"'
4747
```
4848

49-
上访traceparent为RUM生成,在Flashcat的链路检索中,可以查询 **000000000000000032b049cf4aab3e2d** 即可查询处理
49+
上访traceparent为RUM生成,在Flashcat的链路检索中,可以查询 **000000000000000032b049cf4aab3e2d** 即可查询处理
50+
51+
52+
## 6.30 问题排查
53+
54+
问:Post请求在Trace中无体现
55+
56+
我在本demo中做了一个post接口测试了一下,可以展示
57+
58+
**视频地址:https://c9xudyniiq.feishu.cn/file/PYIHbJPEDoptA4xcEirczcNcnSg**

app/controller/user.ts

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Controller } from 'egg';
22
import opentelemetry,{Span} from '@opentelemetry/api';
33
import { mysqlQuery } from '../service/mysql';
44
import { createMongoClient } from '../service/mongo';
5-
import request from '../service/request';
5+
// import request from '../service/request';
66
const tracer = opentelemetry.trace.getTracer(
77
'guguji9',
88
'1.0.0',
@@ -56,12 +56,85 @@ export default class UserController extends Controller {
5656
parseInt(page as string),
5757
parseInt(pageSize as string)
5858
);
59-
const res2 = await request({uri:'http://10.99.1.223:8081/roll',method:'GET'})
59+
// const res2 = await request({uri:'http://10.99.1.223:8081/roll',method:'GET'})
6060

6161
ctx.body = {
6262
code: 0,
63-
data: {result, res, res2, mongoRes},
63+
data: {result, res, mongoRes},
64+
// data: {result, res, res2, mongoRes},
6465
message: '获取成功',
6566
};
6667
}
68+
69+
public async create() {
70+
const { ctx } = this;
71+
72+
// 获取请求体数据
73+
const userData = ctx.request.body;
74+
75+
// 参数验证
76+
if (!userData.name || !userData.email) {
77+
ctx.status = 400;
78+
ctx.body = {
79+
code: 400,
80+
error: '用户名和邮箱是必填项',
81+
message: '参数错误',
82+
};
83+
return;
84+
}
85+
86+
// 邮箱格式验证
87+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
88+
if (!emailRegex.test(userData.email)) {
89+
ctx.status = 400;
90+
ctx.body = {
91+
code: 400,
92+
error: '邮箱格式不正确',
93+
message: '参数错误',
94+
};
95+
return;
96+
}
97+
98+
try {
99+
100+
// 使用startActiveSpan记录用户创建过程
101+
const result = await tracer.startActiveSpan('create_user', async (span: Span) => {
102+
// 将请求体数据添加到span属性中
103+
span.setAttribute('user.name', userData.name);
104+
span.setAttribute('user.email', userData.email);
105+
span.setAttribute('user.phone', userData.phone || '');
106+
span.setAttribute('user.avatar', userData.avatar || '');
107+
span.setAttribute('user.status', userData.status || 'active');
108+
span.setAttribute('request.timestamp', new Date().toISOString());
109+
110+
// 在span内部调用service创建用户
111+
const newUser = await ctx.service.user.createUser(userData);
112+
console.log('newUser', newUser)
113+
// 记录创建结果到span
114+
span.setAttribute('user.created_id', newUser.id);
115+
span.setAttribute('user.created_time', newUser.createTime);
116+
117+
// 结束span
118+
span.end();
119+
120+
// 返回创建的用户数据
121+
return newUser;
122+
});
123+
124+
ctx.status = 201;
125+
ctx.body = {
126+
code: 0,
127+
data: result,
128+
message: '用户创建成功',
129+
};
130+
} catch (error) {
131+
ctx.logger.error('创建用户失败:', error);
132+
ctx.status = 500;
133+
ctx.body = {
134+
code: 500,
135+
error: '创建用户失败',
136+
message: '服务器内部错误',
137+
};
138+
}
139+
}
67140
}

app/router.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ export default (app: Application) => {
1010
// 用户相关接口
1111
router.get('/api/users', 'user.index');
1212
router.get('/api/users/:id', 'user.show');
13+
router.post('/api/users', 'user.create');
1314
};

app/service/user.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,34 @@ export default class UserService extends Service {
5656
pageSize,
5757
};
5858
}
59+
60+
public async createUser(userData: any): Promise<any> {
61+
const { ctx } = this;
62+
ctx.logger.info(`创建新用户,数据: ${JSON.stringify(userData)}`);
63+
64+
// 模拟用户ID生成(实际项目中应该使用数据库自增ID或UUID)
65+
const userId = Date.now();
66+
67+
// 构建新用户对象
68+
const newUser = {
69+
id: userId,
70+
name: userData.name,
71+
email: userData.email,
72+
phone: userData.phone || null,
73+
avatar: userData.avatar || null,
74+
status: userData.status || 'active',
75+
createTime: new Date().toISOString(),
76+
updateTime: new Date().toISOString(),
77+
};
78+
79+
// 这里可以添加数据库插入逻辑
80+
// 例如:await this.ctx.model.User.create(newUser);
81+
82+
// 模拟数据库操作延迟
83+
await new Promise(resolve => setTimeout(resolve, 100));
84+
85+
ctx.logger.info(`用户创建成功,ID: ${userId}`);
86+
87+
return newUser;
88+
}
5989
}

instrumentation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const { MongoDBInstrumentation } = require('@opentelemetry/instrumentation-mongo
1212

1313
// 声明资源属性:指定 service.name
1414
const resource = new Resource({
15-
[SemanticResourceAttributes.SERVICE_NAME]: 'nodejs10-demo', // 重要:自定义服务名,便于区分服务,也可以通过环境变量传入
15+
[SemanticResourceAttributes.SERVICE_NAME]: 'nodejs10-demo-6-30', // 重要:自定义服务名,便于区分服务,也可以通过环境变量传入
1616
// 也可继续加 service.version、deployment.environment 等
1717
});
1818
// 使用 OTLP over gRPC 导出器

0 commit comments

Comments
 (0)