Jack Shirazi

如何使用 Java Agent 插件在不更改应用程序代码的情况下捕获自定义指标

当您监控的应用程序没有发出您想要的自定义指标,并且您无法直接更改应用程序代码时,您可以使用 Java Agent 插件自动检测应用程序并发出您想要的自定义指标。

4 分钟阅读
How to capture custom metrics without app code changes using the Java Agent Plugin

Elastic APM Java Agent 自动跟踪许多指标,包括通过 MicrometerOpenTelemetry Metrics API 生成的指标。因此,如果您的应用程序(或它包含的库)已经通过其中一个 API 公开了指标,那么只需安装 Elastic APM Java Agent 即可捕获它们。您将能够可视化和配置阈值、警报和异常检测 — 以及您想要使用它们的任何其他内容!

下一个最简单的选项是直接从您的代码生成自定义指标(例如,通过将使用 OpenTelemetry Metrics API 的代码直接添加到应用程序中)。这种方法的主要缺点是它需要修改应用程序,因此如果您不能或不想这样做,您可以通过使用插件向 Elastic APM Java Agent 添加检测,轻松生成所需的自定义指标。

本文讨论的情况是,您监控的应用程序没有发出您想要的自定义指标,并且您无法直接更改代码或配置来实现这一点。相反,您可以使用插件通过 Elastic APM Java Agent 自动检测应用程序,然后使应用程序发出您想要的自定义指标。

插件基础知识

Elastic APM Java Agent 的基础知识以及如何轻松插入检测,在文章“使用 Java Agent 插件创建您自己的检测”中有详细介绍。从插件生成指标只是另一种类型的检测,所引用的文章提供了详细的分步说明,以及如何使用自定义检测创建插件的示例。

对于本文,我假设您了解如何基于之前文章的内容以及我们的 插件示例存储库中的示例应用程序(一个简单的 Web 服务器 ExampleBasicHttpServer)创建具有自定义检测的插件。

自定义指标

对于我们的示例应用程序,它是一个 HTTP 服务器 (ExampleBasicHttpServer),我们想添加一个自定义指标 'page_views',每次 ExampleBasicHttpServer 应用程序处理任何请求时,该指标都会递增。这意味着我们添加的检测将由“使用 Java Agent 插件创建您自己的检测”中使用的相同 ExampleBasicHttpServer.handleRequest() 方法触发。

使用插件/OpenTelemetry API

本质上,与那篇文章的唯一区别在于,对于指标,我们将使用 OpenTelemetry指标API,而不是 OpenTelemetry跟踪API

特别是对于指标,handleRequest() 方法的 advice 方法是以下代码

if (pageViewCounter == null) {
    pageViewCounter = GlobalOpenTelemetry
        .getMeter("ExampleHttpServer")
        .counterBuilder("page_views")
        .setDescription("Page view count")
        .build();
}
pageViewCounter.add(1);

也就是说,在首次需要时延迟创建 meter,然后在每次调用 ExampleBasicHttpServer.handleRequest() 方法时,递增页面浏览量计数器。

其他所有内容(设置检测、查找要检测的方法、构建插件)都与文章“

使用 Java Agent 插件创建您自己的检测”相同。完整的指标示例在 插件示例存储库中实现,而实际的完整指标检测实现是 ExampleMetricsInstrumentation

尝试一下!

就是这样!要使用插件运行代理,只需构建并包含 jar,如“使用 Java Agent 插件创建您自己的检测”中所述,在 plugins_dir 配置选项指定的目录中。 插件示例存储库提供了完整的测试实现 — 只需克隆它并运行 mvn install 即可看到它的工作方式。

开始使用 Elastic APM 的最佳位置是在云中。立即开始您的 Elastic Cloud 免费试用

本文中描述的任何特性或功能的发布和时间安排均由 Elastic 自行决定。任何当前不可用的特性或功能可能不会按时交付,甚至可能根本不交付。

分享这篇文章