You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中DataDog无法追踪Kotlin @Service类的invoke方法

问题描述

我在Spring Boot 2.7.12应用中有如下@Service类:

@Service
class GetAllUsers(val userRepository: UserRepository) {

    operator fun invoke(): List<User> {
        return userRepository.findAll()
    } 
}

通过环境变量DD_TRACE_METHODS配置追踪:

DD_TRACE_METHOD: "com.application.user.GetAllUsers[invoke]"

但调用API时,追踪仅显示Controller和Repository方法(UsersController.getAll --> UserRepository.findAll)。

更奇怪的是,若在invoke方法内添加一个空方法hello并将其加入追踪列表:

@Service
class GetAllUsers(val userRepository: UserRepository) {

    operator fun invoke(): List<User> {
        hello()
        return userRepository.findAll()
    }

    fun hello(){
      //Does nothing
    }
}
DD_TRACE_METHOD: "com.application.user.GetAllUsers[invoke, hello]"

此时追踪会正常显示:UsersController.getAll --> GetAllUsers.invoke --> UserRepository.findAll。

请问如何无需添加额外方法,正确追踪invoke方法?

解决方案

这个问题本质是Datadog字节码增强机制处理Kotlinoperator invoke方法时的特殊表现:当invoke方法体内只有直接调用其他被追踪方法(比如userRepository.findAll())时,Datadog的追踪代理可能会进行方法内联优化,跳过对invoke方法的追踪埋点。添加空方法hello后打破了内联条件,埋点逻辑才正常生效。

可以通过以下几种方式解决:

1. 禁用Datadog的方法内联优化

在invoke方法上添加Datadog提供的@DontInline注解,强制代理不对该方法进行内联,确保埋点逻辑执行:

import datadog.trace.api.DontInline

@Service
class GetAllUsers(val userRepository: UserRepository) {

    @DontInline
    operator fun invoke(): List<User> {
        return userRepository.findAll()
    } 
}

保持原有的DD_TRACE_METHODS配置不变即可。

2. 使用字节码层面的方法签名配置追踪

Kotlin的invoke方法编译后的字节码签名和普通方法略有差异,尝试在环境变量中指定完整的方法签名:

DD_TRACE_METHOD: "com.application.user.GetAllUsers.invoke()Ljava/util/List;"

这种方式直接匹配字节码级别的方法定义,避免Datadog的方法匹配逻辑遗漏目标方法。

3. 手动添加追踪注解

如果配置方式不生效,可以直接用Datadog的@Trace注解显式标记需要追踪的方法,无需依赖环境变量配置:

import datadog.trace.api.Trace

@Service
class GetAllUsers(val userRepository: UserRepository) {

    @Trace(operationName = "GetAllUsers.invoke")
    operator fun invoke(): List<User> {
        return userRepository.findAll()
    } 
}

内容的提问来源于stack exchange,提问作者regmoraes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:01:07