服务调用日志
概述
使用云开发的资源(HTTP 访问服务、云函数、数据库、云存储)时,会产生对应的服务调用日志,供开发者在云开发控制台检索分析。
日志信息
通过 SDK 或者 HTTP 访问服务使用云开发的资源时,会产生一条服务调用日志。每条服务调用日志会包含 日志元数据、调用服务&事件、资源信息 、调用者信息等 、时间信息 等数据。
日志元数据
日志元数据包含 traceId 、 spanId 、childOf 字段。
在一次完整的服务调用中,可能访问多个云开发的资源,产生的多条云调用日志,这几条日志拥有相同的 traceId ,每条日志的 spanId 则不同,childOf 则记录了其上一跳的 spanId 。
以下面的场景为例, 通过 SDK 调用 云函数 A , 云函数 A 调用了云函数 B。 SDK --> Fun A --> Fun B
在这次服务调用中,实际访问了两次云开发的资源,因此产生了两条服务调用日志 A 和 B,它们的 traceId 相同, spanId 不同, B 的 childOf 为 A 的 spanId。
调用服务&事件
日志中使用 service 和 event 来标记每次服务调用的服务类型和事件动作。
service 服务类型 | event 事件动作 |
---|---|
function 云函数 | callFunction |
storage 云存储 | upload、delete 等 |
database 云数据库 | 数据库操作类别:CRUD+聚合 |
app 云托管 | http 类型,PUT/GET/POST 等 |
资源信息
不同的资源类型,通过不同的字段表示访问的资源信息。
资源类型 | 字段名 | 说明 |
---|---|---|
云函数 | function | 函数名 |
云存储 | file_path | 文件路径(数组,批量获取临时文件路径会是多个) |
云数据库 | collectionName | 集合名称(数组,聚合操作会出现多个) |
http 访问服务 | httpPath | 去除 query 后的路径 |
调用者信息
服务调用日志包含以下的调用者信息
字段名 | 字段信息 |
---|---|
invoker | 调用者 admin/uid/空 |
source | 请求来源渠道 ,web-sdk/node-sdk/http/schedule 等 |
ua | 客户端 UA 信息 |
invokerIp | 来源 IP |
时间信息
日志中表示时间信息的字段是 startTime 和 timeCost,分别表示 服务调用的开始时间和耗时。
错误信息
日志中的 errorCode 和 errorMsg 分别表示 错误码和错误描述。
典型使用场景介绍
查找用户 A 某次访问云开发资源报错
检索日志方法详情请参见 检索日志。
假如用户 A 某次访问云开发的资源报错,那么怎样定位错误原因呢?
- 通过 invoker:A and errorCode:* 来检索此用户最新的访问出错的服务调用日志;
- 检索到服务调用日志后,根据访问时间查阅到日志的 traceId, 通过 traceId:\${traceId} 来检索此次服务调用的所有服务调用日志,根据日志中的调用信息、资源信息、错误信息来分析出错的原因。
- 点击”全链路日志“按钮前往全链路日志页面查看调用链关系。在调用页,可以点击查看函数执行中的日志
云托管 服务调用场景
用户调用云托管 A 服务的接口 1,云托管 A 接口 1 中再次调用云托管 A 服务的接口 2 时,希望将请求关联上同一个 traceid,则需要业务侧进行配合改造。
/json
接口中调用/trace
接口,headers 里透传请求头中的x-cloudbase-trace
字段/trace
接口中,解开x-cloudbase-trace
,得到traceId
,在日志中输出,并可以在后续的日志搜索时,通过
以 nodejs koa 框架代码为例,云托管 A 中 /json
接口中调用另外一个/trace
接口
router.get("/json", async (ctx, next) => {
const res = await axios.get(
"https://test-2gbynbtb9996d4d0-1252395194.ap-shanghai.service.tcloudbase.com/node-capp/trace",
{
headers: {
"x-cloudbase-trace": ctx.req.headers["x-cloudbase-trace"]
}
}
);
ctx.body = res.data;
});
router.get("/trace", async (ctx, next) => {
// 从base64转为utf8编码,数据格式为 ${traceId},${spanId},${on | off}
// 例子:OGY0MzFiN2ViZmNjNDIzZTk5ZDhjZGE3MjQ3MWZmNDksYmJlNzU2ODdmZmZiNmNiOCxvbg 解开后为 8f431b7ebfcc423e99d8cda72471ff49,bbe75687fffb6cb8,on
const traceStr = Buffer.from(ctx.req.headers["x-cloudbase-trace"], "base64").toString("utf-8");
const [traceId] = traceStr.split(",");
// 解出后,可以在日志中打印该字段,方便关联上日志
console.log(`${traceId}: traceId log start`);
ctx.body = {
traceStr,
traceId
};
console.log(`${traceId}: traceId end`);
});
注:如果是云函数中调用云托管,x-cloudbase-trace
则是透传云函数环境变量中的 TCB_TRACELOG
。