SDK自动配置
SDK 的自动配置模块用于代理的基本配置,阅读文档以查找配置导出或采样等设置。以下是这些文档的一些快速链接,用于 SDK 和代理的特定部分的配置选项:
- Exporters
- Trace context propagation
- OpenTelemetry Resource and service name
- Batch span processor
- Sampler
- Span limits
- Using SPI to further configure the SDK
配置代理
代理可以使用来自以下一个或多个来源的配置(从最高到最低优先级排序):
-
系统属性
-
AutoConfigurationCustomizer#addPropertiesSupplier()函数提供的属性;使用 AutoConfigurationCustomizerProvider SPI
使用环境变量配置
在某些环境中,更喜欢通过环境变量进行配置,任何可以使用系统属性配置的设置也可以使用环境变量进行配置,下面的许多设置包括这两个选项,但它们应用以下步骤来确定所需系统属性与环境变量的正确名称映射:
-
将系统属性转换为大写
-
全部替换 . 和 - 为 _ 的字符
例如,otel.instrumentation.common.default-enabled 可以转为 OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED。
配置文件
您可以通过设置以下属性来提供代理配置文件的路径:
系统属性:otel.javaagent.configuration-file
环境变量: OTEL_JAVAAGENT_CONFIGURATION_FILE
描述:
包含代理配置的有效 Java 属性文件的路径
扩展
您可以通过设置以下属性来启用扩展:
系统属性:otel.javaagent.extensions
环境变量: OTEL_JAVAAGENT_EXTENSIONS
描述:
扩展 jar 文件或包含 jar 文件的文件夹的路径,如果指向一个文件夹,则该文件夹中的每个 jar 文件都将被视为单独的、独立的扩展。
Java agent 输出日志
可以通过设置以下属性来配置代理的日志输出:
系统属性:otel.javaagent.logging
环境变量: OTEL_JAVAAGENT_LOGGING
描述:
javaagent 日志模式,支持以下 3 种模式:
-
simple:代理将使用标准错误流打印出其日志,只会打印 INFO 或更高级别的日志,
这是默认的 javaagent 日志记录模式。
-
none:代理不会输出任何内容——甚至不会输出它自己的版本。
-
application:代理将尝试将其自己的日志重定向到被检测应用程序的 slf4j logger,这对于不使用多个类加载器的简单的 one-jar 应用程序最有效,还支持 Spring Boot 应用程序;可以使用被检测应用程序的日志配置进一步配置 javaagent 输出日志(例如logback.xml 或 log4j2.xml), 在生产环境中运行之前,请务必测试此模式是否适用于您的应用程序。
常用的检测配置
一次应用于多个仪器的通用设置。
对等服务名称
对等服务名称是建立连接的远程服务的名称,它对应于本地服务资源中的 service.name。
系统属性:otel.instrumentation.common.peer-service-mapping
环境变量: OTEL_INSTRUMENTATION_COMMON_PEER_SERVICE_MAPPING
描述:
用于指定从主机名或 IP 地址到对等服务的映射,作为 <host_or_ip>=<user_assigned_name> 的逗号分隔列表对,对等服务作为属性添加到其主机或 IP 地址与映射匹配的范围。
例如,如果设置为以下内容:
1.2.3.4=cats-service,dogs-abcdef123.serverlessapis.com=dogs-api
然后,对 1.2.3.4 的请求将具有 cats-service 的 peer.service 属性,对 dogs-abcdef123.serverlessapis.com 的请求将具有 dogs-api 的属性。
数据库语句参数清理
代理在设置 db.statement 语义属性之前清理所有数据库查询/语句,查询字符串中的所有值(字符串、数字)都替换为问号 (?),
注意:JDBC 绑定参数不会在 db.statement 中捕获,如果您正在寻找捕获绑定参数,请参阅相应的问题。
例如:
-
SQL 查询 SELECT a from b where password="secret" 将显示为 SELECT a from b where password=?在导出的span中。
-
Redis 命令 HSET map password "secret" 会显示为 HSET map password ? 在导出的span中。
默认情况下,所有数据库检测都启用此行为,
使用以下属性禁用它:
系统属性:otel.instrumentation.common.db-statement-sanitizer.enabled
环境变量: OTEL_INSTRUMENTATION_COMMON_DB_STATEMENT_SANITIZER_ENABLED
默认值:true
描述:
启用 DB 语句清理
捕获 HTTP 请求和响应headers
您可以将代理配置为将预定义的 HTTP 请求头捕获为span的属性,根据规范约定。使用以下属性定义您想要要捕获的 HTTP 请求头:
系统属性:otel.instrumentation.http.capture-headers.client.request
环境变量: OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_CLIENT_REQUEST
描述:
以逗号分隔的 HTTP 标头名称列表,HTTP 检测客户端工具将捕获所有已配置的请求头名称的 HTTP 的请求头的值。
系统属性:otel.instrumentation.http.capture-headers.client.response
环境变量: OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_CLIENT_RESPONSE
描述:
以逗号分隔的 HTTP 响应头名称列表,HTTP 检测客户端工具将捕获所有已配置响应头名称的 HTTP 响应头的值。
系统属性:otel.instrumentation.http.capture-headers.server.request
环境变量: OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST
描述:
以逗号分隔的 HTTP 请求头名称列表,HTTP 服务器检测工具将捕获所有已配置请求头名称的 HTTP 请求头的值。
系统属性:otel.instrumentation.http.capture-headers.server.response
环境变量: OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE
描述:
以逗号分隔的 HTTP 响应头名称列表,HTTP 服务器检测工具将捕获所有已配置响应头名称的 HTTP 响应头的值。
所有 HTTP 客户端和服务器检测工具都支持这些配置选项。
注意:表中列出的属性/环境变量名称仍处于实验阶段,因此可能会发生变化。
捕获servlet请求参数
您可以配置代理去捕获那些被Servlet API处理的预定义的HTTP请求参数作为Span的属性值,使用以下属性定义要捕获的 servlet 请求参数:
系统属性:otel.instrumentation.servlet.experimental.capture-request-parameters
环境变量: OTEL_INSTRUMENTATION_SERVLET_EXPERIMENTAL_CAPTURE_REQUEST_PARAMETERS
描述:
以逗号分隔的请求参数名称列表
注意:表中列出的属性/环境变量名称仍处于实验阶段,因此可能会发生变化。
捕获消费者消息的遥测数据
您可以配置代理去捕获在消费者消息中的遥测数据,使用下面的属性开启它:
系统属性: otel.instrumentation.messaging.experimental.receive-telemetry.enabled
环境变量: OTEL_INSTRUMENTATION_MESSAGING_EXPERIMENTAL_RECEIVE_TELEMETRY_ENABLED
默认值:false
描述:
启用消费者消息接收遥测
请注意,这将导致消费者端开始一个新的跟踪,只有一个跨度将其连接到生产者跟踪。
注意:表中列出的属性/环境变量名称仍处于实验阶段,因此可能会发生变化。
抑制特定的自动检测
完全禁用代理
您可以使用 -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]) 是下面对应的检测名称。
注意:某些检测依赖于其他检测才能正常运行,当有选择地启用检测时,请确保也启用它的依赖项,确定这种依赖关系留给用户作为练习。
仅启用手动检测
您可以抑制所有自动检测,但通过使用 -Dotel.instrumentation.common.default-enabled=false、 -Dotel.instrumentation.opentelemetry-api.enabled=true、 -Dotel.instrumentation.opentelemetry-instrumentation-annotations.enabled=true 支持使用 @WithSpan 和正常 API 交互的手动检测。
抑制特定代理检测
您可以使用 -Dotel.instrumentation.[name].enabled=false(或使用等效的环境变量 OTEL_INSTRUMENTATION_[NAME]_ENABLED)来抑制特定库的代理检测,其中名称 (NAME) 是相应的检测名称,其与库的关系如下所示:
Library/Framework | Instrumentation 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。
抑制控制器与视图的Span
一些检测(例如 Spring Web MVC 检测)产生SpanKind.Internal跨度来捕获控制器或视图的执行,可以使用下面的配置设置来抑制这些跨度,而不会抑制整个检测,这也会禁用检测捕获父 SpanKind.Server跨度上的 http.route 和关联的跨度名称。
系统属性: otel.instrumentation.common.experimental.controller-telemetry.enabled
环境变量: OTEL_INSTRUMENTATION_COMMON_EXPERIMENTAL_CONTROLLER_TELEMETRY_ENABLED
默认值:true
描述:
启用控制器检测
系统属性: otel.instrumentation.common.experimental.view-telemetry.enabled
环境变量:
OTEL_INSTRUMENTATION_COMMON_EXPERIMENTAL_VIEW_TELEMETRY_ENABLED
默认值:true
描述:
启用视图检测
检测跨度抑制行为
该代理检测的一些库反过来使用了一些更底层的库,它们也需要被检测,这通常会导致包含重复检测数据的嵌套跨度。例如:
-
Reactor Netty HTTP 客户端工具生成的跨度将具有由 Netty 工具生成的重复 HTTP 客户端跨度;
-
由 AWS SDK 检测生成的 Dynamo DB 跨度将具有由其内部 HTTP 客户端库(也被检测)生成的子 HTTP 客户端跨度;
-
由 Tomcat 工具生成的跨度将具有由通用 Servlet API 工具生成的重复 HTTP 服务器跨度。
javaagent 通过检测和抑制重复遥测数据的嵌套跨度来防止这些情况,可以使用以下配置选项配置抑制行为:
系统属性:otel.instrumentation.experimental.span-suppression-strategy
环境变量: OTEL_INSTRUMENTATION_EXPERIMENTAL_SPAN_SUPPRESSION_STRATEGY
描述:
javaagent 跨度抑制策略。支持以下 3 种策略:
-
semconv:代理将抑制重复的语义约定。这是 javaagent 的默认行为。
-
span-kind:代理将抑制具有相同种类的跨度(INTERNAL除外)。
-
none:代理根本不会压制任何东西,我们不建议将此选项用于调试目的以外的任何用途,因为它会生成大量重复的遥测数据。
例如,假设我们检测一个内部使用 Reactor Netty HTTP 客户端的数据库客户端,反过来使用 Netty。
使用默认的 semconv 抑制策略将导致 2 个嵌套的 CLIENT 跨度:
-
CLIENT span 具有数据库客户端检测发出的数据库客户端语义属性;
-
CLIENT span 具有 Reactor Netty 工具发出的 HTTP 客户端语义属性。
Netty 检测将被抑制,因为它复制了 Reactor Netty HTTP 客户端检测。
使用抑制策略 span-kind 只会产生一个跨度:
-
CLIENT span 具有数据库客户端检测发出的数据库客户端语义属性;
Reactor Netty 和 Netty 工具都将被抑制,因为它们也会发出 CLIENT 跨度。
最后,使用抑制策略 none 会产生 3 个跨度:
-
CLIENT span 具有数据库客户端检测发出的数据库客户端语义属性;
-
CLIENT span 具有 Reactor Netty 工具发出的 HTTP 客户端语义属性;
-
CLIENT span 具有 Netty 工具发出的 HTTP 客户端语义属性。