1.安装prometheus
可以去官网下载https://prometheus.io/download/,我使用的是prometheus-2.21.0.windows-amd64.tar.gz。下载完后进行解压,执行prometheus.exe,默认端口是9090,本地访问http://127.0.0.1:9090,看到如下页面说明prometheus启动成功。
prometheus.yml是prometheus的配置文件,新增加对一个服务的监控在配置文件中新增相对应的job,重启prometheus.exe,可以看到页面中新增了一个服务监控信息。
详细可以参考https://fuckcloudnative.io/prometheus/
2.安装grafana
下载地址:https://grafana.com/grafana/download?platform=windows
官方文档:https://grafana.com/docs/
我下载的是grafana-7.1.5.windows-amd64.msi,conf目录下的sample.ini是grafana配置文件,默认端口是3000,启动bin文件夹下的grafana-server.exe访问http://127.0.0.1:3000,用户名admin,密码admin
2.1 配置数据源
选择configuration-datasource,在 datasource页面点击add按钮添加数据源,本次添加的Prometheus,然后进行Prometheus的编辑页面,配置Prometheus的url,即第一步中的地址,保存即可。
2.2 填写查询语句,创建图表
+-Dashboard-add new panel ,填写prometheus的查询语句,如查看接口的调用次数输入requests_total{status="success"},可以看到接口调用统计结果。
PS:requests_total{status="success"}这个是根据步骤3中的名字来的
3.SpringBoot 项目
3.1 引入依赖
<!--actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--pometheus 监控-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
<!-- 监控所有接口的请求次数-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.12</version>
</dependency>
3.2 在application.yml中添加配置
server:
port: 8868
servlet:
session:
timeout: 60000
management:
metrics:
export:
prometheus:
enabled: true
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
endpoints:
web:
exposure:
include: prometheus
spring:
application:
name: myuploader
3.3用AOP实现接口次数统计
package com.example.demo.component;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
@Aspect
public class APICounterAop {
@Pointcut("execution(public * com.example.demo.*.*.*(..))")
public void pointCut() {
}
ThreadLocal<Long> startTime = new ThreadLocal<>();
@Autowired
MeterRegistry registry;
private Counter counter;
@PostConstruct
private void init() {
counter = registry.counter("requests_total", "status", "success");
}
@Before("pointCut()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
System.out.println("do before");
counter.increment(); //请求计数
}
@AfterReturning(returning = "returnVal", pointcut = "pointCut()")
public void doAfterReturning(Object returnVal) {
System.out.println("do after");
}
}
3.4 编写一个测试类
package com.example.demo.controller;
import java.util.HashMap;
import java.util.Map;
import com.example.demo.model.Test;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 测试验证
* @author 程就人生
*
*/
@RestController
public class ValidatorTestController {
@RequestMapping("/hello")
public String hello() throws Exception {
return "hello";
}
}
3.5 启动类设置
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName) {
return (registry) -> registry.config().commonTags("application", applicationName);
}
3.6 查看结果
访问http://localhost:8868/actuator/prometheus,查找requests_total,并在postman中调用hello接口,查看调用次数
当然也可以在grafana中查看,查看步骤与方式已在2.2中介绍。
demo地址:https://github.com/anny130688/PrometheusDemo.git