SkyWalking 为所有的API接口增加 tag

embedded/2024/9/25 4:35:35/

背景胡扯

线上接口报错,接着被 SkyWalking 抓到,然后 SkyWalking 触发告警,最后老板@你,让你辛苦一下,在明早上班前把这个bug 改了,并告诉你你是全公司的希望。谁说不是呢?为公司业务保驾护航,我被责无旁贷。

既然告警都触发了,咱就来看看怎么个事。嘿嘿小样,这下还能让你跑了。(实际上还真的有可能跑了,说多了都是泪)

image.png

我打开 SkyWalking UI 一看,报错服务说要和我试试,我说可以。我一说他啪的一下一个显眼的红色报错直冲我面门,我鼠标一点,当时就全部防住了。防出去以后自然是传统功夫以点到为止,鼠标放在了报错上,没点他。我笑一下,准备收拳。

因为这时间,按传统功夫的点到为止他已经输了,如果我点下去,就直接把他错误堆栈打印出来了,我就鼠标放在错误上没点他。

我收鼠标的时间不打了,他突然袭击抛出上下文,我大意了啊,没有闪。他的上下文给我眼晃了一下,我当时流眼泪了,捂着眼,我说婷婷。上下文怎么没有用户标识。然后两分钟以后就好了,完犊子日志里面也没有。

看来是有备而来,这个服务不讲武德,来骗来偷袭我这个老码农。这好吗?这不好。

总之,就是缺少一些上下文数据,例如用户ID,设备ID这类的数据,我们给补上就行了,给马老师一个闪避的buff。

上菜:附加上下文

看一下官网的文档,怎么样能够给接口添加上下文数据

the toolkit, such as using maven or gradle | Apache SkyWalking

别忘了第一步先引入依赖,依赖版本和你使用的 java-agent 版本保持一致:

<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>${skywalking.version}</version></dependency>

然后才是第二部附加上下文 tag,我总结了三种方式:

第一种是最直接的,直接调用 ActiveSpan.tag("my_tag", "my_value") 操作接口。特点就是直接到不能再直接了。

java">@GetMapping("/xxx")
public Result<User> query() {  ActiveSpan.tag("my_key", "my_value");  // 其他代码。。。 
}

第二种是简单的,在接口方法上打上注解 @Trace@Tag。特点是简单到不能再简单了。

java">@Trace
@Tag(key = "tag1", value = "arg[0]")
@Tag(key = "tag2", value = "arg[1]")
@Tag(key = "username", value = "returnedObj.username")
@Tag(key = "age", value = "returnedObj.age")
public User methodYouWantToTrace(String param1, String param2) {// ...
}

第三种是相对优雅的,在拦截器上使用API统一操作。特点是无侵入。

java">public class SkyWalkingTraceContextInterceptor implements HandlerInterceptor {  @Override  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  // 这里太简单粗暴了,别抄哈。只是提供一种思路String token = request.getHeader(TokenParserConfig.HEADER_TOKEN_KEY);  if (StringUtils.isNotBlank(token)) {  ActiveSpan.tag("biz.token", token);  }  }  
}

如果要能够根据 tag 来进行搜索,不要漏掉最后这一步。在配置文件中增加我们的 tag key,或者直接修改环境变量 SW_SEARCHABLE_TAG_KEYS 也行。

searchableTracesTags: ${SW_SEARCHABLE_TAG_KEYS:http.method,http.status_code,rpc.status_code,db.type,db.instance,mq.queue,mq.topic,mq.broker,mq.payload,biz.token}

大功告成!


http://www.ppmy.cn/embedded/8524.html

相关文章

layer弹出层点击关闭按钮刷新父页面

在弹出层页面&#xff0c;&#xff0c;找到layer关闭按钮&#xff0c;写一个关闭事件&#xff0c;里面去执行js方法。 例&#xff1a;页面写个a标签方便调用&#xff1a;<a id“hidalayerclose” style“display: none;” οnclick“fureload()”> parent.$(".lay…

【网站项目】书籍销售系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

BI工具选择困难?参考这家三甲医院如何进行BI选型

在当今医疗行业&#xff0c;随着信息技术的飞速发展和数据量的爆炸性增长&#xff0c;三甲医院作为医疗服务的高端提供者&#xff0c;面临着前所未有的挑战与机遇。如何从海量的医疗数据中提取有价值的信息&#xff0c;优化医院运营&#xff0c;提高诊疗质量&#xff0c;成为医…

velero备份恢复k8s集群 —— 筑梦之路

官网&#xff1a;Velero 简介 Velero 是vmware开源的一个云原生的灾难恢复和迁移工具&#xff0c;它本身也是开源的,采用Go语言编写&#xff0c;可以安全的备份、恢复和迁移Kubernetes集群资源数据&#xff1b;官网https://velero.io/。 Velero 是西班牙语意思是帆船&#xf…

开源AI智能名片源码:虚实融合引领品牌营销新篇章

随着数字时代的飞速发展&#xff0c;品牌营销已经步入了一个全新的纪元。在这个变革的时代&#xff0c;开源AI智能名片源码以其独特的虚实融合功能&#xff0c;正引领着品牌营销走向更加智能化、个性化的道路。 传统的品牌营销往往局限于单向的信息传播&#xff0c;难以与用户产…

【Qt】探索Qt框架:跨平台GUI开发的利器

文章目录 1. Qt框架概述1.1. Qt框架的优点1.2. Qt框架支持的系统1.3. Qt开发环境 2. 搭建 Qt 开发环境2.1. Qt SDK 的下载和安装2.2. 新建项目: 3. Qt 框架内容简介总结 在当今软件开发领域&#xff0c;跨平台性和用户界面的友好性是至关重要的。而Qt框架作为一款跨平台的C图形…

2024年遥感技术与地理信息国际学术会议(ICRSTGI 2024)

2024年遥感技术与地理信息国际学术会议(ICRSTGI 2024) 2024 International Conference on remote sensing technology and geographic information 一、【会议简介】 2024年遥感技术与地理信息国际学术会议&#xff0c;将汇集世界各地的顶级专家和学者。 在这个会议上&#xf…

Golang | Leetcode Golang题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; func searchInsert(nums []int, target int) int {n : len(nums)left, right : 0, n - 1ans : nfor left < right {mid : (right - left) >> 1 leftif target < nums[mid] {ans midright mid - 1} else {left mid 1}}retu…