前言 :

今天在阅读 《SpringCloud微服务实战》一书时看到了SpringBoot actuator相关知识,并且自己也本地调试实践。觉得SpringBoot这一套监控还是挺有意思的,这里记录下学习过程。

注:本文基于 springBootVersion = '1.5.10.RELEASE'

一:初识actuator

actuator是SpringBoot的一个组件,组件名称为:spring-boot-starter-actuator, 引入方式如下:
application配置文件:

#actuator
management.security.enabled= false
endpoints.health.sensitive= false

maven引入:

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

或者gradle:

compile('org.springframework.boot:spring-boot-starter-actuator')

配置完成之后,启动项目,可以看到:

启动的时候会加载actuator的所有原生端点,后面会对一些常用的节点做解释。

二,体验Actuator

spring-bbot-starter-actuator模块中已经实现了一些原生端点,根据端点的作用,可以将原生端点分为三大类:

  • 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
  • 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如内存信息、线程池信息、HTTP请求统计等。
  • 操作控制类:提供了对应用的关闭等操作类功能。

下面就来详细测试这几种原生端点,以及看下他们的有用信息和强大的功能。

2.1 应用配置类

由于Spring Boot为了改善传统Spring引用繁杂的配置内容,采用了包扫描和自动化配置的机制来加载原本集中于XML文件中的各项内容。虽然这样的做法让我们的代码变得非常简洁,但是整个应用的实例创建和依赖关系等信息都离散到了各个配置类的注解上,这使我们分析整个应用中资源的实例的各种关系变得非常困难。而这类端点可以帮助我们轻松获取一系列关于Spring 应用配置内容的详细报告,比如自动化配置的报告、Bean创建的报告、环境属性的报告等。

  • /autoconfig:该端点用来获取应用的自动化配置报告,其中包括所有自动化配置的候选项。同时还列出每个候选项是否满足自动化配置的各个先决条件。所以,该端点可以帮助我们方便地找到一些自动化配置为什么没有生效的原因。该报告内容将自动化配置内容分为以下两部分:
    positiveMatchers:返回的是条件匹配成功的自动化配置。
    negativeMatches :
    返回的是条件匹配不成功的自动化配置。

    这里只是展示一部分内容,方便展示而省略了很多信息。

    {
    "positiveMatches": {
    "PageHelperAutoConfiguration": [
    {
    "condition": "OnBeanCondition",
    "message": "@ConditionalOnBean (types: org.apache.ibatis.session.SqlSessionFactory; SearchStrategy: all) found bean 'sqlSessionFactory'"
    }
    ]
    },
    "negativeMatches": {
    "EncryptionBootstrapConfiguration.RsaEncryptionConfiguration": {
    "notMatched": [
    {
    "condition": "EncryptionBootstrapConfiguration.KeyCondition",
    "message": "Keystore nor key found in Environment"
    }
    ],
    "matched": [
    {
    "condition": "OnClassCondition",
    "message": "@ConditionalOnClass found required class 'org.springframework.security.rsa.crypto.RsaSecretEncryptor'; @ConditionalOnMissingClass did not find unwanted class"
    }
    ]
    }
    }
    }

    当我们发现有一些期望的配置没有生效时,我们可以通过该端点来查看没有生效的具体原因。

  • /beans:该端点用来获取应用上下文中创建的所有Bean。

    如上图所示,我们可以看到每个Bean中都包含了下面的这些信息:
    bean:Bean的名称
    scope:Bean的作用域
    type:Bean的Java类型
    resource:class文件的具体路径
    dependencies:以来的Bean名称

  • /configprops:该端点用来获取应用中配置的属性信息报告。prefix属性代表了属性的配置前缀,properties代表了各个属性的名称和值。
    所以,我们可以通过该报告来看到各个属性的配置路径,比如我们要关闭该端点,就可以通过使用endpoints.configprops.enabled=false来完成配置。
  • /env:该端点预/configprops不同,它用来获取应用所有可用的环境属性报告。包括环境变量、JVM属性、应用的配置属性、命令行中的参数。从下面该端点返回的示例片段中,可以看到它不仅返回了应用的配置属性,还返回了系统属性、环境变量等丰富的配置信息,其中还包括了应用还没有使用的配置,所以它可以帮助我们方便地看到当前应用可以加载的配置信息,并配合@ConfigurationProperties注解将它们引入到我们的应用程序中来进行使用。另外,为了配置属性的安全,对于一些类似密码等敏感信息,该端点都会进行隐私保护,但是我们需要让属性中包含password、secret、key 这些关键词,这样该端点再返回它们的时候都会使用*来替代实际的属性值。

  • /mappings:该端点用来返回所有Spring MVC 的控制器映射关系报告。从下面的示例片段中,我们可以看到该报告的信息与我们在启用Spring MVC的Web应用时输出的日志信息类似,其中bean属性标识了该映射关系的请求处理器,method属性标识了该映射关系的具体处理类和处理函数。

2.2 度量指标类
上面我们所介绍的应用配置端点类所提供的信息报告在应用启动的是否就已经基本确定了其返回内容,可以说是一个静态报告。而度量指标类端点提供的报告内容则是动态变化的,这些端点提供了应用程序在运行过程中一些快照信息,比如内存使用情况、HTTP请求统计、外部资源指标等。这些端点对于我们构建微服务架构中的监控系统非常有帮助,由于Spring Boot 应用自身实现了这些端点,所以我们可以很方便地利用它们来收集我们想要的信息,以定制出各种自动化策略。下面,我们就来看看这些强大的端点功能。

  • metrics:该端点用来返回当前应用的各类重要度量指标,比如内存信息、线程信息、垃圾回收信息等。

    从上面的示例中,我们看到有如下这些重要的度量值:
    系统信息:包括处理器数量processors、运行时间uptime和instance.uptime、系统平均负载systemload.average。
    mem.*: 内存概要信息,包括分配给应用的总内存数量以及当前空闲的内存数量。这些信息来自java.lang.Runtime。
    heap.*: 堆内存使用情况。这些信息来自java.lang.management.MemoryMXBean接口中getHeapMemoryUsage方法获取的java.lang.management.MemoryUsage。
    nonheap.*: 非堆中内存使用情况。这些信息来自java.lang.management.MemoryMXBean接口中getNonHeamMemoryUsage方法获取的java.lang.management.MemoryUsage。
    thrads.*: 线程使用情况,包括线程数、首付线程数(daemon)、线程峰值(peak)等,这些数据均来自java.lang.management.ThreadMXBean。
    classes.*: 应用加载和卸载的类统计。这些数据均来自java.lang.management.ClassLoadingMXBean。
    gc.*: 垃圾收集器的相信信息。包括垃圾回收次数:gc.ps_scavenge.count,垃圾回收消耗时间:gc.ps_scavenge.time,标记-清除算法的次数:gc.ps_marksweep.count,标记清除算法耗时gc.ps_markweep.time
    httpsessions.*: Tomecat容器的会话使用情况。包括最大会话数:httpsession.max和获取会话数:httpsessions.active。该度量指标信息仅在引用嵌入式Tomcat作为容器时才提供。
    gauge.*: HTTP请求的性能指标之一,它主要用来反映一个绝对数值。
    counter.*: HTTP请求的性能指标之一,它主要用来计数器来使用,记录了增加量和减少量。

    /metrics端口可以提供应用运行状态的完整度量报告,这项功能非常实用,但是对于监控系统中各项监控功能,它们的监控内容、数据收集频率都有所不同,如果每次都通过全年获取报告的方式来收集,略显粗暴。所以我们可以通过?metrics/{name}接口来更细粒度地获取度量信息。比如我们可以通过/metrics/mem.free来获取当前可用内存数量。

  • /health:该端点用来获取应用的各类健康指标信息。在spring-boot-starter-actuator模块中自带实现了一些常用资源的健康指标检测器。这些检测器都通过HealthIndicator接口实现,并且会根据依赖关系的引入实现自动化配置,比如下面列出的这些:
    检测器 功能
     DiskSpaceHealthIndicatior  低磁盘空间检测
     DataSOurceHealthIndicator    检测DataSource的连接是否可用
     MongoHealthIndicator  检测Mongo数据库是否可用
     RabbitHealthIndicator    检测Rabbit服务器是否可用
     RedisHealthIndicator    检测Redis服务器是否可用
     SolrHealthIndicator  检测Solr服务器是否可用

  • /dump:该端点用来暴露程序运行过程中的线程信息。它使用java.lang.management.ThreadMXBean的dumpAllThreads方法来返回所有包含有同步信息的活动线程详情。
  • trace: 该端点用来返回基本的HTTP跟踪信息。默认情况下,跟踪信息的存储采用org.springframework.boot.actuate.trace.InMemoryTraceRepository实现的内存方式,始终保留最近的100条请求记录。

2.3 操作控制类

在原生端点中,只提供了一个用来关闭应用的端点:/shutdown ,可以通过如下配置开启它:
 endpoints.shutdown.enabled=true

在配置了上述属性之后,只需要访问该应用的/shutdown 端点就能实现关闭该应用的远程操作。由于开放关闭应用的操作本身是一件非常危险的事,所以真正在线上使用的时候,需要对其加入一定的保护机制。比如定制actuator的端点路径、整合Spring Security进行安全校验等。

三:总结

刚好自己维护的项目在往spring cloud迁移,现在刚好可以利用业余时间来学习微服务相关的知识。
spring-boot-actuator确实可以带来很多我们想不到的收获,而且对于运维也是非常有好多。在这里感谢 《Spring Cloud 微服务实战》这本书,文章中很多内容是通过读书来学习到的,这里只是做个总结。如有纰漏还请大家多多指教。

SpringBoot actuator 应用监控。的更多相关文章

  1. springcloud(九) springboot Actuator + admin 监控

    前一章讲的都是Feign项目(调用方)的监控.接下来讲的是服务提供方的监控 一.springboot actuator + springboot admin Spring Boot Admin 是一个 ...

  2. SpringBoot Actuator监控【转】

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

  3. SpringBoot Actuator — 埋点和监控

    项目中看到了有埋点监控.报表.日志分析,有点兴趣想慢慢捣鼓一下 1. 数据埋点 监控机器环境的性能和业务流程或逻辑等各项数据,并根据这些数据生成对应的指标,那么我们就称为数据埋点.比如我们想知道某个接 ...

  4. Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控

    Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控 Spring Boot Actuator提供了对单个Spring Boot的监控,信息包含: ...

  5. SpringBoot Actuator & SpringBoot Admin

    SpringBoot Actuator提供了很多监控和管理你的spring boot应用的HTTP或者JMX端点,并且你可以有选择地开启和关闭部分功能. 当你的spring boot应用中引入依赖之后 ...

  6. springboot actuator 配置安全

    springboot actuator监控是什么?类似php的phpinfor()函数,不过actuator更强大,可以查看的数据.状态更多.Actuator是Spring Boot提供的对应用系统的 ...

  7. springboot(二十):使用spring-boot-admin对spring-boot服务进行监控

    上一篇文章<springboot(十九):使用Spring Boot Actuator监控应用>介绍了Spring Boot Actuator的使用,Spring Boot Actuato ...

  8. SpringBoot Actuator

    SpringBoot Actuator 提供了检查项目内部信息的一整套API,通常在项目启动时可以看到. 1.引入依赖包 <dependency> <groupId>org.s ...

  9. springboot Actuator健康检查

    通过情况下,如我们想在系统中添加一个健康检查的接口,我们怎么做呢? 我们会新建一个类,或在已存在类的基础上添加检测接口. package com.crhms.medicareopinion; impo ...

随机推荐

  1. Stingray验证机制

    Filter 系统中的验证使用的是Filter库来完成,利用Filter配置几个属性和参数就实现了表单验证,简化了工作.基本原理很简单,在onload之后按照属性查找元素,然后绑定相应的change/ ...

  2. vue key

    有相同父元素的子元素必须有独特的 key.重复的 key 会造成渲染错误. <ul> <li v-for="item in items" :key="i ...

  3. 分分钟带你玩转 Web Services【1】JAX-WS

    当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来. 毕竟是多家不同的公司的产品,研发开发语言.采用技术框架基本上是百花齐放. 怎样让自家系统提供的服务具有跨平台.跨语言.跨各种防 ...

  4. ES6学习笔记九:修饰器

    一:修饰器(Decorator)是一个函数,用来修改类的行为. 1)定义与使用 function 修饰器名(target) { //target是被修饰对象,可用target.xxx进行调用修改 } ...

  5. AndroidAnnotations库的使用

    AndroidAnnotations(Code Diet) android高速开发框架简单介绍: 项目地址:https://github.com/excilys/androidannotations ...

  6. Docker Swarm Mode无法增加管理节点

    这两天用Docker Swarm Mode,加入新的管理节点会报以下错误(在/var/log/messages文件中可以看到): Handler for POST /v1.37/swarm/join ...

  7. Centos6.x 设置终端超时, 加强用户密码策略

    1. 密码有效期, 密码长度 $ more /etc/login.defs # Password aging controls: # # PASS_MAX_DAYS Maximum number of ...

  8. Dockerfiler如何使用多个启动命令entrypoint

    两个办法,一个是CMD不用中括号框起来,将命令用"&&"符号链接: # 用nohup框起来,不然npm start执行了之后不会执行后面的 CMD nohup sh ...

  9. hihocoder第233周

    题目链接 题目描述 给定一个数组a[N],N小于1e5.把数组划分成若干个片段,每个片段的和都不为0,问有多少种划分方法? 方法描述 定义f(i)表示0~i共有多少种划分方式,则$f(j)=\sum_ ...

  10. 【LeetCode】203. Remove Linked List Elements

    Remove Linked List Elements Remove all elements from a linked list of integers that have value val. ...