SkyWalking 为所有的API接口增加 tag

背景胡扯

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

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

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

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

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

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

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

上菜:附加上下文

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

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

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

xml 复制代码
<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 也行。

yml 复制代码
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}

大功告成!

相关推荐
golang学习记28 分钟前
rust开发,选VS Code还是RustRover?
开发语言·后端·rust
打工仔折腾 AI1 小时前
从零写一个CAD 05:以鼠标为中心的滚轮缩放,招法能复用但顺序不能反
开发语言·后端·python·性能优化·计算机外设·swift·ai agent 实战
geovindu3 小时前
rust: Facade Pattern
开发语言·后端·设计模式·rust·外观模式
颜进强3 小时前
20 · NestJs循环依赖与 forwardRef:容器为什么在环面前会死,"占位再补齐"怎么救
前端·后端·ai编程
颜进强4 小时前
19 · NestJs @Global 落地账:装饰器与 `isGlobal` 参数,各在什么场景上岗
前端·后端·ai编程
她的男孩4 小时前
分片上传的大文件人人可下载:文件模块 isPrivate 在合并时被抹成 false,另有 4 个静默坑
java·后端·架构
颜进强4 小时前
18 · NestJS动态模块与 forRoot:`imports: [ConfigModule.forRoot({...})]` 到底在 import 什么
前端·后端·ai编程
xn71334 小时前
Personal AI Agent 架构实战:Memory、权限、跨 App 与本地/云端设计
人工智能·后端·agent
谢亮_vipxieliang4 小时前
Go defer、panic与recover核心知识点
开发语言·后端·golang
颜进强4 小时前
17 · 自定义 Provider 四形态:useValue / useClass / useFactory / useExisting 到底在选什么
前端·后端·ai编程