OpenTelemetry In Java之自动检测Agent配置

SDK自动配置

SDK 的自动配置模块用于代理的基本配置,阅读文档以查找配置导出或采样等设置。以下是这些文档的一些快速链接,用于 SDK 和代理的特定部分的配置选项:

配置代理

代理可以使用来自以下一个或多个来源的配置(从最高到最低优先级排序):

使用环境变量配置

在某些环境中,更喜欢通过环境变量进行配置,任何可以使用系统属性配置的设置也可以使用环境变量进行配置,下面的许多设置包括这两个选项,但它们应用以下步骤来确定所需系统属性与环境变量的正确名称映射:

  • 将系统属性转换为大写

  • 全部替换 . 和 - 为 _ 的字符

例如,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/FrameworkInstrumentation name
Additional methods tracingmethods
Additional tracing annotationsexternal-annotations
Akka Actorakka-actor
Akka HTTPakka-http
Apache Axis2axis2
Apache Camelcamel
Apache Cassandracassandra
Apache CXFcxf
Apache DBCPapache-dbcp
Apache Dubboapache-dubbo
Apache Geodegeode
Apache HttpAsyncClientapache-httpasyncclient
Apache HttpClientapache-httpclient
Apache Kafkakafka
Apache MyFacesjsf-myfaces
Apache Pulsarpulsar
Apache RocketMQrocketmq-client
Apache Struts 2struts
Apache Tapestrytapestry
Apache Tomcattomcat
Apache Wicketwicket
Armeriaarmeria
AsyncHttpClient (AHC)async-http-client
AWS Lambdaaws-lambda
AWS SDKaws-sdk
Azure SDKazure-core
Couchbasecouchbase
C3P0c3p0
Dropwizard Viewsdropwizard-views
Dropwizard Metricsdropwizard-metrics
Eclipse Grizzlygrizzly
Eclipse Jerseyjersey
Eclipse Jettyjetty
Eclipse Jetty HTTP Clientjetty-httpclient
Eclipse Metrometro
Eclipse Mojarrajsf-mojarra
Eclipse Vert.x HttpClientvertx-http-client
Eclipse Vert.x Kafka Clientvertx-kafka-client
Eclipse Vert.x RxJavavertx-rx-java
Eclipse Vert.x Webvertx-web
Elasticsearch clientelasticsearch-transport
Elasticsearch REST clientelasticsearch-rest
Google Guavaguava
Google HTTP clientgoogle-http-client
Google Web Toolkitgwt
Grailsgrails
GraphQL Javagraphql-java
GRPCgrpc
Hibernatehibernate
HikariCPhikaricp
Java HTTP Clientjava-http-client
Java HttpURLConnectionhttp-url-connection
Java JDBCjdbc
Java JDBC DataSourcejdbc-datasource
Java RMIrmi
Java Runtimeruntime-metrics
Java Servletservlet
java.util.concurrentexecutors
java.util.loggingjava-util-logging
JAX-RS (Client)jaxrs-client
JAX-RS (Server)jaxrs
JAX-WSjaxws
JBoss Logging Appenderjboss-logmanager-appender
JBoss Logging MDCjboss-logmanager-mdc
JMSjms
Jodd HTTPjodd-http
JSPjsp
K8s Clientkubernetes-client
kotlinx.coroutineskotlinx-coroutines
Log4j Appenderlog4j-appender
Log4j MDC (1.x)log4j-mdc
Log4j Context Data (2.x)log4j-context-data
Logback Appenderlogback-appender
Logback MDClogback-mdc
Micrometermicrometer
MongoDBmongo
Netflix Hystrixhystrix
Nettynetty
OkHttpokhttp
OpenLibertyliberty
OpenTelemetry Extension Annotationsopentelemetry-extension-annotations
OpenTelemetry Instrumentation Annotationsopentelemetry-instrumentation-annotations
OpenTelemetry APIopentelemetry-api
Oracle UCPoracle-ucp
OSHI (Operating System and Hardware Information)oshi
Play Frameworkplay
Play WS HTTP Clientplay-ws
Quartzquartz
R2DBCr2dbc
RabbitMQ Clientrabbitmq
Ratpackratpack
ReactiveX RxJavarxjava
Reactorreactor
Reactor Nettyreactor-netty
Redis Jedisjedis
Redis Lettucelettuce
Rediscalarediscala
Redissonredisson
Restletrestlet
Scala ForkJoinPoolscala-fork-join
Spark Web Frameworkspark
Spring Batchspring-batch
Spring Corespring-core
Spring Dataspring-data
Spring JMSspring-jms
Spring Integrationspring-integration
Spring Kafkaspring-kafka
Spring RabbitMQspring-rabbit
Spring RMIspring-rmi
Spring Schedulingspring-scheduling
Spring Webspring-web
Spring WebFluxspring-webflux
Spring Web MVCspring-webmvc
Spring Web Servicesspring-ws
Spymemcachedspymemcached
Tomcat JDBCtomcat-jdbc
Twilio SDKtwilio
Twitter Finatrafinatra
Undertowundertow
Vaadinvaadin
Vibur DBCPvibur-dbcp
ZIOzio

注意:使用环境变量时,破折号(-)应转换为下划线(_),例如,要抑制来自 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 客户端语义属性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
opentelemetry-javaagent.jar 是一个用于自动化和 Java 应用程序的分布式跟踪的工具。我们可以使用自定义 instrument 来扩展其功能。 自定义 instrument 可以帮助我们实现一些自定义的行为,例如,我们可以在代码中插入额外的标记信息,或者在特定的函数或方法中加入额外的追踪逻辑。 要实现自定义 instrument,我们需要进行以下步骤: 1. 创建一个 Java 类,并继承 `OtelInstrumenter` 类。这是一个由 OpenTelemetry 提供的接口,用于定义自定义 instrument 的行为。 2. 在该类中,我们需要实现 `applyInstrumentation` 方法。该方法会被调用来应用自定义的 instrument 到目标应用程序中。 3. 在 `applyInstrumentation` 方法中,我们可以使用 OpenTelemetry 提供的 API 来修改目标应用程序的代码,例如,在特定的函数或方法调用前后插入追踪代码。 4. 编译并打包自定义 instrument 的代码,并将其作为 `-javaagent` 参数传递给 `opentelemetry-javaagent.jar`。当目标应用程序启动时,这个自定义 instrument 会被加载和应用。 通过使用自定义 instrument,我们可以根据自己的需求对目标应用程序的代码进行修改和增强。这样,我们就能够更好地实现跟踪和监控,并获得更加详细和准确的跟踪数据。 总结起来,opentelemetry-javaagent.jar 提供了一种灵活和可扩展的方式来实现自定义 instrument。我们可以通过创建自定义 instrument 类,并在其中实现特定的逻辑来修改目标应用程序的代码,从而实现更精确和详细的分布式跟踪。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值