Sylvain Juge

使用 OpenTelemetry Java 自动获取云资源属性

捕获云资源属性可以描述应用程序的云部署细节。在本文中,我们将介绍使用 OpenTelemetry 为 Java 应用程序启用这些属性的三种不同方法。

Automatic cloud resource attributes with OpenTelemetry Java

使用 OpenTelemetry,观察到的实体(应用程序、服务、进程等)通过资源属性进行描述。这些属性的定义和值在语义约定中定义。
在实践中,对于在 Google Cloud Platform (GCP)、Amazon Web Services (AWS) 或 Azure 等云环境中运行的典型 Java 应用程序而言,这意味着除了每个提供商的属性之外,还需要捕获云提供商的名称、云服务名称或可用区。这些属性随后用于描述和限定可观测性信号(日志、跟踪、指标),并在云资源属性部分中由语义约定定义。

当使用 OpenTelemetry Java SDKOpenTelemetry 检测代理时,默认情况下不会自动捕获这些属性。在本文中,我们将首先向您展示如何使用 SDK 启用它们,然后使用检测代理,最后我们将向您展示如何使用Elastic OpenTelemetry 发行版使操作更加简单。

OpenTelemetry Java SDK

OpenTelemetry Java SDK 不会捕获任何云资源属性,但是它提供了一个可插拔的服务提供程序接口来注册资源属性提供程序,应用程序开发人员必须提供实现。

GCPAWS 的实现已经包含在 OpenTelemetry Java Contrib 存储库中,因此如果您使用的是这些云提供商之一,那么主要问题是将这些提供程序添加到应用程序依赖项中。由于自动配置,一旦将它们添加到应用程序类路径中,它们应该会自动包含并启用。 SDK 文档提供了在您的应用程序中添加和配置这些内容的全部详细信息。

如果您使用的云提供商没有此类实现,您仍然可以选择提供自己的实现,这是 ResourceProvider SPI(服务提供程序接口)的直接实现。为了保持一致性,您必须依赖现有的云语义约定

例如,以下是名为“potatoes”的虚构云提供商的简单云资源属性提供程序的示例。

package potatoes;

import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.semconv.incubating.CloudIncubatingAttributes;

public class PotatoesResourceProvider implements ResourceProvider {

@Override
public Resource createResource(ConfigProperties configProperties) {
   return Resource.create(Attributes.of(
           CloudIncubatingAttributes.CLOUD_PROVIDER, "potatoes",
           CloudIncubatingAttributes.CLOUD_PLATFORM, "french-fries",
           CloudIncubatingAttributes.CLOUD_REGION, "garden"
           ));
  }
}

OpenTelemetry Java 检测

OpenTelemetry Java 检测提供了一个 Java 代理,它在运行时自动检测应用程序以支持广泛的框架和库(请参阅支持的技术)。

使用检测意味着应用程序字节码和嵌入式库会自动修改,使其行为类似于在其源代码中进行了显式修改以调用 OpenTelemetry SDK 来创建跟踪、跨度和指标。

当使用 OpenTelemetry 检测代理部署应用程序时,GCP 和 AWS 的云资源属性会包含在内,但自 2.2.0 版本起默认情况下未启用。您可以通过设置以下属性通过配置来启用它们

  • 对于 AWS

    otel.resource.providers.aws.enabled=true

  • 对于 GCP

    otel.resource.providers.gcp.enabled=true

Elastic OpenTelemetry Java 发行版

Elastic OpenTelemetry Java 发行版依赖于 OpenTelemetry Java 检测(我们通常将其称为 Vanilla OpenTelemetry),因此它继承了所有功能。

但一个主要区别是,GCP 和 AWS 的资源属性提供程序默认包含并启用,以便在无需额外配置的情况下提供更好的入门体验。

这样做的小代价是,由于必须调用 HTTP(S) 端点,可能会导致应用程序启动稍微变慢。与应用程序启动相比,此开销通常可以忽略不计,但对于某些设置可能会变得很大。

为了减少启动开销,或者当云提供商提前已知时,您可以通过配置有选择地禁用未使用的提供程序实现

  • 对于 AWS

    otel.resource.providers.aws.enabled=false

  • 对于 GCP

    otel.resource.providers.gcp.enabled=false

结论

在这篇博文中,我们介绍了 OpenTelemetry 云资源属性是什么,以及如何使用 OpenTelemetry SDK/API 和检测代理将它们使用和配置到应用程序部署中。

当使用 Elastic OpenTelemetry Java 发行版时,这些资源提供程序会自动提供和启用,以实现轻松简单的入门体验。

opentelemetry-java-contrib 存储库中提供的云资源属性提供程序的另一个非常有趣的方面是,它们由各自的供应商(Google 和 Amazon)维护。对于最终用户来说,这意味着这些实现应该经过了很好的测试,并且能够可靠地应对底层基础架构中的变化。对于像 Elastic 这样的解决方案供应商来说,这意味着我们不必重新实现和逆向工程每个云提供商的基础架构细节,因此证明投资于这些通用组件对于更广泛的 OpenTelemetry 社区来说是净赢。

分享这篇文章