一、Springboot增加Prometheus

1、Spring Boot 应用暴露监控指标,添加如下依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_spring_boot</artifactId>
<version>0.0.26</version>
</dependency>
gradle配置:
    compile 'org.springframework.boot:spring-boot-starter-actuator'
compile 'io.prometheus:simpleclient_spring_boot:0.0.26'

2、然后,在启动类 Application.java 添加如下注解:

@SpringBootApplication
@EnablePrometheusEndpoint
@EnableSpringBootMetricsCollector
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }

3、配置文件设置

在application.xml里设置属性:spring.metrics.servo.enabled=false,
去掉重复的metrics,不然在prometheus的控制台的targets页签里,会一直显示此endpoint为down状态。
#应用可视化监控
management.security.enabled=false
spring.metrics.servo.enabled=false

4、访问:http://192.168.10.213:6010/prometheus,可以看到 Prometheus 格式的指标数据

二、自定义prometheus注解

2.1、自定义prometheus注解

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PrometheusMetrics {
/**
* 默认为空,程序使用method signature作为Metric name 如果name有设置值,使用name作为Metric name
*
* @return
*/
String name() default "";
}

2.2、自定义prometheus切面

import io.prometheus.client.Counter;
import io.prometheus.client.Histogram;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest; @Aspect
@Component
public class PrometheusMetricsAspect {
private static final Counter requestTotal = Counter.build().name("couter_all").labelNames("api")
.help("total request couter of api").register();
private static final Counter requestError = Counter.build().name("couter_error").labelNames("api")
.help("response Error couter of api").register();
private static final Histogram histogram = Histogram.build().name("histogram_consuming").labelNames("api")
.help("response consuming of api").register(); // 自定义Prometheus注解的全路径
@Pointcut("@annotation(com....annotation.PrometheusMetrics)")
public void pcMethod() {
} @Around(value = "pcMethod() && @annotation(annotation)")
public Object MetricsCollector(ProceedingJoinPoint joinPoint, PrometheusMetrics annotation) throws Throwable {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
PrometheusMetrics prometheusMetrics = methodSignature.getMethod().getAnnotation(PrometheusMetrics.class);
if (prometheusMetrics != null) {
String name;
if (StringUtils.isNotEmpty(prometheusMetrics.name())) {
name = prometheusMetrics.name();
} else {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
name = request.getRequestURI();
}
requestTotal.labels(name).inc();
Histogram.Timer requestTimer = histogram.labels(name).startTimer();
Object object;
try {
object = joinPoint.proceed();
} catch (Exception e) {
requestError.labels(name).inc();
throw e;
} finally {
requestTimer.observeDuration();
}
return object;
} else {
return joinPoint.proceed();
}
}
}

2.3、被监控的方法上添加--自定义prometheus注解

    @PrometheusMetrics
@PostMapping(value = "isBacklist")
@ApiOperation(value = "黑名单判断", notes = "是否在黑名单中,如果存在并且记录状态为2,则为黑名单,返回true,否则返回:false")
@Log
public RespResult<Boolean> isBacklist(@RequestBody BacklistReqDTO reqDTO) {

三、Prometheus 采集 Spring Boot 指标数据

首先,获取 Prometheus 的 Docker 镜像:
docker pull prom/prometheus
 
3.1、然后,编写配置文件 prometheus.yml :
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every seconds. Default is every minute.
evaluation_interval: 15s # Evaluate rules every seconds. The default is every minute.
# scrape_timeout is set to the global default (10s). # Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager: # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus' # metrics_path defaults to '/metrics'
# scheme defaults to 'http'. static_configs:
- targets: ['10.200.110.100:8080'] #此处填写 Spring Boot 应用的 IP + 端口号
3.2、接着,启动 Prometheus :
docker run -d -p : \
-u root \
-v /opt/prometheus/tsdb:/etc/prometheus/tsdb \
-v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
--privileged=true prom/prometheus \
--storage.tsdb.path=/etc/prometheus/tsdb \
--storage.tsdb.retention=7d \
--config.file=/etc/prometheus/prometheus.yml
非docker环境的启动方式:
./prometheus --config.file=prometheus2.yml

结果:

duanxz@ubuntu:~/Downloads/prometheus-2.0.0.linux-amd64$ ./prometheus --config.file=prometheus2.yml
level=info ts=2018-06-19T08:27:47.222527495Z caller=main.go:215 msg="Starting Prometheus" version="(version=2.0.0, branch=HEAD, revision=0a74f98628a0463dddc90528220c94de5032d1a0)"
level=info ts=2018-06-19T08:27:47.222895906Z caller=main.go:216 build_context="(go=go1.9.2, user=root@615b82cb36b6, date=20171108-07:11:59)"
level=info ts=2018-06-19T08:27:47.223110655Z caller=main.go:217 host_details="(Linux 4.4.0-128-generic #154~14.04.1-Ubuntu SMP Fri May 25 14:58:51 UTC 2018 x86_64 ubuntu (none))"
level=info ts=2018-06-19T08:27:47.227443134Z caller=web.go:380 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2018-06-19T08:27:47.234616341Z caller=main.go:314 msg="Starting TSDB"
level=info ts=2018-06-19T08:27:47.244932582Z caller=targetmanager.go:71 component="target manager" msg="Starting target manager..."
level=info ts=2018-06-19T08:27:47.24608357Z caller=main.go:326 msg="TSDB started"
level=info ts=2018-06-19T08:27:47.246514727Z caller=main.go:394 msg="Loading configuration file" filename=prometheus2.yml
level=info ts=2018-06-19T08:27:47.247799187Z caller=main.go:371 msg="Server is ready to receive requests."
最后,访问 http://127.0.0.1:9090/targets , 检查 Spring Boot 采集状态是否正常。

四、Grafana 可视化监控数据

首先,获取 Grafana 的 Docker 镜像:
docker pull grafana/grafana
 
然后,启动 Grafana:
docker run -d -p 3000:3000 \
-v /opt/grafana:/var/lib/grafana \
-e "GF_SMTP_ENABLED=true" \
-e "GF_SMTP_HOST=smtp.139.com:25" \
-e "GF_SMTP_USER=13616052510@139.com" \
-e "GF_SMTP_PASSWORD=like110120" \
-e "GF_SMTP_FROM_ADDRESS=13616052510@139.com" \
--privileged=true grafana/grafana
 
接着,访问 http://localhost:3000/ 配置 Prometheus 数据源:
Grafana 登录账号 admin 密码 admin
 

五、常用Prometheus 表达式

QPS[5分钟]
rate(lz_http_requests_total{job="02_lzmh_microservice_base_service_docker"}[5m]) > 0
QPS[5分钟],根据handler分组
sum(rate(lz_http_requests_total{job="lzmh_microservice_weixin_applet_api"}[5m])) by (handler) > 0
 
平均响应时间[5分钟]
(
rate(lz_http_response_time_milliseconds_sum{job="02_lzmh_microservice_base_service_docker"}[5m]) 
/
rate(lz_http_response_time_milliseconds_count{job="02_lzmh_microservice_base_service_docker"}[5m])
) > 0
平均响应时间[5分钟],根据handler分组
sum(
rate(lz_http_response_time_milliseconds_sum{job="lzmh_microservice_weixin_applet_api"}[5m]) 
/
rate(lz_http_response_time_milliseconds_count{job="lzmh_microservice_weixin_applet_api"}[5m])
) by (handler) > 0

参考:http://www.spring4all.com/article/265

微服务监控之三:Prometheus + Grafana Spring Boot 应用可视化监控的更多相关文章

  1. Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警

    Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警 一.添加依赖 1.1 Actuator 的 /prometheus端点 二.Prometheus 配置 部 ...

  2. 拒绝黑盒应用-Spring Boot 应用可视化监控

    图文简介 逻辑关系 效果演示 快速开始 1.Spring Boot 应用暴露监控指标[版本 1.5.7.RELEASE] 首先,添加依赖如下依赖: <dependency> <gro ...

  3. 【微框架】之一:从零开始,轻松搞定SpringCloud微服务系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  4. 谁才是微服务赢家:Quarkus 与 Spring Boot

    在容器时代("Docker 时代")Java 仍然处于领先地位,但哪个更好?Spring Boot 还是 Quarkus? 谁会最先进的?Spring Boot 或 Quarkus ...

  5. Spring Boot 2.x监控数据可视化(Actuator + Prometheus + Grafana手把手)

    TIPS 本文基于Spring Boot 2.1.4,理论支持Spring Boot 2.x所有版本 众所周知,Spring Boot有个子项目Spring Boot Actuator,它为应用提供了 ...

  6. 从实践出发:微服务布道师告诉你Spring Cloud与Spring Boot他如何选择

    背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架 ...

  7. Springboot监控之二:Spring Boot Admin对Springboot服务进行监控

    概述 Spring Boot 监控核心是 spring-boot-starter-actuator 依赖,增加依赖后, Spring Boot 会默认配置一些通用的监控,比如 jvm 监控.类加载.健 ...

  8. 从实践出发:微服务布道师告诉你Spring Cloud与Boot他如何选择

    背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架 ...

  9. Spring Boot Admin2.X监控的服务context-path问题

    在使用Spring Boot Admin进行监控时,如果被监控的服务没有加context-path的话是不会有任何问题的,一旦服务加了context-path的配置,监控就会失败. 下图是正常情况的显 ...

随机推荐

  1. php获取当前日期开始一周日期与星期几

    不说了,对于PHPer来说,写不出来说什么都是白瞎,不喜勿喷~~~~ function get_week(){ $data = []; $format='Y-m-d'; for ($i=0; $i&l ...

  2. L147 Low Cost Study Has High Impact Results For Premature Babies

    No one knows exactly why some babies are born prematurely(早产), but some of the smallest premature ba ...

  3. Python中的数据结构 --- 列表(list)

      列表(list)是Python中最基本的.最常用的数据结构(相当于C语言中的数组,与C语言不同的是:列表可以存储任意数据类型的数据). 列表中的每一个元素分配一个索引号,且索引的下标是从0开始. ...

  4. StringUtils.isEmpty和StringUtils.isBlank的区别

    两个方法都是判断字符是否为空的.前者是要求没有任何字符,即str==null 或 str.length()==0:后者要求是空白字符,即无意义字符.其实isBlank判断的空字符是包括了isEmpty ...

  5. azure最佳实践系列1-自我修复的设计

    如何设计你的应用,能够在系统错误时做到自我修复?在分布式系统中,会经常遇到错误.硬件也会遇到异常情况.网络有时会出现短暂的错误.整个地区出现了服务中断.即便如此,关于这些问题的方案也是要提前规划的.因 ...

  6. python kd树 搜索 代码

    kd树就是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,可以运用在k近邻法中,实现快速k近邻搜索.构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,依次选择坐标轴对空间 ...

  7. openssl编译出错解决

    tar -jxvf trafficserver-3.0.2.tar.bz2 ./configure --prefix=/usr/install/trafficserver --with-user=ca ...

  8. pandas.read_csv()参数(转载)

    文章转载地址 pandas.read_csv参数整理 读取CSV(逗号分割)文件到DataFrame 也支持文件的部分导入和选择迭代 更多帮助参见:http://pandas.pydata.org/p ...

  9. SaltStack简明教程

    第1章 SaltStack简明教程 1.1 SaltStack简介 SaltStack是基于Python开发的一套C/S架构配置管理工具(功能不仅仅是配置管理,如使用salt-cloud配置AWS E ...

  10. slam学习

    学习内容: 数学: 线性代数,概率论, 优化理论,离散数学, 李代数, 凸优化: 算法:   概率机器人, 机器人状态估计, 深度学习,非线性优化: 工程: c/c++ , python, ros, ...