Agent配置

SDK自动配置

SDK的自动配置模块用于代理的基本配置。阅读 文档 以查找如配置导出或采样等设置。

以下是一些指向特定部分的SDK和代理的配置选项的快速链接:

配置代理

代理可以从以下一个或多个来源获取配置(按优先级排序):

使用环境变量进行配置

在某些环境中,使用环境变量进行配置更加优先。任何可通过系统属性进行配置的设置也可以通过环境变量进行配置。下面的设置选项中许多都包括了两种选项,但当它们不适用时,请按照以下步骤确定所需系统属性的正确名称映射:

  • 将系统属性转换为大写。
  • 用下划线(_)替换所有的 .- 字符。

例如,otel.instrumentation.common.default-enabled 将转换为 OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED

配置文件

可以通过设置以下属性来提供代理配置文件的路径:

System property: otel.javaagent.configuration-file Environment variable: OTEL_JAVAAGENT_CONFIGURATION_FILE

Description: Path to valid Java properties file which contains the agent configuration.

扩展

可以通过设置以下属性来启用扩展

System property: otel.javaagent.extensions Environment variable: OTEL_JAVAAGENT_EXTENSIONS

Description: 扩展JAR文件或包含JAR文件的文件夹的路径。如果指向的是文件夹,该文件夹中的每个JAR文件都将被视为单独的、独立的扩展。

Java代理日志输出

可以通过设置以下属性来配置Java代理的日志输出:

System property: otel.javaagent.logging Environment variable: OTEL_JAVAAGENT_LOGGING

Description: Java代理的日志模式。支持以下3种模式:

  • simple:代理将使用标准错误流输出日志。只会输出INFO或更高级别的日志。这是默认的Java代理日志模式。
  • none:代理将不会输出任何日志,包括自身的版本。
  • application:代理将尝试将自己的日志重定向到被代理应用程序的slf4j日志记录器。这适用于简单的单JAR应用程序,不使用多个类加载器;也支持Spring Boot应用程序。Java代理的输出日志可以使用被代理应用程序的日志配置(例如logback.xmllog4j2.xml)进一步进行配置。在生产环境中运行之前,请确保测试此模式适用于您的应用程序

通用仪表配置

适用于多个仪表的通用设置。

同级服务名称

同级服务名称 是建立连接的远程服务的名称。它对应于本地服务的资源中的service.name属性。

System property: otel.instrumentation.common.peer-service-mapping Environment variable: OTEL_INSTRUMENTATION_COMMON_PEER_SERVICE_MAPPING

Description: 用于指定从主机名或IP地址到同级服务的映射的逗号分隔的<host_or_ip>=<user_assigned_name>对列表。同级服务将作为属性添加到满足映射的主机名或IP地址的跨度。

例如,如果设置为以下内容:

1.2.3.4=cats-service,dogs-abcdef123.serverlessapis.com=dogs-api

那么,对1.2.3.4的请求将具有peer.service属性为cats-service,对dogs-abcdef123.serverlessapis.com的请求将具有peer.service属性为dogs-api

从Java代理版本1.31.0开始,可以提供端口和路径来定义peer.service

例如,如果设置为以下内容:

1.2.3.4:443=cats-service,dogs-abcdef123.serverlessapis.com:80/api=dogs-api

那么,对1.2.3.4的请求将没有peer.service属性的覆盖,而1.2.3.4:443将具有peer.servicecats-service的属性,对dogs-abcdef123.serverlessapis.com:80/api/v1的请求将具有peer.service属性为dogs-api

数据库语句脱敏

代理在设置db.statement语义属性之前,会对所有的数据库查询/语句进行脱敏。查询字符串中的所有值(字符串、数字)都将替换为问号(?)。

注意:JDBC绑定参数不会被捕获在db.statement中。如果您想捕获绑定参数,请参阅 相关问题

例子:

  • SQL查询语句SELECT a from b where password="secret"在导出的跨度中将显示为SELECT a from b where password=?
  • Redis命令HSET map password "secret"在导出的跨度中将显示为HSET map password ?

默认情况下,这个行为对所有的数据库仪表都是开启的。使用以下属性来禁用它:

System property: otel.instrumentation.common.db-statement-sanitizer.enabled Environment variable: OTEL_INSTRUMENTATION_COMMON_DB_STATEMENT_SANITIZER_ENABLED

Default: true
Description: 启用DB语句脱敏。

捕获HTTP请求和响应头

您可以配置代理根据 语义约定 捕获预定义的HTTP头作为跨度属性。使用以下属性定义要捕获的HTTP头:

System property: otel.instrumentation.http.client.capture-request-headers Environment variable: OTEL_INSTRUMENTATION_HTTP_CLIENT_CAPTURE_REQUEST_HEADERS

Description: 逗号分隔的HTTP头名称列表。HTTP客户端仪表将捕获所有配置的标头名称的HTTP请求头值。

System property: otel.instrumentation.http.client.capture-response-headers Environment variable: OTEL_INSTRUMENTATION_HTTP_CLIENT_CAPTURE_RESPONSE_HEADERS

Description: 逗号分隔的HTTP头名称列表。HTTP客户端仪表将捕获所有配置的标头名称的HTTP响应头值。

System property: otel.instrumentation.http.server.capture-request-headers Environment variable: OTEL_INSTRUMENTATION_HTTP_SERVER_CAPTURE_REQUEST_HEADERS

Description: 逗号分隔的HTTP头名称列表。HTTP服务器仪表将捕获所有配置的标头名称的HTTP请求头值。

System property: otel.instrumentation.http.server.capture-response-headers Environment variable: OTEL_INSTRUMENTATION_HTTP_SERVER_CAPTURE_RESPONSE_HEADERS

Description: 逗号分隔的HTTP头名称列表。HTTP服务器仪表将捕获所有配置的标头名称的HTTP响应头值。

所有HTTP客户端和服务器仪表支持这些配置选项。

注意:表中列出的属性/环境变量名称仍处于实验阶段,因此可能会发生更改。

捕获Servlet请求参数

您可以配置代理,以捕获由Servlet API处理的请求的预定义HTTP请求参数作为跨度属性。使用以下属性定义要捕获的Servlet请求参数:

System property: otel.instrumentation.servlet.experimental.capture-request-parameters Environment variable: OTEL_INSTRUMENTATION_SERVLET_EXPERIMENTAL_CAPTURE_REQUEST_PARAMETERS

Description: 逗号分隔的请求参数名称列表。

注意:表中列出的属性/环境变量名称仍处于实验阶段,因此可能会发生更改。

捕获消息中间件仪表中的消费者消息接收遥测

您可以配置代理以捕获消息中间件的消费者消息接收遥测。使用以下属性启用它:

System property: otel.instrumentation.messaging.experimental.receive-telemetry.enabled Environment variable: OTEL_INSTRUMENTATION_MESSAGING_EXPERIMENTAL_RECEIVE_TELEMETRY_ENABLED

Default: false
Description: 启用消费者消息接收遥测。

请注意,这将导致消费者端启动一个新的跟踪,只有一个跨度链接将其与生产者跟踪连接。

注意:表中列出的属性/环境变量名称仍处于实验阶段,因此可能会发生更改。

禁止特定的自动仪表

完全禁用代理

您可以使用 -Dotel.javaagent.enabled=false(或等效的环境变量OTEL_JAVAAGENT_ENABLED=false)禁用代理。

仅启用特定的仪表

您可以禁用所有默认的自动仪表,然后选择性地重新启用每个仪表。这样做可以减少启动开销或更好地控制应用的仪表应用。

  • 使用 -Dotel.instrumentation.common.default-enabled=false(或等价的环境变量OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED=false)禁用代理中的所有仪表。
  • 使用 -Dotel.instrumentation.[name].enabled=true(或等价的环境变量OTEL_INSTRUMENTATION_[NAME]_ENABLED)逐个启用每个所需的仪表。这里的 [name][NAME])是以下相应仪表的名称。

注意:某些仪表依赖于其他仪表的正常运行。当选择性启用仪表时,确保同时启用其传递依赖项。确定这种依赖关系的关系留给用户自行决定。

仅启用手动仪表

可以抑制所有自动仪表的启用,但支持使用 @WithSpan 和正常API交互的手动仪表,使用 -Dotel.instrumentation.common.default-enabled=false -Dotel.instrumentation.opentelemetry-api.enabled=true -Dotel.instrumentation.opentelemetry-instrumentation-annotations.enabled=true

抑制特定的代理仪表

可以使用 -Dotel.instrumentation.[name].enabled=false(或等效的环境变量OTEL_INSTRUMENTATION_[NAME]_ENABLED)来抑制对特定库的代理仪表。这里的nameNAME)是相应的仪表name

库/框架 仪表名称
Additional methods tracing methods
Additional tracing annotations external-annotations
Akka Actor akka-actor
Akka HTTP akka-http
Apache Axis2 axis2
Apache Camel camel
Apache Cassandra cassandra
Apache CXF cxf
Apache DBCP apache-dbcp
Apache Dubbo apache-dubbo
Apache Geode geode
Apache HttpAsyncClient apache-httpasyncclient
Apache HttpClient apache-httpclient
Apache Kafka kafka
Apache MyFaces jsf-myfaces
Apache Pulsar pulsar
Apache RocketMQ rocketmq-client
Apache Struts 2 struts
Apache Tapestry tapestry
Apache Tomcat tomcat
Apache Wicket wicket
Armeria armeria
AsyncHttpClient (AHC) async-http-client
AWS Lambda aws-lambda
AWS SDK aws-sdk
Azure SDK azure-core
Couchbase couchbase
C3P0 c3p0
Dropwizard Views dropwizard-views
Dropwizard Metrics dropwizard-metrics
Eclipse Grizzly grizzly
Eclipse Jersey jersey
Eclipse Jetty jetty
Eclipse Jetty HTTP Client jetty-httpclient
Eclipse Metro metro
Eclipse Mojarra jsf-mojarra
Eclipse Vert.x HttpClient vertx-http-client
Eclipse Vert.x Kafka Client vertx-kafka-client
Eclipse Vert.x RxJava vertx-rx-java
Eclipse Vert.x Web vertx-web
Elasticsearch client elasticsearch-transport
Elasticsearch REST client elasticsearch-rest
Google Guava guava
Google HTTP client google-http-client
Google Web Toolkit gwt
Grails grails
GraphQL Java graphql-java
GRPC grpc
Hibernate hibernate
HikariCP hikaricp
Java HTTP Client java-http-client
Java HttpURLConnection http-url-connection
Java JDBC jdbc
Java JDBC DataSource jdbc-datasource
Java RMI rmi
Java Runtime runtime-metrics
Java Servlet servlet
java.util.concurrent executors
java.util.logging java-util-logging
JAX-RS (Client) jaxrs-client
JAX-RS (Server) jaxrs
JAX-WS jaxws
JBoss Logging Appender jboss-logmanager-appender
JBoss Logging MDC jboss-logmanager-mdc
JMS jms
Jodd HTTP jodd-http
JSP jsp
K8s Client kubernetes-client
kotlinx.coroutines kotlinx-coroutines
Log4j Appender log4j-appender
Log4j MDC (1.x) log4j-mdc
Log4j Context Data (2.x) log4j-context-data
Logback Appender logback-appender
Logback MDC logback-mdc
Micrometer micrometer
MongoDB mongo
Netflix Hystrix hystrix
Netty netty
OkHttp okhttp
OpenLiberty liberty
OpenTelemetry Extension Annotations opentelemetry-extension-annotations
OpenTelemetry Instrumentation Annotations opentelemetry-instrumentation-annotations
OpenTelemetry API opentelemetry-api
Oracle UCP oracle-ucp
OSHI (Operating System and Hardware Information) oshi
Play Framework play
Play WS HTTP Client play-ws
Quartz quartz
R2DBC r2dbc
RabbitMQ Client rabbitmq
Ratpack ratpack
ReactiveX RxJava rxjava
Reactor reactor
Reactor Netty reactor-netty
Redis Jedis jedis
Redis Lettuce lettuce
Rediscala rediscala
Redisson redisson
Restlet restlet
Scala ForkJoinPool scala-fork-join
Spark Web Framework spark
Spring Batch spring-batch
Spring Core spring-core
Spring Data spring-data
Spring JMS spring-jms
Spring Integration spring-integration
Spring Kafka spring-kafka
Spring RabbitMQ spring-rabbit
Spring RMI spring-rmi
Spring Scheduling spring-scheduling
Spring Web spring-web
Spring WebFlux spring-webflux
Spring Web MVC spring-webmvc
Spring Web Services spring-ws
Spymemcached spymemcached
Tomcat JDBC tomcat-jdbc
Twilio SDK twilio
Twitter Finatra finatra
Undertow undertow
Vaadin vaadin
Vibur DBCP vibur-dbcp
ZIO zio

注意:使用环境变量时,破折号(-)应转换为下划线(_)。例如,要禁止akka-actor库的跟踪,请将OTEL_INSTRUMENTATION_AKKA_ACTOR_ENABLED设置为false

抑制控制器和/或视图跨度

某些仪表(例如,Spring Web MVC 仪表)生成 SpanKind.Internal 跨度以捕获控制器和/或视图的执行。可以使用以下配置设置来抑制这些跨度,而无需禁用整个仪表,这样也可以禁用仪表在父 SpanKind.Server 跨度上捕获 http.route 和相关的跨度名称。

System property: otel.instrumentation.common.experimental.controller-telemetry.enabled Environment variable: OTEL_INSTRUMENTATION_COMMON_EXPERIMENTAL_CONTROLLER_TELEMETRY_ENABLED

Default: true
Description: 启用控制器遥测。

System property: otel.instrumentation.common.experimental.view-telemetry.enabled Environment variable: OTEL_INSTRUMENTATION_COMMON_EXPERIMENTAL_VIEW_TELEMETRY_ENABLED

Default: true
Description: 启用视图遥测。

仪表跨度抑制行为

由于代理中仪表的一些库还使用了低层级的被仪表化的库,这在结果上会产生重复的遥测数据。例如:

  • 由 Reactor Netty HTTP client 仪表产生的跨度也会有由 Netty 仪表产生的重复的 HTTP client 跨度;
  • 由 AWS SDK 仪表产生的 Dynamo DB 跨度会有由其内部的 HTTP client 库(也被仪表化)产生的子 HTTP client 跨度;
  • 由 Tomcat 仪表产生的跨度会有由通用 Servlet API 仪表产生的重复的 HTTP server 跨度。

Java代理通过检测和抑制重复遥测数据的嵌套跨度来防止这些情况。抑制行为可以使用以下配置选项进行配置:

System property: otel.instrumentation.experimental.span-suppression-strategy Environment variable: OTEL_INSTRUMENTATION_EXPERIMENTAL_SPAN_SUPPRESSION_STRATEGY

Description: Java代理的遥测数据抑制策略。支持以下3种策略:

  • semconv:代理将抑制重复的语义约定。这是Java代理的默认行为。
  • span-kind:代理将抑制具有相同类型(除了INTERNAL)的跨度。
  • none:代理将不会抑制任何内容。我们不建议以除了调试目的之外的任何用途使用此选项,因为它会生成大量重复的遥测数据

例如,假设我们仪表化了一个内部使用 Reactor Netty HTTP 客户端的数据库客户端:

使用默认的 semconv 抑制策略,会产生2个嵌套的 CLIENT 跨度:

  • 由数据库客户端仪表产生并具有数据库客户端语义属性的 CLIENT 跨度;
  • 由 Reactor Netty 仪表产生并具有 HTTP 客户端语义属性的 CLIENT 跨度。

Netty 仪表化将被抑制,因为其重复了 Reactor Netty 仪表化。

使用抑制策略 span-kind,只会产生一个跨度:

  • 由数据库客户端仪表产生并具有数据库客户端语义属性的 CLIENT 跨度。

Reactor Netty 和 Netty 仪表化都将被抑制,因为它们均生成了 CLIENT 跨度。

最后,使用抑制策略 none,将产生3个跨度:

  • 由数据库客户端仪表产生并具有数据库客户端语义属性的 CLIENT 跨度;
  • 由 Reactor Netty 仪表产生并具有 HTTP 客户端语义属性的 CLIENT 跨度;
  • 由 Netty 仪表产生并具有 HTTP 客户端语义属性的 CLIENT 跨度。
最后修改 December 10, 2023: translate (a4350d6e)