Spring Boot有个子项目Spring Boot Actuator,它为应用提供了强大的监控能力。从Spring Boot 2.0开始,Actuator将底层改为Micrometer,提供了更强、更灵活的监控能力。本次便利用Micrometer搭建出一套可视化的监控体系。

Micrometer

Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。Micrometer 还支持推送数据到多个不同的监控系统。

我们首先引入相关的依赖

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>

在Micrometer中有以下几种指标

计数器

只加不减,通常用于记录服务的请求数量

public static void main(String[] args) throws Exception {
//tag必须成对出现,也就是偶数个
Counter counter = Counter.builder("counter")
.tag("counter", "counter")
.description("counter")
.register(new SimpleMeterRegistry());
counter.increment();
counter.increment(2D);
System.out.println(counter.count());
System.out.println(counter.measure());
//全局静态方法
Metrics.addRegistry(new SimpleMeterRegistry());
counter = Metrics.counter("counter", "counter", "counter");
counter.increment(10086D);
counter.increment(10087D);
System.out.println(counter.count());
System.out.println(counter.measure());
}

仪表

表示单个数值的度量,它可以表示任意地上下移动的数值测量。通常用于变动的测量值,如当前的内存使用情况,同时也可以测量上下移动的”计数”,比如队列中的消息数量

public static void main(String[] args) throws Exception {
AtomicInteger atomicInteger = new AtomicInteger();
Gauge gauge = Gauge.builder("gauge", atomicInteger, AtomicInteger::get)
.tag("gauge", "gauge")
.description("gauge")
.register(new SimpleMeterRegistry());
atomicInteger.addAndGet(5);
System.out.println(gauge.value());
System.out.println(gauge.measure());
atomicInteger.decrementAndGet();
System.out.println(gauge.value());
System.out.println(gauge.measure());
Metrics.addRegistry(new SimpleMeterRegistry());
AtomicInteger other = Metrics.gauge("gauge", atomicInteger, AtomicInteger::get);
System.out.println(other);
}

摘要

用于跟踪事件的分布。它类似于一个计时器,但更一般的情况是,它的大小并不一定是一段时间的测量值。在micrometer中,对应的类是DistributionSummary,它的用法有点像Timer,但是记录的值是需要直接指定,而不是通过测量一个任务的执行时间。

public static void main(String[] args) throws Exception {
DistributionSummary summary = DistributionSummary.builder("summary")
.tag("summary", "summary")
.description("summary")
.register(new SimpleMeterRegistry());
summary.record(2D);
summary.record(3D);
summary.record(4D);
System.out.println(summary.measure());
System.out.println(summary.count());
System.out.println(summary.max());
System.out.println(summary.mean());
System.out.println(summary.totalAmount());
}

计时器

测量一个特定的代码逻辑块的调用(执行)速度和它的时间分布

public static void main(String[] args) throws Exception{
Timer timer = Timer.builder("timer")
.tag("timer","timer")
.description("timer")
.register(new SimpleMeterRegistry());
timer.record(()->{
try {
TimeUnit.SECONDS.sleep(2);
}catch (InterruptedException e){
//ignore
}
});
System.out.println(timer.count());
System.out.println(timer.measure());
System.out.println(timer.totalTime(TimeUnit.SECONDS));
System.out.println(timer.mean(TimeUnit.SECONDS));
System.out.println(timer.max(TimeUnit.SECONDS));
}

有了以上几个api后我们就能实现简单的自定义监控指标进行测量。但是这样的数据无法直接的显示到页面上。所以我们这里还需要引入两个中间件

Prometheus

Prometheus 是一套开源的系统监控报警框架

作为新一代的监控框架,Prometheus 具有以下特点:

灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作。
易于管理: Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。
高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。
使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。
可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。
可以通过服务发现或者静态配置去获取监控的 targets。
有多种可视化图形界面。

我们先下载安装 Prometheus

为了更直接的操作,我们这次不使用docker。去官网下载压缩文件解压执行

wget https://github.com/prometheus/prometheus/releases/download/v2.11.1/prometheus-2.11.1.darwin-amd64.tar.gz
tar -zvxf prometheus-2.11.1.darwin-amd64.tar.gz

解压完成后修改Prometheus的配置文件prometheus.yml。将metrics_path和 static_configs.targets的地址修改成项目的地址。

# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s). # Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093 # 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'.
metrics_path: /prometheus
static_configs:
- targets: ['localhost:9091']

然后运行prometheus

./prometheus -config.file=prometheus.yml

这个时候我们要在项目中增加一个prometheus依赖这样就能把项目中断点数据暴露到prometheus了。

<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

访问 http://localhost:9090/targets

这个时候项目的数据已经能够展示成一个图表了。但还不够直观,这里我们再引入grafana

grafana

Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点:

1、展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;

2、数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;

3、通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;

4、混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;

5、注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;

6、过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。

安装

wget https://dl.grafana.com/oss/release/grafana-6.2.5.darwin-amd64.tar.gz
tar -zxvf grafana-6.2.5.darwin-amd64.tar.gz

默认配置先不用改

./grafana-server

运行grafana,访问localhost:3000 账号密码是admin/admin。我们就进入grafana的界面了

先添加一个数据源

选择prometheus



填写信息保存即可

再创建监控Dashboard

Dashboard也就是数据面板。规定了数据源中的数据已何种方式展现。我们这里选择导入别人已有的数据面板。前往 Grafana Lab - Dashboards,选择适合的数据面板



输入后即可看到类似如下的界面,选择数据源,并点击Import。

此时,即可看到类似如下的界面,如图所示,我们常关心的指标该Dashboard均已支持!

好了,一个简单的监控系统小案例就完成了。

那现在我们想要自定义一些指标展现到面板上。举个例子,我们要统计所有HTTP请求数量。

首先添加一个拦截器,在连接器中用一个Counter做累加器

/**
* @author Xu.Minzhe
* @version V1.0
* @package com.xmz.consume.micrometer
* @class: SampleMvcInterceptor.java
* @description: 统计所有入站的Http请求数量(包括成功、失败和非法的)
* @Date 2019-07-18 16:40
*/
//请求拦截器
@Component
public class SampleMvcInterceptor extends HandlerInterceptorAdapter { private static final Counter COUNTER = Counter.builder("Http请求统计")
.tag("HttpCount", "HttpCount")
.description("Http请求统计")
.register(Metrics.globalRegistry); @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
COUNTER.increment();
} }
/**
* @author Xu.Minzhe
* @version V1.0
* @package com.xmz.consume.micrometer.interceptor
* @class: SampleWebMvcConfigurer.java
* @description:
* @Date 2019-07-18 16:42
*/
@Component
public class SampleWebMvcConfigurer implements WebMvcConfigurer {
@Autowired
private SampleMvcInterceptor sampleMvcInterceptor; @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(sampleMvcInterceptor);
}
}

然后我们访问http://localhost:9091/prometheus 查看prometheus的的断点中是否多了Http请求统计

然后有了上述端点后我们在grafana中添加http请求的数据窗口

保存后我们就能在dashboard上看得我我们的监控指标了

参考

https://www.ibm.com/developerworks/cn/java/j-using-micrometer-to-record-java-metric/index.html

http://www.itmuch.com/spring-boot/actuator-prometheus-grafana/

Springboot的监控的更多相关文章

  1. 【spring cloud】【spring boot】网管服务-->配置文件添加endpoints.enabled = false,SpringBoot应用监控Actuator使用的安全隐患

    转载:https://xz.aliyun.com/t/2233 ==================================================================== ...

  2. SpringBoot服务监控

    SpringBoot服务监控分为客户端和服务端,即服务端是监控方,客户端为被监控方. 例如需要对线上的SpringBoot服务project-A进行监控,则project-A 为客户端.而监控的服务p ...

  3. SpringBoot Actuator监控【转】

    springboot actuator 监控 springboot1.5和springboot2.0 的actuator在启动日志上的差异就很大了. springboot1.5在启动时会打印很多/XX ...

  4. 面试官:聊一聊SpringBoot服务监控机制

    目录 前言 SpringBoot 监控 HTTP Endpoints 监控 内置端点 health 端点 loggers 端点 metrics 端点 自定义监控端点 自定义监控端点常用注解 来,一起写 ...

  5. springBoot actuator监控配置及使用

    准备环境: 一个springBoot工程 第一步:添加以下依赖 <dependency> <groupId>org.springframework.boot</group ...

  6. java框架之SpringBoot(17)-监控管理

    介绍 SpringBoot 提供了监控管理功能的场景启动器,它可以为我们提供准生产环境下的应用监控和管理功能.我们可以通过HTTP.JMX.SSH协议来进行操作,自动得到审计.健康及指标信息等. 使用 ...

  7. 使用SpringBoot Admin监控SpringCloud微服务

    spring-boot admin的github地址:https://github.com/codecentric/spring-boot-admin 本文基于SpringCloud的环境和配置上增加 ...

  8. springboot应用监控和管理

    spring boot应用监控和管理 Spring Boot 监控核心是 spring-boot-starter-actuator 依赖,增加依赖后, Spring Boot 会默认配置一些通用的监控 ...

  9. 【Springboot】用Springboot Admin监控你的微服务应用

    1 简介 目前,微服务大行其道,各大小公司争相学习模仿,把单体应用拆得七零八落.服务多了,运行的实例多了,给运维人员的压力就更大了.如果有十几个应用,单单做Health Check就已经够费时间的了. ...

  10. springboot 实时监控 spring-boot-starter-actuator 包

    对java工程实时监控方式很多,本文主要讲在springboot框架中的监控. springboot框架,自带了actuator监控,在pom中引入jar包即可,如下 1.引入jar <depe ...

随机推荐

  1. Pyqt5使用

    一.帮助文档 二.PyQt5库结构 三. 面向对象的编程模式 class Windows(QWidget): def __init__(self): #继承父类的QWidget的方法 super(). ...

  2. Kubernets二进制安装(7)之部署主控节点服务--apiserver二进制安装

    kube-apiserver集群规划 主机名 角色 IP地址 mfyxw30.mfxyw.com kube-apiserver主 192.168.80.30 mfyxw40.mfyxw.com kub ...

  3. Excel添加超链接

    using Microsoft.Office.Interop.Excel; Worksheet sheet; public void AddLink(int row, int col, string ...

  4. Java之先行发生原则与volatile关键字详解

    volatile关键字可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易完全被正确.完整地理解,以至于许多程序员都习惯不去使用它,遇到需要处理多线程数据竞争问题的时候一律使用synchro ...

  5. redis字符串-sds

    redis自己实现了一种名为简单动态字符串的抽象类型(simple dynamic string)作为字符串的表示.下面将简单介绍sds的实现原理. 一.sds的结构

  6. C++ part9

    1.静态多态和动态多态 静态多态:函数重载,模板.编译期间完成. 动态多态:虚函数.运行期间实现. 2.模板的实现和优缺点 函数模板的代码并不能直接编译成二进制代码,而是要实例出一个模板实例.写了模板 ...

  7. VuePress config All In One

    VuePress config All In One docs/.vuepress/config.js const { title, description, } = require('../../p ...

  8. JavaScript var, let, const difference All In One

    JavaScript var, let, const difference All In One js var, let, const 区别 All In One 是否存在 hoisting var ...

  9. Web 网站安全测试 & 渗透测试

    Web 网站安全测试 & 渗透测试 Penetration Testing learning path 建一个测试环境来进行渗透测试 安装 Kali Linux -渗透测试操作系统 在虚拟机中 ...

  10. convert number or string to ASCII in js

    convert number or string to ASCII in js ASCII dictionary generator // const dict = `abcdefghijklmnop ...