Spring MVC OpenTelemetry Java代理扩展,用于在Span属性中添加Spring身份验证的用户id

pbpqsu0x  于 2023-04-06  发布在  Spring
关注(0)|答案(1)|浏览(167)

我有一个Sping Boot 2.7.5应用程序运行opentelemetry-javaagent.jar,其中包含一些自定义扩展。我现在想添加一个自定义SpanProcessor,它将属性userId添加到与Spring REST API的传入HTTP请求对应的所有Span。我该如何做到这一点?
在Spring中,我将通过以下方式获取经过身份验证的用户的id/信息:

SecurityContextHolder.getContext().getAuthentication();

但是我可以从javaagent中的SpanProcessor访问Spring Security Context吗?
我试图找到一个otel-javaagent扩展访问任何SpringBeans的例子,但还没有找到。

2ul0zpep

2ul0zpep1#

OpenTelemetry Java代理扩展位于隔离的AgentClassLoader中,这就是为什么它们无法访问Spring类的原因。
我建议:

  • userId添加到请求开头的SERVER范围
  • (作为一个旁注,这似乎是对OpenTelemetry自动检测的一个很好的补充,因为已经有一个OpenTelemetry属性将其存储在enduser.id中)
  • 在SpanProcessor中,将userId从父级复制到子级,例如:
@Override
@SuppressWarnings("unchecked")
public void onStart(Context parentContext, ReadWriteSpan span) {
  Span parentSpan = Span.fromContextOrNull(parentContext);
  if (!(parentSpan instanceof ReadableSpan)) {
    return;
  }
  ReadableSpan parentReadableSpan = (ReadableSpan) parentSpan;

  ...
}

相关问题