乐趣区

关于java:微服务应用性能如何APM监控工具来告诉你

当微服务零碎越来越宏大,各个服务间的调用关系也变得越来越简单,须要一个工具来帮忙理清申请调用的服务链路。之前在《Spring Cloud Sleuth:分布式申请链路跟踪》一文中应用的是 Sleuth+Zipkin 的解决方案,最近发现利用性能监控(Application Performance Monitoring,APM)也能够很好地解决该问题。比照 SkyWalking 和 Elastic APM 之后,发现 Elastic APM 更胜一筹,明天咱们来一波 Elastic APM 的应用实际!

SpringBoot 实战电商我的项目 mall(40k+star)地址:https://github.com/macrozheng/mall

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 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/dow…

  • 下载实现后解压到指定目录;

  • 批改配置文件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

SpringBoot 集成 APM Agent

Java 利用集成 APM Agent 的形式有三种,咱们应用最简略的形式,间接在利用中集成。

  • pom.xml 中增加相干依赖;
<!--Elastic Agent 相干依赖 -->
<dependency>
    <groupId>co.elastic.apm</groupId>
    <artifactId>apm-agent-attach</artifactId>
    <version>1.17.0</version>
</dependency>
  • 在利用启动类的 main 办法中增加 Elastic APM 的 Attach API;
@SpringBootApplication
public 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

查看性能监控信息

  • 关上监控面板当前,能够发现咱们的 mall-tiny-apm 服务曾经存在了;

  • 屡次调用利用接口,即可查看到利用性能信息;

  • 关上某个 Transaction 查看详情,咱们能够看到连 SQL 执行耗时信息都给咱们统计好了;

  • 不仅如此,关上执行查问的 Span 查看详情,连 SQL 语句都给咱们收集好了;

  • 在我的项目中增加一个有近程调用接口,看看能不能收集到申请调用链路;
/**
 * 品牌治理 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<List<PmsBrand>> 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<PmsBrand> brandList = data.toList(PmsBrand.class);
        return CommonResult.success(brandList);
    }
}
  • 发现齐全能够,Elastic APM 齐全能够取代 Sleuth+Zipkin 来做微服务的申请链路跟踪了;

  • 应用咱们之前 springcloud-learning 中的微服务调用案例,也是能够进行申请链路跟踪的;

  • 接下来咱们人为制作一个异样,在办法中增加 int i=1/0; 即可,查看下收集到的异样信息;

  • 再来看下利用主机的度量信息,十分全面,CPU、内存、JVM 信息都有了,当前性能调优的时候能够看看!

总结

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

我的项目源码地址

https://github.com/macrozheng…

参考资料

官网文档:https://www.elastic.co/guide/…

本文 GitHub https://github.com/macrozheng/mall-learning 曾经收录,欢送大家 Star!

退出移动版