首页 Java java教程 基本的 Java 可观察性工具:提高应用程序性能

基本的 Java 可观察性工具:提高应用程序性能

Jan 04, 2025 pm 06:42 PM

ssential Java Observability Tools: Boost Application Performance

作为畅销书作家,我邀请您在亚马逊上探索我的书。不要忘记在 Medium 上关注我并表示您的支持。谢谢你!您的支持意味着全世界!

作为一名拥有多年经验的 Java 开发人员,我逐渐认识到应用程序可观察性的重要性。这不仅仅是在问题出现时解决问题;这是关于始终清楚地了解应用程序的行为、性能和运行状况。在本文中,我将分享我对五个强大工具的见解,这些工具显着增强了我监控和优化 Java 应用程序的能力。

千分尺:您的度量瑞士军刀

Micrometer 已成为我测量应用程序指标的首选工具。其供应商中立的方法意味着我可以在不同的监控系统之间切换,而无需更改我的代码。无论我使用 Prometheus、Graphite 还是 InfluxDB,Micrometer 都能满足我的需求。

我最喜欢 Micrometer 的是它的维度指标模型。它允许我向指标添加标签,从而在分析数据时提供非常宝贵的上下文。这是我如何使用 Micrometer 来计数事件的简单示例:

Counter counter = Metrics.counter("api.requests", "endpoint", "/users");
counter.increment();
登录后复制
登录后复制

此代码为 API 请求创建一个计数器,并带有指定端点的标签。我可以轻松添加更多标签来提供额外的上下文,例如 HTTP 方法或用户类型。

Micrometer 还支持其他指标类型,例如仪表、计时器和分布摘要。我经常使用计时器来跟踪方法执行时间:

Timer timer = Metrics.timer("method.execution", "class", "UserService", "method", "createUser");
timer.record(() -> userService.createUser(user));
登录后复制
登录后复制

记录了createUser方法的执行时间,并用类和方法名称进行标记,以便于识别。

Spring Boot 执行器:生产就绪监控

对于我的 Spring Boot 应用程序来说,Spring Boot Actuator 是不可或缺的。它提供了丰富的生产就绪功能,我可以通过最少的配置来启用这些功能。

我最喜欢的执行器端点之一是健康端点。它让我可以快速了解应用程序的运行状况:

@Component
public class DatabaseHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        if (isDatabaseHealthy()) {
            return Health.up().withDetail("database", "Operational").build();
        }
        return Health.down().withDetail("database", "Not responding").build();
    }
}
登录后复制
登录后复制

此自定义运行状况指示器检查数据库状态并通过 /actuator/health 端点报告。

执行器的指标端点是另一个宝石。它公开了广泛的指标,从 JVM 统计数据到自定义业务指标。我经常将它与千分尺结合使用:

@RestController
public class UserController {
    private final Counter userCreationCounter;

    public UserController(MeterRegistry registry) {
        this.userCreationCounter = registry.counter("users.created");
    }

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // User creation logic
        userCreationCounter.increment();
        return user;
    }
}
登录后复制
登录后复制

每次创建用户时,此代码都会增加一个计数器,然后我可以通过 /actuator/metrics 端点进行监控。

OpenTelemetry:可观测性的未来

OpenTelemetry 彻底改变了我在应用程序中实现可观察性的方式。其用于跟踪、指标和日志记录的统一 API 意味着我可以跨不同服务和语言标准化我的可观察性堆栈。

以下是我在 Java 应用程序中设置 OpenTelemetry 的典型方法:

Counter counter = Metrics.counter("api.requests", "endpoint", "/users");
counter.increment();
登录后复制
登录后复制

此设置创建了一个跟踪器和一个跨度,我可以用它们来跟踪一段代码的执行。 OpenTelemetry 的美妙之处在于它可以与各种后端系统无缝协作,因此我可以将此数据发送到 Jaeger、Zipkin 或任何其他兼容系统。

Elastic APM:深入洞察应用程序性能

Elastic APM 在理解 Java 应用程序的性能特征方面改变了我的游戏规则。它提供方法级分析和详细事务跟踪的能力帮助我识别并解决了无数性能问题。

将 Elastic APM 集成到 Spring Boot 应用程序中非常简单:

Timer timer = Metrics.timer("method.execution", "class", "UserService", "method", "createUser");
timer.record(() -> userService.createUser(user));
登录后复制
登录后复制

此代码为每个用户检索请求创建一个事务,使我能够跟踪其在 Elastic APM 中的性能。

我特别欣赏的 Elastic APM 的一个功能是它的 JDBC 查询自动检测。它帮助我识别缓慢的数据库查询,而无需我进行任何额外的编码。

Jaeger:微服务的分布式跟踪

在我的微服务架构工作中,Jaeger 的价值无可估量。它的分布式跟踪功能使我能够理解跨多个服务的复杂请求流。

以下是我通常如何在 Spring Boot 应用程序中设置 Jaeger:

@Component
public class DatabaseHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        if (isDatabaseHealthy()) {
            return Health.up().withDetail("database", "Operational").build();
        }
        return Health.down().withDetail("database", "Not responding").build();
    }
}
登录后复制
登录后复制

此设置为 getUser 方法创建了一个跨度,然后我可以在 Jaeger 的 UI 中对其进行可视化。当此方法调用其他服务时,Jaeger 会自动链接跨度,让我完整了解请求流程。

Jaeger 向我显示请求每个部分的时间安排的能力对于识别分布式系统中的性能瓶颈至关重要。

将它们放在一起

根据我的经验,最有效的可观察性策略结合了多种工具。我经常使用 Micrometer 来获取基本指标,使用 Spring Boot Actuator 来进行健康检查和操作信息,使用 OpenTelemetry 来实现跨服务的标准化可观测性,使用 Elastic APM 来获取深入的性能洞察,使用 Jaeger 来进行分布式跟踪。

以下是我如何在 Spring Boot 应用程序中组合这些工具的示例:

@RestController
public class UserController {
    private final Counter userCreationCounter;

    public UserController(MeterRegistry registry) {
        this.userCreationCounter = registry.counter("users.created");
    }

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // User creation logic
        userCreationCounter.increment();
        return user;
    }
}
登录后复制
登录后复制

在此设置中,我使用:

  • Spring Boot Actuator(Spring Boot 中默认启用)
  • 用于方法计时的千分尺(通过 @Timed 注释)
  • Jaeger 用于分布式跟踪(在控制器中)
  • 用于详细性能跟踪的弹性 APM(在服务中)

这种组合让我可以全面了解应用程序的行为和性能。

结论

可观察性在现代 Java 开发中并不是一种奢侈;这是必要的。我在这里讨论的工具 - Micrometer、Spring Boot Actuator、OpenTelemetry、Elastic APM 和 Jaeger - 已成为我的开发工具包不可或缺的一部分。

每种工具都有自己的优势。 Micrometer 提供灵活的指标收集,Spring Boot Actuator 提供生产就绪的功能,OpenTelemetry 标准化跨服务的可观察性,Elastic APM 提供深入的性能洞察,Jaeger 擅长分布式跟踪。

通过有效地利用这些工具,我已经能够构建更健壮、高性能和可维护的 Java 应用程序。我可以快速识别问题,了解复杂的系统行为,并做出有关优化和改进的数据驱动决策。

请记住,可观察性的目标不仅仅是收集数据,而是获得可操作的见解。当您在自己的项目中实现这些工具时,请重点关注与应用程序性能和业务目标最相关的指标和跟踪。

可观察性领域在不断发展,新的工具和技术不断出现。保持好奇心,不断学习,并毫不犹豫地尝试不同的方法。未来的您(和您的运营团队)将感谢您在应用程序中构建的见解。


101 本书

101 Books是一家人工智能驱动的出版公司,由作家Aarav Joshi共同创立。通过利用先进的人工智能技术,我们将出版成本保持在极低的水平——一些书籍的价格低至 4 美元——让每个人都能获得高质量的知识。

查看我们的书Golang Clean Code,亚马逊上有售。

请继续关注更新和令人兴奋的消息。购买书籍时,搜索 Aarav Joshi 以查找更多我们的书籍。使用提供的链接即可享受特别折扣

我们的创作

一定要看看我们的创作:

投资者中心 | 投资者中央西班牙语 | 投资者中德意志 | 智能生活 | 时代与回响 | 令人费解的谜团 | 印度教 | 精英开发 | JS学校


我们在媒体上

科技考拉洞察 | 时代与回响世界 | 投资者中央媒体 | 令人费解的谜团 | 科学与时代媒介 | 现代印度教

以上是基本的 Java 可观察性工具:提高应用程序性能的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1419
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

如何将姓名转换为数字以实现排序并保持群组中的一致性? 如何将姓名转换为数字以实现排序并保持群组中的一致性? Apr 19, 2025 pm 11:30 PM

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

如何使用MapStruct简化系统对接中的字段映射问题? 如何使用MapStruct简化系统对接中的字段映射问题? Apr 19, 2025 pm 06:21 PM

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象如何安全地转换为数组? Java对象如何安全地转换为数组? Apr 19, 2025 pm 11:33 PM

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

如何优雅地获取实体类变量名构建数据库查询条件? 如何优雅地获取实体类变量名构建数据库查询条件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

如何利用Redis缓存方案高效实现产品排行榜列表的需求? 如何利用Redis缓存方案高效实现产品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? 电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? Apr 19, 2025 pm 11:27 PM

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

See all articles