代码诊断
代码诊断功能帮助您打通运行业务代码时的信息。当服务异常报错时,您可以在环境的调用链里查看错误堆栈,并直接跳转定位到出错的代码位置。快速定位错误快速解决错误,降低应用的平均修复时间(MTTR)。
环境配置
在创建环境时,可以打开代码诊断的功能开关。打开后,系统会检测镜像中是否已经带有「代码仓库元信息」。
点击详情会提示有哪些服务没有查找到元数据信息。没有元数据信息的服务,将无法使用代码诊断功能。
在已有的环境中,可以点击「环境」->「设置」中也可以开通代码诊断。
如果没有代码元信息需要为服务添加代码仓库元信息,请查看上报代码仓库元信息。
查看错误堆栈
首先要在环境中接入链路追踪数据源。
当您的服务出现异常时,点击「链路追踪」可以看到红色感叹号标识有问题的请求和 span。点击 span 上的日志图标,会弹出错误堆栈。
当该服务的「代码仓库元信息」已经上报到链路追踪,就可以在这个界面上看到错误堆栈的分析。分析结果会高亮您的业务代码。hover 在高亮代码上,会提示您的代码信息。点击「代码诊断」的跳转链接,即可跳转到相应的代码仓库页面,高亮这行代码。
如果您的服务没有上报,错误堆栈将无法得到分析结果,也不能跳转到业务代码。
注意 ⚠️:目前错误堆栈分析仅支持 GoLang、Java,且相关应用必须成功上报代码仓库元信息。
上报代码仓库元信息
上报代码仓库元信息包括以下三个步骤:
1. 上报到制品属性
2. 下发到环境变量
3. 写入到 Trace Span Tag
1. 上报到制品属性
有两种方式可以把代码仓库元信息上报到制品中,选其中一种即可。
- 使用 docker build 构建标准 OCI Spec 镜像 (推荐)
如果您在「构建计划」中使用 docker build 来构建镜像。可以在 docker build 的命令中添加 --label org.opencontainers.image.revision
和 --label org.opencontainers.image.source
, 如下面示例:
IMAGE_SOURCE=/path/to/your/http/clone/url/without/protocol
docker build ${IMAGE} \
--label org.opencontainers.image.revision=$(git rev-parse HEAD) \
--label org.opencontainers.image.source=${IMAGE_SOURCE} #如:e.coding.net/codingtech/vectorobserve/cjava.git
注意 ⚠️:Label:
org.opencontainers.image.source
对应的 IMAGE_SOURCE 需要取值为 Git Clone Http Url 去掉 Protocol 后的字符串。
如:Git Clone Http Url 为https://e.coding.net/codingtech/vectorobserve/cjava.git
则 IMAGE_SOURCE 为e.coding.net/codingtech/vectorobserve/cjava.git
。
Label Key 值您可以参考 OCI 标准。
- 使用 CODING CI「上传镜像插件」
在构建计划中,使用 CODING 提供的上传镜像插件,也可以自动把元数据上传到制品库中。
2. 下发到环境变量
如果您使用 Orbit 发布,那么 Orbit 会自动检测到您的制品中是否有相关属性,并在部署时为您下发环境变量到对应的 kubernetes 应用中,您可以使用如下命令确认是否下发成功。
kubectl -n get deployment -o yaml | egrep "GIT_COMMIT_SHA|GIT_REPOSITORY_URL"
3. 写入到 Trace span tag
从环境变量中提取对应的 value 并写入 trace span tag,这里的实现统一使用了 OpenTelemetry 标准语义。如果您没有阅读过,可以参考 官方语义文档 。
在具体使用方面,您可以参考如下 CODING 给出的使用示例,或官方文档:Java SDK 以及 Go SDK。
以 Java 为例:
// 从环境变量中拿到对应的元数据
private static String getEnvVarWithFallback(String envVarName, String fallback) {
return Optional.ofNullable(System.getenv(envVarName)).orElse(fallback);
}
// 在对应方法的 span 中设置 tag attribute, @WithSpan 注解会自动 recordException
@io.opentelemetry.extension.annotations.WithSpan
public void someMethod() {
ActiveSpan.tag("git.commit.sha", defaultCommit);
Span.current().setAttribute("git.commit.sha", getEnvVarWithFallback("GIT_COMMIT_SHA", "notExistCommit"));
ActiveSpan.tag("git.repository.url", defaultUrl);
Span.current().setAttribute("git.repository.url", getEnvVarWithFallback("GIT_REPOSITORY_URL", "notExistUrl"));
}
以 Golang 为例:
// 从环境变量中拿到对应的元数据
func GetEnvOrDefault(key string, defaultValue string) string {
value := os.Getenv(key)
if len(value) == 0 || len(strings.TrimSpace(value)) == 0 {
return defaultValue
} else {
return value
}
}
// 在对应方法的 span 中设置 tag attribute,并 recordException
func recordError(ctx context.Context, errString string) {
span := trace.SpanFromContext(ctx)
span.SetAttributes(attribute.String(GitCommitSha, util.GetEnvOrDefault(GitCommitShaEnv, "af92002a94b2ea9ebbd551edb5bd9e62eb5ac7d5")))
span.SetAttributes(attribute.String(GitRepoUrl, util.GetEnvOrDefault(GitRepoUrlEnv, "git.dnt-cd-dev3.extranet.codingcorp.net/codingcorp/rockidx/coffee-maker-go.git")))
span.SetStatus(codes.Error, errString)
span.RecordError(err, trace.WithStackTrace(true))
}
在阅读中是否遇到以下问题?*
您希望我们如何改进?*
如果您希望得到回复,请留下您的邮箱地址。