跳转到内容

OTel 事务

如果应用程序已经使用了 OpenTelemetry 或 Micrometer 的追踪注解,jvmguard 无需任何额外配置即可将其转换为 事务。“OTel”事务类型映射:

  • 方法上的 io.opentelemetry.instrumentation.annotations.WithSpan
  • 方法和类上的 io.micrometer.observation.annotation.Observed

在使用 OpenTelemetry 或 Micrometer 的应用程序中,即使没有连接追踪后端,这两个注解通常也已经存在,因为 @WithSpan 只有在 OpenTelemetry 代理或 Spring starter 存在时才生效,@Observed 只有在类路径中存在 Micrometer AOP 时才生效。jvmguard 仅按名称匹配注解,因此注解无需处于可用状态,未使用时也没有开销。

事务记录设置的“OTel”选项卡中包含一个预配置的 OTel 事务定义。与任何其他事务定义一样,它可以编辑、 重新排序、丢弃或删除。删除后不会重新创建。

默认情况下,事务以注解的 span 名称属性命名(@WithSpan 为 value,@Observed 为 contextualName)。 如果该属性为空,事务将命名为 ClassName.methodName,这也是 OpenTelemetry 自身的默认 span 名称。可以在 “命名”选项卡中像其他事务定义一样更改命名。

OTel 事务定义的“筛选”选项卡除了类过滤器之外还有“Span 名称”字段。只有 span 名称与配置的通配符或正则 表达式匹配的注解才会创建事务。没有 span 名称属性的注解永远不会匹配 span 名称过滤器。

一个方法可以携带多个受支持的注解。为避免重复的事务,适用以下规则:

  • 如果方法带有 @MethodTransaction 注解,则只创建已声明的事务。
  • 如果方法同时带有 @WithSpan 和 @Observed(直接标注,或通过外部类上的类级别 @Observed),则只创建 @WithSpan 事务。
  • 直接标注在方法上的注解优先于外部类上的类级别 @Observed。

当执行捕获(堆转储、线程转储、JFR 快照或 JProfiler 记录)时,代理会通过受监控应用程序中 OpenTelemetry SDK 的日志桥接发出一条 OTel 日志记录, 因此捕获会与链路追踪一起显示在现有的 OTel 管道中。这既适用于触发器操作触发的捕获,也适用于在 UI 中或通过 REST API 手动执行的捕获。

代理通过反射调用 OpenTelemetry API,不需要任何特定配置。如果应用程序的类路径上没有 OpenTelemetry API,则不会发出任何内容,只会在代理日志中写入 一条说明。

日志记录的严重级别由触发触发器的策略事件决定:错误事件为 ERROR,很慢和超时未完成事件为 WARN,其他情况(包括手动捕获)为 INFO。 日志记录包含以下属性:

  • jvmguard.capture.type:heap_dump、thread_dump、jfr_snapshot 或 jprofiler_recording
  • jvmguard.capture.origin:trigger 或 manual
  • jvmguard.vm.name:受监控 VM 的名称
  • jvmguard.trigger:触发捕获的触发器的描述
  • jvmguard.transaction.name:其策略事件最后促成触发器触发的事务
  • jvmguard.policy.event:该事务的策略事件类型,例如 SLOW 或 VERY_SLOW

最后两个属性仅在策略触发器触发的捕获中存在。由于触发器在触发前可能会累积来自多个事务的事件,因此它们指的是最近添加事件的事务,而不一定是贡献 最多的事务。

要关闭发送,请在触发器记录设置中取消勾选“将捕获事件作为 OTel 日志记录发送”。该复选框仅在根组中显示, 并对整个集群生效:触发器在组层次结构中是叠加生效的,因此按组开关无法可靠地限定发送范围。