Agent配置
SDK自动配置
SDK的自动配置模块用于代理的基本配置。阅读 文档 以查找如配置导出或采样等设置。
以下是一些指向特定部分的SDK和代理的配置选项的快速链接:
配置代理
代理可以从以下一个或多个来源获取配置(按优先级排序):
- 系统属性
- 环境变量
- 配置文件
- 通过
AutoConfigurationCustomizer#addPropertiesSupplier()
函数提供的属性;使用AutoConfigurationCustomizerProvider
SPI
使用环境变量进行配置
在某些环境中,使用环境变量进行配置更加优先。任何可通过系统属性进行配置的设置也可以通过环境变量进行配置。下面的设置选项中许多都包括了两种选项,但当它们不适用时,请按照以下步骤确定所需系统属性的正确名称映射:
- 将系统属性转换为大写。
- 用下划线(
_
)替换所有的.
和-
字符。
例如,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.xml
或log4j2.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.service
为cats-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
)来抑制对特定库的代理仪表。这里的name
(NAME
)是相应的仪表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
跨度。