Observability:OpenTelemetry 在 Elastic APM 中的集成

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Observability:OpenTelemetry 在 Elastic APM 中的集成相关的知识,希望对你有一定的参考价值。

OpenTelemetry 是一组 API、SDK、工具和集成,支持从你的服务中捕获和管理遥测数据,以提高可观察性。 有关 OpenTelemetry 项目的更多信息,请参阅规范

Elastic OpenTelemetry 集成允许你重用现有的 OpenTelemetry 工具来快速分析分布式跟踪和指标,以帮助你使用 Elastic Stack 监控业务 KPI 和技术组件。

在我们之前的文章 “Observability:如何为 Java 应用进行 APM” 里,我们介绍了如何使用 Elastic 自己的方案对 Java 应用进行性能分析。在今天的教程中,我们将使用同样的例子使用 OpenTelemetry 来对 Java 应用进行 APM。相比较之前的方法,使用 OpenTelemetry 可以使得我们使用开发的标准对应用进行监控。它特别适合于一些应用既可以使用 Elastic 所提供的方案,也可以使用其它方案对应用进行监控。

在今天的练习中,我将使用 Elastic Stack 7.15.1 来进行练习。

APM Server 原生支持 OpenTelemetry 协议

重要Elastic 的 OpenTelemetry Collector 导出器在 7.13 中被弃用,取而代之的是 Elastic Observability (OTLP) 中对 OpenTelemetry Line Protocol 的原生支持。 要了解详情,请参阅迁移

Elastic APM Server 本身支持 OpenTelemetry 协议。 这意味着从你的应用程序和基础设施收集的跟踪数据和指标可以使用 OpenTelemetry 协议直接发送到 Elastic APM 服务器。

插桩应用(intrument applications)

要将跟踪和指标导出到 APM 服务器,请确保你已使用 OpenTelemetry API、SDK 或两者对您的服务和应用程序进行了检测。 例如,如果您是 Java 开发人员,则需要使用 OpenTelemetry 代理为 Java 检测您的 Java 应用程序。

通过定义以下环境变量,你可以配置 OTLP 端点,以便 OpenTelemetry 代理与 APM 服务器通信。

export OTEL_RESOURCE_ATTRIBUTES=service.name=checkoutService,service.version=1.1,deployment.environment=production
export OTEL_EXPORTER_OTLP_ENDPOINT=https://apm_server_url:8200
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer an_apm_secret_token"
java -javaagent:/path/to/opentelemetry-javaagent-all.jar \\
     -classpath lib/*:classes/ \\
     com.mycompany.checkout.CheckoutServiceServer
OTEL_RESOURCE_ATTRIBUTES用于标识你的应用程序的服务名称。
OTEL_EXPORTER_OTLP_ENDPOINTAPM 服务器 URL。 APM 服务器侦听事件的主机和端口。
OTEL_EXPORTER_OTLP_HEADERS

包含 Elastic APM Secret 令牌或 API 密钥的授权标头:“Authorization=Bearer an_apm_secret_token” 或 “Authorization=ApiKey an_api_key”。

有关如何格式化 API 密钥的信息,请参阅我们的 API 密钥文档。

请注意 Bearer 和 an_apm_secret_token 之间以及 APIKey 和 an_api_key 之间所需的空格。

OTEL_EXPORTER_OTLP_CERTIFICATEgRPC 客户端的 TLS 凭据证书。 (可选的)

你现在可以在 Kibana 中验证指标和可视化指标之前收集跟踪和指标。

动手实践

我们参照之前的文章 “Observability:如何为 Java 应用进行 APM” 启动 Elastic Stack。这其中包括 Elasticsearch,Kibana 及 APM Server。请注意:我们可以在 .env 来选择 Elastic Stack 的版本。我们选择一个在 7.13 以后的版本。我们将使用相同的例子来进行演练。

首先,我们使用如下的命令来启动 Elastic Stack:

docker-compose up

按照上面的要求,我们下载 https://github.com/open-telemetry/opentelemetry-java-instrumentation OpenTelemetry Java 代理。最新的代理位于地址。我们下载这个文件并置于 Java 应用的根目录中。

$ pwd
/Users/liuxg/java/opbeans-java/opbeans
$ ls
mvnw                        run.sh
mvnw.cmd                    src
opentelemetry-javaagent.jar target
pom.xml

在 Java 应用的根目录中,我们使用如下的命令来编译:

mvn package

在编译该应用时,请选择 Java 8 来进行编译。

我们接下来创建一个叫做 run.sh 的脚本:

run.sh

export OTEL_RESOURCE_ATTRIBUTES=service.name=opbeans-java,service.version=1.0,deployment.environment=production
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:8200
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer an_apm_secret_token"
java -javaagent:./opentelemetry-javaagent.jar \\
     -jar ./target/opbeans-0.0.1-SNAPSHOT.jar

因为我们的 APM 没有配置 secret token,所以针对上面的 OTEL_EXPORTER_OTLP_HEADERS 项的配置,我们可以不做任何的设置。请注意在上面我们定义的 opbeans-java 服务名称。我们使用如下的命令来让 run.sh 变为可执行:

chmod a+x run.sh
$ pwd
/Users/liuxg/java/opbeans-java/opbeans
$ ls
mvnw                        run.sh
mvnw.cmd                    src
opentelemetry-javaagent.jar target
pom.xml

我们使用如下的命令来进行运行:

./run.sh

 我们可以在浏览器中打开地址:

 从上面,我们可以看出来 Java 应用已经成功地运行起来了。我们可以在界面上做任意一些操作。

我们接着打开 Kibana 中的 APM 应用:

在上面,我们可以看到 opbeans-java 服务。这个也是在我们上面的 run.sh 中定义的。点击 opbeans-java 链接:

我们可以看到在 Transaction 下列出的不同的 transactions。其中对我们影响最大的一个就是排在第一位置的 /api/orders。点击该链接:

从上面的图中,我们可以看出来和在我之前文章 “Observability:如何为 Java 应用进行 APM” 中介绍的几乎一模一样的效果。我们接下来可以采取和之前文章介绍的一模一样的方式对 Java 应用进行性能分析。在这里,我就不再累述了。

参考:

【1】OpenTelemetry integration | APM Overview [7.15] | Elastic

以上是关于Observability:OpenTelemetry 在 Elastic APM 中的集成的主要内容,如果未能解决你的问题,请参考以下文章

Observability:在 Elastic Observability 部署中添加免费和开放的 Elastic APM

ckad练习题-observability

Observability:运用 Fleet 来轻松地导入 Nginx 日志

Observability:运用 Fleet 来轻松地导入 Nginx 日志及指标

Observability:集群监控 - Elastic Stack 8.x

Observability:设置 Elastic APM Java 代理 - 自动设置