SpringBoot-Metrics监控

标签: | 发表时间:2021-06-15 14:40 | 作者:
出处:https://blog.csdn.net


1.介绍

Metrics基本上是成熟公司里面必须做的一件事情,简单点来说就是对应用的监控,之前在一些技术不成熟的公司其实是不了解这种概念,因为业务跟技术是相关的
当业务庞大起来,技术也会相对复杂起来,对这些复杂的系统进行监控就存在必要性了,特别是在soa化的系统中,完整一个软件的功能分布在各个系统中,针对这些功能进行监控就更必要了
而Spring Boot Actuator 提供了metrics service,让监控变得统一化了,方便管理

2.快速开始

核心是 spring-boot-starter-actuator这个依赖,增加这个依赖之后SpringBoot就会默认配置一些通用的监控,比如jvm监控、类加载、http监控,
当然这些都是一些简单的监控,理论上来说大部分若要在生产中使用,还是需要定制化一下的。先来看一下pom

pom.xml

      <?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.1.RELEASE</version></parent><modelVersion>4.0.0</modelVersion><artifactId>springboot-10</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.4.1.RELEASE</version><configuration><fork>true</fork></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>

启动类

      packagecom.start;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;/**
     * ClassName: AppApplication
     * Description:
     *
     *@authorkang.wang03
     *         Date 2016/11/8
     */@SpringBootApplicationpublicclassAppApplication{publicstaticvoidmain(String[] args)throwsException {
            SpringApplication.run(AppApplication.class, args);
        }

    }

上述配置完成以后运行程序,你会发觉打印日志的时候多了很多mapping的日志

      org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2016-11-2115:48:53.733INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/heapdump || /heapdump.json],methods=[GET],produces=[application/octet-stream]}"ontopublicvoidorg.springframework.boot.actuate.endpoint.mvc.HeapdumpMvcEndpoint.invoke(boolean,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.io.IOException,javax.servlet.ServletException2016-11-2115:48:53.734INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/health || /health.json],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(java.security.Principal)2016-11-2115:48:53.739INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/info || /info.json],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()2016-11-2115:48:53.740INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/beans || /beans.json],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()2016-11-2115:48:53.742INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/env/{name:.*}],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String)2016-11-2115:48:53.742INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/env || /env.json],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()2016-11-2115:48:53.743INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/dump || /dump.json],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()2016-11-2115:48:53.745INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/mappings || /mappings.json],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()2016-11-2115:48:53.746INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/trace || /trace.json],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()2016-11-2115:48:53.749INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()2016-11-2115:48:53.752INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/configprops || /configprops.json],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()2016-11-2115:48:53.754INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/metrics/{name:.*}],methods=[GET],produces=[application/json]}"ontopublicjava.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String)2016-11-2115:48:53.754INFO3883--- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped"{[/metrics || /metrics.json],methods=[GET],

2.1 /heapdump

/heapdump这个主要会dump目前堆的状况出来,可以用jvm的工具大家,并查看目前堆的状况,但是总的来说没人会这么干,会造成系统的短暂停止,大流量容易压垮系统

2.2 /health

/health这个路径主要是用来统计系统的状况,默认里面目前只有系统状况和磁盘状况

      {
        "status":"UP",
        "diskSpace":{
            "status":"UP",
            "total":120108089344,
            "free":20677521408,
            "threshold":10485760}}

2.3 /info

/info

2.4 /beans

/beans可以查看到目前Spring里面加载的所有bean,在生产中感觉没有什么用处,可能在开发中会有一些帮助,方便查看bean是否被扫描

2.5 /env

/env里面包含了目前的环境变量,包括 application.yaml配置的属性,以及systemProperties都能够拿到

2.6 /dump

/dump里面包含了目前线程的一个快照信息

2.7 /mappings

/mappings里面包含了Controller的所有mapping信息,开发中新手经常会遇到访问不到controller的情况,可以根据这个查看是否被扫描

2.8 /trace

/tracetrace目前主要是监控http请求的,监控每个请求的状况,如下所示:

      [
    {
        "timestamp":1479717912091,
        "info":{
            "method":"GET",
            "path":"/",
            "headers":{
                "request":{
                    "Connection":"keep-alive",
                    "User-Agent":"GoogleSoftwareUpdateAgent/1.2.6.1370 CFNetwork/807.0.4 Darwin/16.0.0 (x86_64)",
                    "Host":"127.0.0.1:8080"},
                "response":{
                    "X-Application-Context":"application",
                    "Date":"Mon, 21 Nov 2016 08:45:12 GMT",
                    "Content-Type":"application/json;charset=UTF-8",
                    "status":"404"}}}},
    {
        "timestamp":1479717910980,
        "info":{
            "method":"GET",
            "path":"/",
            "headers":{
                "request":{
                    "Connection":"keep-alive",
                    "User-Agent":"GoogleSoftwareUpdate/1.2.6.1370 CFNetwork/807.0.4 Darwin/16.0.0 (x86_64)",
                    "Host":"127.0.0.1:8080"},
                "response":{
                    "X-Application-Context":"application",
                    "Date":"Mon, 21 Nov 2016 08:45:10 GMT",
                    "Content-Type":"application/json;charset=UTF-8",
                    "status":"404"}}}},
    {
        "timestamp":1479717908924,
        "info":{
            "method":"GET",
            "path":"/",
            "headers":{
                "request":{
                    "Connection":"keep-alive",
                    "User-Agent":"GoogleSoftwareUpdate/1.2.6.1370 CFNetwork/807.0.4 Darwin/16.0.0 (x86_64)",
                    "Host":"127.0.0.1:8080"},
                "response":{
                    "X-Application-Context":"application",
                    "Date":"Mon, 21 Nov 2016 08:45:08 GMT",
                    "Content-Type":"application/json;charset=UTF-8",
                    "status":"404"}}}},
    {
        "timestamp":1479716651440,
        "info":{
            "method":"GET",
            "path":"/trace",
            "headers":{
                "request":{
                    "Cache-Control":"max-age=0",
                    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
                    "Upgrade-Insecure-Requests":"1",
                    "Connection":"keep-alive",
                    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36",
                    "Host":"localhost:8080",
                    "Accept-Encoding":"gzip, deflate, sdch, br",
                    "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6"},
                "response":{
                    "X-Application-Context":"application",
                    "Date":"Mon, 21 Nov 2016 08:24:11 GMT",
                    "Content-Type":"application/json;charset=UTF-8",
                    "status":"200"}}}}
]

2.9 /autoconfig

/autoconfig显示当前SpringBoot,已经自动配置的的属性

2.10 /metrics

/metrics 是整个监控里面的核心信息,

      {
        "mem":323984,
        "mem.free":239989,
        "processors":4,
        "instance.uptime":1670490,
        "uptime":1691378,
        "systemload.average":4.22265625,
        "heap.committed":271872,
        "heap.init":131072,
        "heap.used":31882,
        "heap":1864192,
        "nonheap.committed":54056,
        "nonheap.init":2496,
        "nonheap.used":52113,
        "nonheap":0,
        "threads.peak":15,
        "threads.daemon":5,
        "threads.totalStarted":17,
        "threads":15,
        "classes":6662,
        "classes.loaded":6662,
        "classes.unloaded":0,
        "gc.ps_scavenge.count":10,
        "gc.ps_scavenge.time":153,
        "gc.ps_marksweep.count":2,
        "gc.ps_marksweep.time":150,
        "gauge.response.trace":19,
        "gauge.response.autoconfig":41,
        "gauge.response.error":6,
        "gauge.response.configprops":138,
        "counter.status.200.configprops":1,
        "counter.status.404.error":3,
        "counter.status.200.autoconfig":1,
        "counter.status.200.trace":2}

目前来说包含了如下信息

      The total system memoryinKB (mem)
    The amount of free memoryinKB (mem.free)
    The number of processors (processors)
    The system uptimeinmilliseconds (uptime)
    The application context uptimeinmilliseconds (instance.uptime)
    The average system load (systemload.average)
    Heap informationinKB (heap, heap.committed, heap.init, heap.used)
    Thread information (threads, thread.peak, thread.daemon)
    Class load information (classes, classes.loaded, classes.unloaded)
    Garbage collection information (gc.xxx.count, gc.xxx.time)

3 总结

这些是SpringBoot提供的一些比较简单的Metrics,其实在生产中可以借鉴一些,但是大多数基本都用不上,SpringBoot针对DataSource和Cache都做了Metrics,这个在之后的中级篇会做更进一步的讲解

相关 [springboot metrics 监控] 推荐:

SpringBoot-Metrics监控

- -
Metrics基本上是成熟公司里面必须做的一件事情,简单点来说就是对应用的监控,之前在一些技术不成熟的公司其实是不了解这种概念,因为业务跟技术是相关的. 当业务庞大起来,技术也会相对复杂起来,对这些复杂的系统进行监控就存在必要性了,特别是在soa化的系统中,完整一个软件的功能分布在各个系统中,针对这些功能进行监控就更必要了.

使用Metrics监控应用程序的性能

- - zzm
在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析. 在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对外提供了多少次服务,这些服务的响应时间是多少,随时间变化的情况是什么样的,系统出错的频率是多少. 这些动态的准实时信息对于监控整个系统的运行健康状况来说很重要.

详解 Flink Metrics 原理与监控实战

- - zhisheng的博客
本文主要讲解 Metrics、如何使用 Metrics 分析问题并解决问题,并对 Metrics 监控实战进行解释说明. 本文作者:Apache Flink Contributor 刘彪. Flink 提供的 Metrics 可以在 Flink 内部收集一些指标,通过这些指标让开发人员更好地理解作业或集群的状态.

HBase Metrics机制、架构

- - 开源软件 - ITeye博客
HBase Metrics是一种监控信息实时收集机制. 功能性信息(Compaction Queue、Store Files个数等). JVM使用信息 (Heap Memory 的变化). 借助与Hadoop Metrics同样的方式,向Ganglia汇报. Ganglia的架构图:. Ganglia相关特性:.

ganglia收集hbase的metrics

- - CSDN博客云计算推荐文章
Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点. 每台计算机都运行一个收集和发送度量数据(如处理器速度、内存使用量等)的名为 gmond 的守护进程. 它将从操作系统和指定主机中收集. 接收所有度量数据的主机可以显示这些数据并且可以将这些数据的精简表单传递到层次结构中.

Hadoop Metrics体系分析之三:构建自己的Metrics

- - Taobao QA Team
大型分布式系统中需要metrics来了解系统状态已成为系统必需的功能之一. 其实测试系统甚至测试用例中也同样需要metrics. 通过这些指标我们可以了解测试的进度、状况、以及一些过程情况,比如性能指标和一些无法用是否判断数据. 下面我们就用一个简单的例子来看看如何使用hadoop metrics.

Eclipse:使用Metrics 测量复杂度

- - CSDN博客推荐文章
Metrics可以进行许多有用的代码度量,包括圈复杂度度量,它用于测量方法中惟一路径的数目. 在Eclipse中安装和使用Metrics步骤 . Elipse中安装Metrics插件 . 打开Help->Install new Software,点击Add,添加Repository. 选择相应的版本插件,继续随后的安装 .

Hadoop Metrics体系架构分析

- - 非技术 - ITeye博客
原文: http://blog.csdn.net/chenpingbupt/article/details/7957396. 本文基于Hadoop 0.20.XX版本分析,和现在的Metrics2稍有不同. Hadoop Metrics用来统计集群运行数据,比如接口调用次数,响应时间,队列长度等等,现阶段(0.19版本)支持为数不多的几个层级的数据,分别是dfs,jvm,rpc,mepred等.

SpringBoot的事务管理

- - ImportNew
Springboot内部提供的事务管理器是根据autoconfigure来进行决定的. 比如当使用jpa的时候,也就是pom中加入了spring-boot-starter-data-jpa这个starter之后(之前我们分析过 springboot的自动化配置原理). Springboot会构造一个JpaTransactionManager这个事务管理器.

springboot aop日志记录

- - 编程语言 - ITeye博客
一、POM增加AOP JAR包. 三、SysAspect类. 注:@annotation(cn.com.hfai.controller.system.Logweb) 一定要指定Logweb类. 四、在Controller类的方法之上加上注解 @Logweb 即可. 注:这个只是打印在控制台上,若想放到数据库中,则需要增加操作数据库的业务代码.