当前位置:   article > 正文

springboot项目集成Elastic Apm Server Agent_elasticsearch apm server

elasticsearch apm server

一、系统基本架构

业务应用集成ES APM SDK -> 数据采集至ES APM SERVER -> 再将数据同步至ES服务器 -> 在ES服务中可以对数据进行可视化监控
本文仅展示APM Server与ES APM SDK集成,ElasticSearch和Kibana未做展示
在这里插入图片描述

二、集成ES APM SDK可以实现主要功能:

  • 事务性能指标:
    a.事务响应时间:每个事务从开始到结束所花费的时间,包括处理请求和返回响应的整个过程。
    b.事务数量:应用程序处理的总事务数,用于评估应用程序的负载和吞吐量。
  • HTTP 请求指标:
    a.HTTP 请求方法和路径:记录每个 HTTP 请求的方法(GET、POST 等)和路径(URL)。
    b.HTTP 请求响应时间:每个 HTTP 请求的处理时间,包括网络传输和服务器处理时间。
  • 数据库查询指标:
    a.数据库查询响应时间:记录每个数据库查询的执行时间和响应时间。
    b.数据库访问次数:统计应用程序对数据库的访问次数和频率。
  • 错误和异常指标:
    a.错误数量和类型:记录应用程序发生的各种错误类型(如 Java 异常)和异常数量。
    b.错误堆栈信息:捕获错误时的堆栈跟踪信息,用于定位和解决问题。
  • 系统资源利用指标:
    a.CPU 使用率:监控应用程序的 CPU 使用率,用于评估系统的负载情况。
    b.内存使用情况:记录应用程序的内存消耗和内存泄漏情况。
    c.线程池和连接池利用率:监控线程池和数据库连接池的利用率和性能。
  • 自定义指标:
    a.自定义事务和指标:开发人员可以通过 API 自定义记录业务相关的事务和性能指标,以满足特定的监控需求。
  • 分布式跟踪指标:
    a.分布式事务追踪:对于分布式系统和微服务架构,Elastic APM 可以跟踪分布式事务的执行流程和性能指标,包括跨服务调用的耗时和传输信息。

三、集成ES APM SDK基本流程

  • 集成 Elastic APM Java Agent:
    a.在 Java 应用程序中集成 Elastic APM Java Agent,用于监控应用程序性能和错误。
    b.配置 Java 启动参数,将 Java Agent 引入应用程序。
  • 连接到 Elasticsearch APM Server:
    a.部署并配置 Elasticsearch APM Server,用于接收和存储监控数据。
    b.配置 Java 应用程序连接信息,使其能够发送数据到 Elasticsearch APM Server。
  • 监控数据存储和索引配置:
    a.在 Elasticsearch 中配置存储 APM 监控数据的索引和数据保留策略。
  • 设置报警系统:
    a.使用 Elasticsearch Watcher 或其他监控工具,设置报警规则,实现对监控数据的实时监测和报警通知。

四、Elastic APM Server 安装部署

本次仅介绍windows版本安装部署
重要!!! 版本需要与ElasticSearch保持一致,如ES版本为 v 7.17.10,APM Server也需要 7.17.10(否则索引文件会出现部分字段映射失败)

步骤1:下载安装包**

  • 访问 Elastic APM 官方网站:https://www.elastic.co/downloads/apm
  • 下载适用于 Windows 的 APM Server 安装程序。

步骤2:配置 APM Server:

	- 解压缩下载的 APM Server 文件到一个目录中。如: D:\apm-server
	- 编辑 apm-server.yml 配置文件,配置 Elasticsearch 和 Kibana 的连接信息:
	######################### APM Server Configuration #########################
	################################ APM Server ################################
	apm-server:
	  host: "localhost:8200"  # APM Server 监听的地址和端口
	  rum:
	    enabled: true          # 是否启用 Real User Monitoring (RUM)
	  ilm:
	    enabled: false         # 关闭索引生命周期管理 (ILM),可根据需要调整
	  kibana:
	    enabled: true
	    host: "XXXXXX:5601"
	    username: "elastic"
	    password: "123456"
	
	output.elasticsearch:
	  hosts: ["XXXXXX:9200"]  # Elasticsearch 服务地址
	  username: "elastic"           # Elasticsearch 认证用户名
	  password: "123456"            # Elasticsearch 认证密码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

步骤3:启动 APM Server:

-打开命令提示符或 PowerShell,进入 APM Server 的目录。
-依次执行以下命令启动 APM Server

安装:APM Server
.\install-service.ps1

查看安装情况
Get-Service -Name "apm-server"

启动服务
Start-Service -Name "apm-server"

停止服务
Stop-Service -Name "apm-server"

#卸载服务
.\uninstall-service-apm-server.ps1

#强制卸载
sc delete "apm-server"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

步骤4:查看

访问 http://youhost:8200,访问出现如下,则说明安装成功
  • 1

五、集成ES APM SDK 详细流程

1、Code服务中集成 Elastic APM Java Agent

步骤 1:Maven依赖在项目的pom文件中添加Elastic APM Java Agent依赖:
  <dependency>
    <groupId>co.elastic.apm</groupId>
    <artifactId>apm-agent-attach</artifactId>
    <version>1.33.0</version>
  </dependency>
  <dependency>
      <groupId>co.elastic.apm</groupId>
      <artifactId>apm-agent-api</artifactId>
      <version>1.33.0</version>
  </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
步骤 2:配置 Elastic APM,本方法需要增加配置文件 elasticapm.properties
# APM Server 相关配置,
service_name=dts-wx-api
# 配置对应APM Server 服务地址
server_urls=http://localhost:8200
# 应用程序相关配置
environment=test
application_packages=com.qiguliuxing
# 日志级别配置
log_level=INFO
# 事务采样率
transaction_sample_rate=0.5
# 忽略的 URL 配置
ignore_urls=/health,/status
# 错误捕获配置
capture_body=errors
# 跨度记录最小持续时间配置
span_frames_min_duration=5m
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
步骤3:配置文件集成环境变量

若不想建property文件,想在yml文件中配置,需要手动读yml文件,加入环境变量

@Autowired
private ElasticApmProperties elasticApmProperties;
 
@PostConstruct
public void apmServerConfig() {
    // 获取 Elastic APM Java Agent 配置信息
    System.setProperty("elastic.apm.service_name", elasticApmProperties.getServiceName());
    System.setProperty("elastic.apm.server_urls", elasticApmProperties.getServerUrls());
    System.setProperty("elastic.apm.environment", elasticApmProperties.getEnvironment());
    System.setProperty("elastic.apm.application_packages", elasticApmProperties.getApplicationPackages());
    System.setProperty("elastic.apm.log_level", elasticApmProperties.getLogLevel());
    System.setProperty("elastic.apm.transaction_sample_rate", elasticApmProperties.getTransactionSampleRate());
    System.setProperty("elastic.apm.ignore_urls", elasticApmProperties.getIgnoreUrls());
    System.setProperty("elastic.apm.capture_body", elasticApmProperties.getCaptureBody());
    System.setProperty("elastic.apm.span_frames_min_duration", elasticApmProperties.getSpanFramesMinDuration());
    // 初始化 Elastic APM Java Agent
    ElasticApmAttacher.attach();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
步骤4:初始化 Elastic APM Agent,例如
public class Application {
    public static void main(String[] args) {
       ElasticApmAttacher.attach();
       SpringApplication.run(Application.class, args);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、直接启动集成 Elastic APM Java Agent ,可以做验证

步骤1:直接下载 APM 代理

从 Maven Central 下载代理 jar。切勿将该代理添加为您的应用程序的依赖项。

步骤2:使用 javaagent 标志直接启动您的应用程序(可执行Jar包)

添加 -javaagent 标志并使用系统属性配置代理。

  • 设置所需的服务名称(允许使用的字符:a-z、A-Z、0-9、-、_ 和空格)
  • 设置定制 APM Server URL(默认值:http://localhost:8200)对应APM server地址
  • 设置 APM Server 机密令牌
  • 设置服务环境
  • 设置您的应用程序的基础软件包
    java -javaagent:/path/to/elastic-apm-agent-.jar
    -Delastic.apm.service_name=my-application
    -Delastic.apm.server_urls=http://localhost:8200
    -Delastic.apm.secret_token=
    -Delastic.apm.environment=production
    -Delastic.apm.application_packages=org.example
    -jar my-application.jar

3、集成完毕,启动查看服务控制台展示,与Kibana APM集成

控制台展示:

在这里插入图片描述

Kibana 展示:

在这里插入图片描述

在这里插入图片描述

默认动态采集指标,除了可以采集Transaction、span 得运行时间信息外,还可以看到具体执行得SQL语句,出现报错得具体报错信息

六、自定义监控+告警

1、transaction 与 span介绍

在 Elastic APM 中,Transaction 和 Span 是两个重要的概念,用于表示应用程序中的不同层级和时间跨度的工作单元或事件。理解这两个概念对于分析和监控应用程序的性能非常重要。

  • Transaction:Transaction 是 Elastic APM 中的顶层概念,用于表示应用程序中的一个整体工作单元或事件,例如,一个 HTTP 请求、一个后台任务等。其中一些属性表重要:
    名称(name):指代Transaction名称,
    Type(类型):表示 Transaction 的类型,例如 HTTP、Database、Job 等。
    Timestamp(时间戳): 表示 Transaction 开始的时间戳。
    Duration(持续时间): 表示 Transaction 的持续时间
    Tags(标签): 可以添加自定义标签,用于描述或分类 Transaction。
    例如:绿色部分就是Transaction执行得整体,可以得到 Transaction名称, 持续时间等信息

在代码中,可以通过APM API 创建和管理 Transaction,可以定义在Http请求、后台任务、事件监听等多个场景,

1、API请求添加 Transaction 监控
import co.elastic.apm.api.ElasticApm;
import co.elastic.apm.api.Transaction;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class HelloController {
   @GetMapping("/hello")
   public String sayHello() {
       // 开始一个新的事务
       Transaction transaction = ElasticApm.startTransaction();
       try {
           // 设置事务名称
           transaction.setName("HelloController.sayHello");
           // 执行业务逻辑
           String message = "Hello, Elastic APM!";
           return message;
       } catch (Exception e) {
           // 捕获异常并记录到事务中
           transaction.captureException(e);
           throw e;
       } finally {
           // 结束事务
           transaction.end();
       }
   }
}
2、后台定时任务添加 Transaction 监控
import co.elastic.apm.api.ElasticApm;
import co.elastic.apm.api.Transaction;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;


@Component
public class ScheduledTask {


   @Scheduled(fixedRate = 60000) // 每分钟执行一次
   public void performTask() {
       // 开始一个新的事务
       Transaction transaction = ElasticApm.startTransaction();
       try {
           // 设置事务名称
           transaction.setName("ScheduledTask.performTask");
           // 执行定时任务的业务逻辑
           System.out.println("Performing scheduled task...");
           // 模拟任务执行时间
           Thread.sleep(500); // 模拟任务执行时间为500毫秒
           System.out.println("Scheduled task completed.");
       } catch (Exception e) {
           // 捕获异常并记录到事务中
           transaction.captureException(e);
           throw e;
       } finally {
           // 结束事务
           transaction.end();
       }
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • Span:Span 是 Transaction 的子事件,用于表示 Transaction 内部的工作单元或时间片段。例如,一个 Transaction 可能包含多个 Span,表示不同的方法调用、数据库查询、网络请求等。Span 可以形成层级关系,用于表示调用链的结构。

Name(名称): 表示 Span 的名称,通常用于描述 Span 的功能或作用。
Type(类型): 表示 Span 的类型,例如 HTTP、DB、External 等。
Timestamp(时间戳): 表示 Span 开始的时间戳。
Duration(持续时间): 表示 Span 的持续时间,即开始到结束的时间间隔。
Tags(标签): 可以添加自定义标签,用于描述或分类 Span。

在代码中,一般作为Transaction得子事件,卸载Transaction标识得方法体内部,用来监控更细颗粒得代码执行情况

import co.elastic.apm.api.ElasticApm;
import co.elastic.apm.api.Span;


public class MyService {


    public void performSpan() {
        Span span = ElasticApm.currentTransaction().startSpan();
        span.setName("MyService.performSpan");
        try {
            // 执行 Span 的业务逻辑...
            span.setTag("status", "success");
        } catch (Exception e) {
            // 发生异常时标记 Span 为失败
            span.setTag("status", "error");
            throw e;
        } finally {
            span.end(); // 结束 Span
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2、Kibana 监控信息展示

在这里插入图片描述

在以上 ES 界面的示例中,每个图表/数字称作 Visualize,他们共同组成了一个仪表盘(Dashboard)

仪表盘,可以设置查看的时间和自动更新间隔。在编辑模式,可以配置包含的内容和编排它们的位置。

创建可视化(Visualize)很简单:
在仪表板编辑页面,点击“创建可视化”

然后,左边选择包含 apm-* 的的索引(这是APM信息存储的位置),然后选择图形类型,需要的指标,就可以了。为例:

  • 选择垂直堆积条形图
  • 筛选是定位记录的范围,这里添加了了条件:
  • service.environment: prod (就是我们在配置中的 ENVIRONMENT 值)
  • service.name: analysis (对应 SERVICE_NAME 配置)
  • transaction.name: request (对应调用 begin_transaction() 时传入的参数)
  • 水平轴选择 @timestamp 字段;
  • 垂直轴选择 记录计数 ;
  • 细分方式,这里选择了 labels.url ,就是我们之前标记的请求url。

这样就创建了一个仪表盘,生产环境,所有 API 请求的,按照URL分类的计数可视化图表。
针对具体的业务系统,创建好这些可视化图表,然后安排到一个仪表板,就可以一眼查看系统状态了。
在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号