知识卡片

字节码注入实现无侵入埋点

专业/工作 · 527.c.1

内容

给应用加分布式追踪埋点,最直接的做法是在每个方法调用前后手写代码去创建、结束 span,但这意味着业务代码里要散落大量和业务逻辑无关的埋点样板。OpenTelemetry Java Agent 走了另一条路:作为一个附加在 Java 进程上的代理,在应用启动时动态往 Spring、Tomcat、Netty、JDBC、Hibernate 这些常用库的字节码里注入采集追踪数据的逻辑,整个过程发生在字节码层面,应用的 Java 源码一行都不用改,也不需要开发者主动调用任何埋点 API。发散:这是”关注点分离”在实现手段上的一个特例——把”业务逻辑要做什么”和”怎么观测这些逻辑的执行过程”这两件事彻底分开,不是靠约定或者接口抽象做到的,而是靠在更底层的字节码这一层动手脚,代价是这类机制比源码级埋点更难调试、行为也更”隐形”,但换来的是业务代码完全不被观测需求污染。

参考来源

《Cloud Native Spring in Action》第13章《Observability and monitoring》