• SpringBoot1.x与监控(六)


    由于2.x和1.x的监控不一样,此处先讲1.x

    一 SpringBoot1.x监控

    pom.xml

    1         <dependency>
    2             <groupId>org.springframework.boot</groupId>
    3             <artifactId>spring-boot-starter-actuator</artifactId>
    4         </dependency>

    显示信息

    10-15 15:57:11.548  INFO 11388 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    2019-10-15 15:57:11.548  INFO 11388 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.29
    2019-10-15 15:57:11.657  INFO 11388 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2019-10-15 15:57:11.657  INFO 11388 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1027 ms
    2019-10-15 15:57:11.970  INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
    2019-10-15 15:57:11.970  INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'metricsFilter' to: [/*]
    2019-10-15 15:57:11.970  INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
    2019-10-15 15:57:11.970  INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
    2019-10-15 15:57:11.970  INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
    2019-10-15 15:57:11.985  INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
    2019-10-15 15:57:11.985  INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'webRequestLoggingFilter' to: [/*]
    2019-10-15 15:57:11.985  INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'applicationContextIdFilter' to: [/*]
    2019-10-15 15:57:12.251  INFO 11388 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6b1274d2: startup date [Tue Oct 15 15:57:10 CST 2019]; root of context hierarchy
    2019-10-15 15:57:12.298  INFO 11388 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
    2019-10-15 15:57:12.298  INFO 11388 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
    2019-10-15 15:57:12.329  INFO 11388 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2019-10-15 15:57:12.329  INFO 11388 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2019-10-15 15:57:12.360  INFO 11388 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2019-10-15 15:57:12.563  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/health || /health.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(javax.servlet.http.HttpServletRequest,java.security.Principal)
    2019-10-15 15:57:12.574  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/auditevents || /auditevents.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.boot.actuate.endpoint.mvc.AuditEventsMvcEndpoint.findByPrincipalAndAfterAndType(java.lang.String,java.util.Date,java.lang.String)
    2019-10-15 15:57:12.574  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/dump || /dump.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/heapdump || /heapdump.json],methods=[GET],produces=[application/octet-stream]}" onto public void org.springframework.boot.actuate.endpoint.mvc.HeapdumpMvcEndpoint.invoke(boolean,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.io.IOException,javax.servlet.ServletException
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/trace || /trace.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/loggers/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.get(java.lang.String)
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/loggers/{name:.*}],methods=[POST],consumes=[application/vnd.spring-boot.actuator.v1+json || application/json],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.set(java.lang.String,java.util.Map<java.lang.String, java.lang.String>)
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/loggers || /loggers.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/beans || /beans.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/metrics/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String)
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/metrics || /metrics.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/mappings || /mappings.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/configprops || /configprops.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/info || /info.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/env/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String)
    2019-10-15 15:57:12.575  INFO 11388 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/env || /env.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
    ​

    在配置文件application.properties中加入

    management.security.enabled=false
    info.app.id=hello
    info.app=world #可以随意配置info开头的信息

    下面进行各个节点测试

    http://localhost:8080/health
    {
      "status": "UP",
      "diskSpace": {
        "status": "UP",
        "total": 322541973504,
        "free": 218166931456,
        "threshold": 10485760
      }
    }
    http://localhost:8080/info
    ​
    {"app":"world","app.id":"hello"}
    http://localhost:8080/dump
    ​
    {
        "threadName": "DestroyJavaVM",
        "threadId": 40,
        "blockedTime": -1,
        "blockedCount": 0,
        "waitedTime": -1,
        "waitedCount": 0,
        "lockName": null,
        "lockOwnerId": -1,
        "lockOwnerName": null,
        "inNative": false,
        "suspended": false,
        "threadState": "RUNNABLE",
        "stackTrace": [],
        "lockedMonitors": [],
        "lockedSynchronizers": [],
        "lockInfo": null
      },
      {
        "threadName": "http-nio-8080-AsyncTimeout",
        "threadId": 38,
        "blockedTime": -1,
        "blockedCount": 0,
        "waitedTime": -1,
        "waitedCount": 653,
        "lockName": null,
        "lockOwnerId": -1,
        "lockOwnerName": null,
        "inNative": false,
        "suspended": false,
        "threadState": "TIMED_WAITING",
        "stackTrace": [
          {
            "methodName": "sleep",
            "fileName": "Thread.java",
            "lineNumber": -2,
            "className": "java.lang.Thread",
            "nativeMethod": true
          },
          {
            "methodName": "run",
            "fileName": "AbstractProtocol.java",
            "lineNumber": 1133,
            "className": "org.apache.coyote.AbstractProtocol$AsyncTimeout",
            "nativeMethod": false
          },
          {
            "methodName": "run",
            "fileName": "Thread.java",
            "lineNumber": 745,
            "className": "java.lang.Thread",
            "nativeMethod": false
          }
        ],
    http://localhost:8080/env
    ​
    {
      "profiles": [],
      "server.ports": {
        "local.server.port": 8080
      },
      "commandLineArgs": {
        "spring.output.ansi.enabled": "always"
      },
      "servletContextInitParams": {},
      "systemProperties": {
      .....
      }
    http://localhost:8080/beans
    ​
     {
        "context": "application",
        "parent": null,
        "beans": [
          {
            "bean": "actuatorApplication",
            "aliases": [],
            "scope": "singleton",
            "type": "com.example.demo.ActuatorApplication$$EnhancerBySpringCGLIB$$90808ed2",
            "resource": "null",
            "dependencies": []
          },
          {
            "bean": "org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory",
            "aliases": [],
            "scope": "singleton",
            "type": "org.springframework.core.type.classreading.CachingMetadataReaderFactory",
            "resource": "null",
            "dependencies": []
          },
          {
            "bean": "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration",
            "aliases": [],
            "scope": "singleton",
            "type": "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration$$EnhancerBySpringCGLIB$$15f9df49",
            "resource": "null",
            "dependencies": []
          },
    http://localhost:8080/health
    ​
    {
      "status": "UP",
      "diskSpace": {
        "status": "UP",
        "total": 322541973504,
        "free": 218146656256,
        "threshold": 10485760
      }
    }
    http://localhost:8080/metrics
    ​
    {
      "mem": 277267,
      "mem.free": 168703,
      "processors": 4,
      "instance.uptime": 785901,
      "uptime": 789830,
      "systemload.average": -1,
      "heap.committed": 235520,
      "heap.init": 262144,
      "heap.used": 66816,
      "heap": 3702784,
      "nonheap.committed": 42816,
      "nonheap.init": 2496,
      "nonheap.used": 41748,
      "nonheap": 0,
      "threads.peak": 36,
      "threads.daemon": 26,
      "threads.totalStarted": 42,
      "threads": 28,
      "classes": 6055,
      "classes.loaded": 6055,
      "classes.unloaded": 0,
      "gc.ps_scavenge.count": 5,
      "gc.ps_scavenge.time": 49,
      "gc.ps_marksweep.count": 1,
      "gc.ps_marksweep.time": 38,
      "httpsessions.max": -1,
      "httpsessions.active": 0,
      "gauge.response.beans": 12,
      "gauge.response.env": 8,
      "gauge.response.dump": 58,
      "gauge.response.health": 24,
      "gauge.response.star-star.favicon.ico": 25,
      "counter.status.200.beans": 2,
      "counter.status.200.star-star.favicon.ico": 1,
      "counter.status.200.health": 1,
      "counter.status.200.dump": 1,
      "counter.status.200.env": 2
    }
    
    

    当加入git.properties

    git.branch=master
    git.commit.id=xjkd33s
    git.commit.time=2017-12-12 12:12:56
    http://localhost:8080/info
    ​
    {
      "app": "world",
      "app.id": "hello",
      "git": {
        "commit": {
          "time": "2017-12-12 12:12:56",
          "id": "xjkd33s"
        },
        "branch": "master"
      }
    }

    检查健康监控的时候,测试如下

    加入redis的依赖

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

    配置(测试用,随便填的地址)

    spring.redis.host=118.24.44.169
    http://localhost:8080/health       ##会查出redis的信息
    {
      "status": "DOWN",
      "diskSpace": {
        "status": "UP",
        "total": 322541973504,
        "free": 218147446784,
        "threshold": 10485760
      },
      "redis": {
        "status": "DOWN",
        "error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool"
      }
    }

    二 定制断点信息

    • 定制断点一般通过endpoints+端点名+属性名来设置。

      • 修改端口id(endpoints.beans.id=mybean)

        修改结果:http://localhost:8080/mybean 要这样才能登陆

      • 修改端口id(endpoints.beans.path=/bean)

        修改结果:http://localhost:8080/bean 要这样才能登陆

      • endpoints.beans.enabled=false

        修改结果:http://localhost:8080/bean 无法登陆

      • endpoints.enabled=false

        修改结果:所有的监控都无法登陆

      • endpoints.beans.enabled=true

      修改结果:http://localhost:8080/bean 只有这个能登陆

      • management.context-path=/manage

        修改结果:访问要加路径/manage

      • management.port=8181

        修改结果:访问的端口改成8181

    三 自定义健康状态指示器

    • 编写一个指示器 实现 HealthIndicator 接口

    • 指示器的名字 xxxxHealthIndicator

    • 加入容器中

      package com.example.demo;
      ​
      import org.springframework.boot.actuate.health.Health;
      import org.springframework.boot.actuate.health.HealthIndicator;
      import org.springframework.stereotype.Component;
      ​
      @Component
      public class MyAppHealthIndicator implements HealthIndicator {
      ​
          @Override
          public Health health() {
      ​
              //自定义的检查方法
              //Health.up().build()代表健康
              return Health.down().withDetail("msg","服务异常").build();
          }
      }
      ​

      测试结果:

      http://localhost:8080/manage/health
      ​
      {
        "status": "DOWN",
        "myApp": {
          "status": "DOWN",
          "msg": "服务异常"
        },
        "diskSpace": {
          "status": "UP",
          "total": 322541973504,
          "free": 218143944704,
          "threshold": 10485760
        },
        "redis": {
          "status": "DOWN",
          "error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool"
        }
      }

     

  • 相关阅读:
    Dubbo学习记录(一)
    Quartz定调度简单案例
    oracle中批量生成字段类型的脚本
    MsSQLserver中修改字段值系统自动生成的脚本
    根据oracle的主键列生成SQLserver的主键
    SQLServer2005如何批量修改架构名
    win10 下oracle tns通过IP无法访问的解决办法
    PD PDM模型中关系设置为概念模型样式
    PB12.5.2安装
    Java Web 项目目录规范
  • 原文地址:https://www.cnblogs.com/dalianpai/p/11678794.html
Copyright © 2020-2023  润新知