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