热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微服务应用性能如何?APM监控工具来告诉你

当微服务系统越来越庞大,各个服务间的调用关系也变得越来越复杂,需要一个工具来帮忙理清请求调用的服务链路。之前使用的是Sleuth+Zipkin的解决方案,最近发现应

当微服务系统越来越庞大,各个服务间的调用关系也变得越来越复杂,需要一个工具来帮忙理清请求调用的服务链路。之前使用的是Sleuth+Zipkin的解决方案,最近发现应用性能监控(Application Performance Monitoring,APM)也可以很好地解决该问题。对比SkyWalking和Elastic APM之后,发现Elastic APM更胜一筹,今天我们来一波Elastic APM的使用实践!

Elastic APM 简介

Elastic APM是基于Elastic Stack构建的应用性能监控(APM)系统。它主要有如下用途:

  • 用来实时监控应用性能信息,包括HTTP请求调用时长、数据库查询信息、缓存调用信息和外部的HTTP请求调用信息。有助于我们快速找出并解决性能问题。
  • 自动收集应用中未处理的错误和异常,显示异常的堆栈信息,有助于快速定位异常和了解出现频率。
  • 度量指标是调试生产系统时的另一个重要信息来源。Elastic APM Agent 会自动收集主机级别的度量指标(比如Java JVM和Go Runtime的指标)。
  • 支持分布式请求链路追踪,使你能够在一个视图中分析整个服务架构的性能问题。
相关组件

Elastic APM 包括四大组件: APM Agent, APM Server, Elasticsearch, Kibana。

微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
  • APM Agent:以应用程序库的形式提供,负责收集应用运行时的性能监控数据和错误数据,短时间缓存后发送APM Server。
  • APM Server:一个独立的组件,负责接收APM Agent中发送的性能监控数据。验证并处理完数据后,会转存储到Elasticsearch中,之后就可以在Kibana APM 应用中查看性能监控数据了。
  • Elasticsearch:用于存储应用性能监控数据并提供聚合功能。
  • Kibana APM app:可视化查看APM性能监控数据,有助于找到性能瓶颈。
数据模型

Elastic APM Agent 从其检测的应用程序中捕获不同类型的信息。这些操作被称为事件,可以是Span, Transaction, Error, or Metric。

  • Span(跨度):Span包含一次操作过程中代码执行路径的信息。它从操作的开始到结束进行度量,并且可以与其他Span具有父/子关系。
  • Transaction(事务):Transaction是一种特殊的Span,具有与之关联的其他属性。它描述了Elastic APM Agent捕获的最高级别事件,比如一次请求、一次批处理任务等。
  • Error(错误):Error事件至少包含错误发生的原始异常或创建的日志的信息。
  • Metric(度量):APM Agent 自动获取基本的主机级别指标,包括系统和进程级别的CPU和内存指标。也可以获取特定于代理的指标,例如Java Agent中的JVM指标和Go Agent中的Go运行时指标。
使用实践

学习了上面的基本概念之后,是时候来波实践了,接下来我们将使用Elastic APM来监控SpringBoot应用的性能信息。

安装Elasticsearch和Kibana

安装Elastic APM之前,我们需要先安装好Elasticsearch和Kibana,注意使用7.6.2版本。

安装APM Server
  • 下载APM Server的安装包,下载地址:https://www.elastic.co/cn/downloads/past-releases/apm-server-7-6-2
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你

下载完成后解压到指定目录;

微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
  • 修改配置文件apm-server.yml,修改下Elasticsearch的连接地址即可;
output.elasticsearch:  hosts: ["localhost:9200"]
  • 使用如下命令启动APM Server即可,启动成功APM Server将在8200端口运行;
apm-sever -e
  • 在Kibana中检测APM Server是否启动成功,访问地址:http://localhost:5601/app/kibana#/home/tutorial/apm
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
SpringBoot集成APM Agent

Java应用集成APM Agent的方式有三种,我们使用最简单的方式,直接在应用中集成。

  • 在pom.xml中添加相关依赖;
co.elastic.apmapm-agent-attach1.17.0
  • 在应用启动类的main方法中添加Elastic APM的Attach API;
@SpringBootApplicationpublic class MallTinyApplication {    public static void main(String[] args) {        ElasticApmAttacher.attach();        SpringApplication.run(MallTinyApplication.class, args);    }}
  • 在resource目录下添加Elastic APM的配置文件elasticapm.properties;
# 配置服务名称service_name=mall-tiny-apm# 配置应用所在基础包application_packages=com.macro.mall.tiny# 配置APM Server的访问地址server_urls=http://localhost:8200
  • 在Kibana中检测APM Agent是否启动成功,访问地址:http://localhost:5601/app/kibana#/home/tutorial/apm
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
查看性能监控信息
  • 打开监控面板以后,可以发现我们的mall-tiny-apm服务已经存在了;
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
  • 多次调用应用接口,即可查看到应用性能信息;
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
  • 打开某个Transaction查看详情,我们可以看到连SQL执行耗时信息都给我们统计好了;
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
  • 不仅如此,打开执行查询的Span查看详情,连SQL语句都给我们收集好了;
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
  • 在项目中添加一个有远程调用接口,看看能不能收集到请求调用链路;
/** * 品牌管理Controller * Created by macro on 2019/4/19. */@Api(tags = "PmsBrandController", description = "商品品牌管理")@Controller@RequestMapping("/brand")public class PmsBrandController {        @ApiOperation("远程调用获取所有品牌信息")    @RequestMapping(value = "/remoteListAll", method = RequestMethod.GET)    @ResponseBody    public CommonResult> remoteListAll() {        //模拟耗时操作        ThreadUtil.sleep(1, TimeUnit.SECONDS);        //远程调用获取数据        String respOnse= HttpUtil.get("http://localhost:8088/brand/listAll");        JSONObject jsOnObject= new JSONObject(response);        JSONArray data = jsonObject.getJSONArray("data");        List brandList = data.toList(PmsBrand.class);        return CommonResult.success(brandList);    }}
  • 发现完全可以,Elastic APM完全可以取代Sleuth+Zipkin来做微服务的请求链路跟踪了;
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
  • 使用我们之前springcloud-learning中的微服务调用案例,也是可以进行请求链路跟踪的;
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
  • 再来看下应用主机的度量信息,非常全面,CPU、内存、JVM信息都有了,以后性能调优的时候可以看看!
微服务应用性能如何?APM监控工具来告诉你
微服务应用性能如何?APM监控工具来告诉你
总结

Elastic APM 完全可以取代Sleuth+Zipkin来做分布式请求链路追踪,并且提供了数据库及缓存调用时长的统计,很好很强大!不止于此,它还可以用来实时监控应用性能信息及度量指标,连错误日志也收集好了,是一款很好的应用性能监控工具!


推荐阅读
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • 本文详细介绍了在 Windows 7 系统中配置 Nginx 1.10.3 和 PHP 7.1.1 NTS 的步骤,包括修改 PHP 配置文件、处理依赖项以及创建批处理脚本启动和停止服务。重点解释了如何解决常见的运行时错误。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
author-avatar
清明如月_213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有