Elastic APM
- Elastic 基于Elasticcc的APM Stack构建的应用性能监控(APM)系统。
- 请求日志:用于实时监控应用程序性能信息,包括HTTP请求呼叫时间、数据库查询信息、缓存呼叫信息和外部HTTP请求呼叫信息。帮助我们快速发现和解决性能问题。
- 日志跟踪:自动收集应用程序中未处理的错误和异常,显示异常堆栈信息,帮助快速定位异常,了解频率。
- JVM测量:测量指标是调试生产系统时的另一个重要信息来源。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(事务):Transtiction是一种具有其他相关属性的特殊Span。它描述了Elastictic APM Agent捕获的最高级别事件,如一次请求、一次批处理任务等
- Error(错误):Error事件至少包含错误发生的原始异常或创建的日志信息
- Metric(度量):APM Agent 自动获取基本的主机级指标,包括系统和流程级CPU和内存指标。也可以获得特定的代理指标,如Java Agent中的JVM指标和Go Agent中的Go运行指标
- Elasticsearch和Kibana安装Elastich 在APM之前,我们需要安装Elasticsearch和Kibanana
- 安装APM Server
- 修改配置文件apm-server.yml,修改Elasticsearch的连接地址;
output.elasticsearch: hosts: ["localhost:9200"]
- 使用以下命令启动APM Server可以启动成功的APMr Server将在8200端口运行;
apm-sever -e
- 在Kibana中检测APM Server成功启动了吗?
- SpringBoot集成APM Agent
<!--Elastic Agent相关依赖--><dependency> <groupId>co.elastic.apm</groupId> <artifactId>apm-agent-attach</artifactId> <version>1.17.0</version></dependency>
- 将Elasticc添加到应用启动类的main方法中 APM的Attach API;
@SpringBootApplicationpublic class MallTinyApplication { public static void main(String[] args) { ElasticApmAttacher.attach(); SpringApplication.run(MallTinyApplication.class, args); }}
- 在resource目录中添加elastice elasticapmAPM配置文件.properties;
# Service配置服务名称name=macro-apm# 基本包aplicationpackages=com.z.tiny# 配置APM Server的访问地址server_urls=http://localhost:8002
- 在Kibana中检测APM Agent成功启动吗?
- 多次调用应用接口即可查看应用性能信息;
- 打开transaction查看详情,我们可以看到,即使是SQL执行的耗时信息也会给我们统计;
- 不仅如此,打开Span查看执行查询的细节,甚至SQL语句也为我们收集;
- 在项目中添加一个远程调用接口,看看是否可以收集到请求调用链路;
@ApiOperation(“远程调用获取所有品牌信息”) @RequestMapping(value = "/remoteListAll", method = RequestMethod.GET) @ResponseBody public CommonResult<List<PmsBrand>> remoteListAll() { ///模拟耗时操作 ThreadUtil.sleep(1, TimeUnit.SECONDS); ////远程调用获取数据 String response = HttpUtil.get("http://localhost:8001/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进行微服务的请求链接跟踪;
- 接下来,我们人工制造异常,并在方法中添加int i=1/0;查看收集到的异常信息;
- 再来看看应用主机的测量信息,非常全面,CPU、内存、JVM信息都有,以后性能调优的时候可以看看!