这是由两部分组成的系列文章的第二部分。第一部分可在Kubernetes Java 应用程序的零配置 OpenTelemetry 自动检测中找到。在第一部分中,我将介绍如何设置和安装 Kubernetes 的 OpenTelemetry Operator,并配置它以使用 OpenTelemetry Java agent 对 Java 应用程序进行自动检测。
在第二部分中,我将展示如何通过 OpenTelemetry Operator 安装任何 Java agent,并以 Elastic Java agent 为例。
安装和配置回顾
本系列的第 1 部分,Kubernetes Java 应用程序的零配置 OpenTelemetry 自动检测,详细介绍了 OpenTelemetry Operator 和 Instrumentation 资源的安装和配置。以下是步骤概要,作为提醒
- 安装 cert-manager,例如kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.yaml
- 安装 Operator,例如kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
- 创建 Instrumentation 资源
- 向部署或命名空间添加注解
- 照常部署应用程序
在第一部分中,步骤 3、4 和 5 是针对 OpenTelemetry Java agent 实现的。在本博客中,我将使用 Elastic APM agent 作为示例来实现它们。我假设上面概述的步骤 1 和 2 已经完成,即 Operator 现在已安装。我将继续使用
使用 Elastic OpenTelemetry Java 发行版
从 0.4.0 版本开始,Elastic OpenTelemetry Java 发行版 在 docker 镜像中包含路径
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: elastic-otel
namespace: banana
spec:
exporter:
endpoint: https://my.apm.server.url
propagators:
- tracecontext
- baggage
- b3
sampler:
type: parentbased_traceidratio
argument: "1.0"
java:
image: docker.elastic.co/observability/elastic-otel-javaagent:1.1.0
env:
- name: OTEL_EXPORTER_OTLP_HEADERS
value: "Authorization=Bearer my-apm-secret-token"
- name: ELASTIC_OTEL_INFERRED_SPANS_ENABLED
value: "true"
- name: ELASTIC_OTEL_SPAN_STACK_TRACE_MIN_DURATION
value: "50"
我已包含用于打开 agent 中几个特性的环境,包括
- ELASTIC_APM_PROFILING_INFERRED_SPANS_ENABLED,用于打开此博客中描述的推断 span 实现特性
- 如果 span 耗时超过 ELASTIC_OTEL_SPAN_STACK_TRACE_MIN_DURATION(默认值为 5 毫秒),则会自动捕获 span 堆栈跟踪
添加注解 ...
metadata:
annotations:
instrumentation.opentelemetry.io/inject-java: "elastic-otel"
... 到 pod yaml 中可使应用程序被跟踪,并在 Elastic APM UI 中显示,包括推断的子 span 和堆栈跟踪
上面提到的特性的添加内容以红色圈出 — 左下角的推断 span(用于 methodC 和 methodD)和右上角的堆栈跟踪。(请注意,pod 包括
使用 Elastic APM Java agent
从 1.50.0 版本开始,Elastic APM Java agent 在 docker 镜像中包含路径 /javaagent.jar 处的 agent jar — 这基本上是 OpenTelemetry Operator 可用于自动检测的 docker 镜像所需的全部内容。这意味着 Instrumentation 资源很容易定义
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: elastic-apm
namespace: banana
spec:
java:
image: docker.elastic.co/observability/apm-agent-java:1.52.1
env:
- name: ELASTIC_APM_SERVER_URL
value: "https://my.apm.server.url"
- name: ELASTIC_APM_SECRET_TOKEN
value: "my-apm-secret-token"
- name: ELASTIC_APM_LOG_LEVEL
value: "INFO"
- name: ELASTIC_APM_PROFILING_INFERRED_SPANS_ENABLED
value: "true"
- name: ELASTIC_APM_LOG_SENDING
value: "true"
我已包含用于打开 agent 中几个特性的环境,包括
- ELASTIC_APM_LOG_LEVEL 设置为默认值 (INFO),可以轻松切换到 DEBUG
- ELASTIC_APM_PROFILING_INFERRED_SPANS_ENABLED 用于打开与 此博客中描述的特性等效的推断 span 实现
- ELASTIC_APM_LOG_SENDING 开启将日志发送到 APM UI 的功能,日志会自动与事务关联(适用于所有常见的日志框架)
添加注解 ...
metadata:
annotations:
instrumentation.opentelemetry.io/inject-java: "elastic-apm"
... 添加到 Pod 的 YAML 文件中,即可将应用程序进行追踪,并显示在 Elastic APM UI 中,包括推断的子 Span。
(请注意,该 Pod 包含了
使用 OpenTelemetry Java 代理的扩展
为 OpenTelemetry Java 代理设置 Instrumentation 资源非常简单,在这一系列文章的第一部分中已经完成。从上面的示例可以看出,只需要确定要使用的 Docker 镜像 URL 即可。但是,如果要在部署中包含扩展,则会稍微复杂一些,不过 operator 也支持这种方式。基本上,你想和代理一起包含的扩展需要放在 Docker 镜像中,或者你必须构建一个包含镜像中尚未存在的扩展的镜像。然后在 Instrumentation 资源中声明镜像和扩展所在的目录。例如,我将展示一个 Instrumentation,它使用 OpenTelemetry Java 代理 的 2.5.0 版本,以及来自 Elastic OpenTelemetry Java 发行版的推断的 Span 扩展。该发行版镜像在路径
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: otel-plus-extension-instrumentation
namespace: banana
spec:
exporter:
endpoint: https://my.apm.server.url
propagators:
- tracecontext
- baggage
- b3
sampler:
type: parentbased_traceidratio
argument: "1.0"
java:
image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:2.5.0
extensions:
- image: "docker.elastic.co/observability/elastic-otel-javaagent:1.1.0"
dir: "/extensions"
env:
- name: OTEL_EXPORTER_OTLP_HEADERS
value: "Authorization=Bearer my-apm-secret-token"
- name: ELASTIC_OTEL_INFERRED_SPANS_ENABLED
value: "true"
请注意,您可以拥有多个
下一步
这里,我展示了如何将任何代理与 Kubernetes 的 OpenTelemetry Operator 一起使用,并针对你的系统进行配置。特别是,这些示例展示了如何使用 Elastic Java 代理自动检测在 Kubernetes 集群中运行的 Java 应用程序,以及如何使用 Instrumentation 资源启用功能。你可以针对部署设置零配置,或者只使用一个注解,这通常是一种更灵活的机制(你可以拥有多个 Instrumentation 资源定义,并且部署可以选择适用于其应用程序的定义)。
本文中描述的任何特性或功能的发布和时间安排均由 Elastic 自行决定。任何当前不可用的特性或功能可能无法按时交付,或者根本不会交付。