跳到主要内容

服务调用日志

概述

使用云开发的资源(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 某次访问云开发的资源报错,那么怎样定位错误原因呢?

  1. 通过 invoker:A and errorCode:* 来检索此用户最新的访问出错的服务调用日志;
  2. 检索到服务调用日志后,根据访问时间查阅到日志的 traceId, 通过 traceId:\${traceId} 来检索此次服务调用的所有服务调用日志,根据日志中的调用信息、资源信息、错误信息来分析出错的原因。
  3. 点击”全链路日志“按钮前往全链路日志页面查看调用链关系。在调用页,可以点击查看函数执行中的日志

云托管 服务调用场景

用户调用云托管 A 服务的接口 1,云托管 A 接口 1 中再次调用云托管 A 服务的接口 2 时,希望将请求关联上同一个 traceid,则需要业务侧进行配合改造。

  1. /json接口中调用 /trace 接口,headers 里透传请求头中的x-cloudbase-trace字段
  2. /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