Spring Boot Actuator 应用监控

程序员考拉

共 68935字,需浏览 138分钟

 · 2021-04-12

公众号关注 “GitHub今日热榜
设为 “星标”,带你挖掘更多开发神器!







介绍


Spring boot Actuator 提供了一系列的端点来监控和度量应用,包括应用上下文全部Bean信息,自动化配置报告(显示自动配置条件是否通过),配置属性信息,显示应用健康状态等。


环境


Spring Boot 2.0.3


测试


1.初始化一个Spring boot工程,添加actuator依赖:


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


2.添加响应的配置信息(注意:Spring Boot 2和1.x版本相比,不少配置发生修改,废弃不少1.x版本中的属性)


server:
  port: 8080

# actuator监控
management:
  server:
    # 设置监控服务端口
    port: 8081
  endpoints:
    # 设置端点是否可用 默认只有shutdown可用
    enabled-by-default: true
    web:
      # 设置是否暴露端点 默认只有health和info可见
      exposure:
        # 包括所有端点
        include: "*" # 注意需要添加引号
        # 排除端点
        exclude: shutdown


Spring Boot内置端点(和1.x版本相比,不少端点名称发生改变)



Web应用额外的端点:



访问端点需添加前缀/actuator,例如访问beans端点地址为/actuator/beans


/beans:获取应用上下文所有的bean信息


{
    contexts: {
        application: {
            beans: {
                endpointCachingOperationInvokerAdvisor: {
                    aliases: [ ],
                    scope: "singleton",
                    type: "org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor",
                    resource: "class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/EndpointAutoConfiguration.class]",
                    dependencies: [
                        "environment"
                    ]
                },
                defaultServletHandlerMapping: {
                    aliases: [ ],
                    scope: "singleton",
                    type: "org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping",
                    resource: "class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]",
                    dependencies: [ ]
                },
                org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter$FaviconConfiguration: {
                    aliases: [ ],
                    scope: "singleton",
                    type: "org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter$FaviconConfiguration$$EnhancerBySpringCGLIB$$4337b2d4",
                    resource: null,
                    dependencies: [
                        "spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties"
                    ]
                }
            }
        }
    }
}


  • aliases:Bean的别名

  • scope:Bean的作用域,默认单例

  • type:Bean的Java类型

  • reource:class文件的具体路径

  • dependencies:依赖的Bean列表


/health:显示应用程序健康信息


{
    status: "UP"
}


/conditions:获取自动化配置信息,以及是否满足条件的原因


{
    contexts: {
        application: {
            positiveMatches: {
                AuditAutoConfiguration#auditListener: [
                    {
                        condition: "OnBeanCondition",
                        message: "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.listener.AbstractAuditListener; SearchStrategy: all) did not find any beans"
                    }
                ],
                AuditAutoConfiguration.AuditEventRepositoryConfiguration: [
                    {
                        condition: "OnBeanCondition",
                        message: "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.AuditEventRepository;
                        SearchStrategy: all) did not find any beans"
                    }
                ]

            },
            negativeMatches: {
                RabbitHealthIndicatorAutoConfiguration: {
                    notMatched: [
                        {
                            condition: "OnClassCondition",
                            message: "@ConditionalOnClass did not find required class 'org.springframework.amqp.rabbit.core.RabbitTemplate'"
                        }
                    ],
                    matched: [ ]
                },
                AuditAutoConfiguration#authenticationAuditListener: {
                    notMatched: [
                        {
                            condition: "OnClassCondition",
                            message: "@ConditionalOnClass did not find required class 'org.springframework.security.authentication.event.AbstractAuthenticationEvent'"
                        }
                    ],
                    matched: [ ]
                }
            }
        }
    }
}


  • positiveMatches:满足条件的自动化配置

  • negativeMatches:不满足条件的自动化配置


/configprops:显示自动化配置属性信息


{
    contexts: {
        application: {
            beans: {
                server-org.springframework.boot.autoconfigure.web.ServerProperties: {
                    prefix: "server",
                    properties: {
                        undertow: {
                            maxHttpPostSize: 0,
                            eagerFilterInit: true,
                            accesslog: {
                                enabled: false,
                                pattern: "common",
                                prefix: "access_log.",
                                suffix: "log",
                                dir: "E:\\IDEA_Project\\practice\\spring-boot-learning\\spring-boot-actuator\\logs",
                                rotate: true
                            }
                        },
                        port: 8080,
                        maxHttpHeaderSize: 0,
                        tomcat: {
                            accesslog: {
                                enabled: false,
                                pattern: "common",
                                directory: "logs",
                                prefix: "access_log",
                                suffix: ".log",
                                rotate: true,
                                renameOnRotate: false,
                                fileDateFormat: ".yyyy-MM-dd",
                                requestAttributesEnabled: false,
                                buffered: true
                            },
                            internalProxies: "10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|192\\.168\\.\\d{1,3}\\.\\d{1,3}|169\\.254\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}",
                            protocolHeaderHttpsValue: "https",
                            portHeader: "X-Forwarded-Port",
                            backgroundProcessorDelay: {
                                units: [
                                    "SECONDS",
                                    "NANOS"
                                ]
                            },
                            maxThreads: 0,
                            minSpareThreads: 0,
                            maxHttpPostSize: 0,
                            maxHttpHeaderSize: 0,
                            maxConnections: 0,
                            acceptCount: 0,
                            additionalTldSkipPatterns: [ ],
                            resource: { }
                        },
                        servlet: {
                            contextParameters: { },
                            applicationDisplayName: "application",
                            path: "/"
                        },
                        jetty: {
                            accesslog: {
                                enabled: false,
                                retentionPeriod: 31,
                                append: false,
                                extendedFormat: false,
                                dateFormat: "dd/MMM/yyyy:HH:mm:ss Z",
                                timeZone: "GMT",
                                logCookies: false,
                                logServer: false,
                                logLatency: false
                            },
                            maxHttpPostSize: 0
                        },
                        error: {
                            path: "/error",
                            includeException: false,
                            includeStacktrace: "NEVER",
                            whitelabel: {
                                enabled: true
                            }
                        }
                    }
                }
            },
            parentId: null
        }
    }
}


/env:显示系统环境配置信息


{
    activeProfiles: [ ],
    propertySources: [
        {
            name: "server.ports",
            properties: {
                local.management.port: {
                    value: 8081
                },
                local.server.port: {
                    value: 8080
                }
            }
        },
        {
            name: "servletContextInitParams",
            properties: { }
        },
        {
            name: "systemProperties",
            properties: {
                com.sun.management.jmxremote.authenticate: {
                    value: "false"
                },
                java.runtime.name: {
                    value: "Java(TM) SE Runtime Environment"
                }
            }
        },
        {
            name: "systemEnvironment",
            properties: {
                USERDOMAIN_ROAMINGPROFILE: {
                    value: "SYLVIA-PC",
                    origin: "System Environment Property \"USERDOMAIN_ROAMINGPROFILE\""
                },
                LOCALAPPDATA: {
                    value: "C:\\Users\\Sylvia\\AppData\\Local",
                    origin: "System Environment Property \"LOCALAPPDATA\""
                }
            }
        },
        {
            name: "applicationConfig: [classpath:/application.yml]",
            properties: {
                server.port: {
                    value: 8080,
                    origin: "class path resource [application.yml]:2:9"
                },
                management.server.port: {
                    value: 8081,
                    origin: "class path resource [application.yml]:8:11"
                },
                management.endpoints.enabled-by-default: {
                    value: true,
                    origin: "class path resource [application.yml]:11:25"
                },
                management.endpoints.web.exposure.include: {
                    value: "*",
                    origin: "class path resource [application.yml]:16:18"
                },
                management.endpoints.web.exposure.exclude: {
                    value: "shutdown",
                    origin: "class path resource [application.yml]:18:18"
                }
            }
        }
    ]
}


/mappings:查看控制器映射关系


{
    contexts: {
        application: {
            mappings: {
                dispatcherServlets: {
                    dispatcherServlet: [
                        {
                            handler: "ResourceHttpRequestHandler [locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/], class path resource []], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@2edb52aa]]",
                            predicate: "/**/favicon.ico",
                            details: null
                        },
                        {
                            handler: "public java.lang.String com.laravelshao.springboot.ActuatorApplication.demo()",
                            predicate: "{[/demo]}",
                            details: {
                                handlerMethod: {
                                    className: "com.laravelshao.springboot.ActuatorApplication",
                                    name: "demo",
                                    descriptor: "()Ljava/lang/String;"
                                },
                                requestMappingConditions: {
                                    consumes: [ ],
                                    headers: [ ],
                                    methods: [ ],
                                    params: [ ],
                                    patterns: [
                                        "/demo"
                                    ],
                                    produces: [ ]
                                }
                            }
                        },
                        {
                            handler: "public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)",
                            predicate: "{[/error]}",
                            details: {
                                handlerMethod: {
                                    className: "org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController",
                                    name: "error",
                                    descriptor: "(Ljavax/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;"
                                },
                                requestMappingConditions: {
                                    consumes: [ ],
                                    headers: [ ],
                                    methods: [ ],
                                    params: [ ],
                                    patterns: [
                                        "/error"
                                    ],
                                    produces: [ ]
                                }
                            }
                        },
                        {
                            handler: "public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)",
                            predicate: "{[/error],produces=[text/html]}",
                            details: {
                                handlerMethod: {
                                    className: "org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController",
                                    name: "errorHtml",
                                    descriptor: "(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)Lorg/springframework/web/servlet/ModelAndView;"
                                },
                                requestMappingConditions: {
                                    consumes: [ ],
                                    headers: [ ],
                                    methods: [ ],
                                    params: [ ],
                                    patterns: [
                                        "/error"
                                    ],
                                    produces: [
                                        {
                                            mediaType: "text/html",
                                            negated: false
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            handler: "ResourceHttpRequestHandler [locations=[class path resource [META-INF/resources/webjars/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@7cc74785]]",
                            predicate: "/webjars/**",
                            details: null
                        },
                        {
                            handler: "ResourceHttpRequestHandler [locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@2a09788d]]",
                            predicate: "/**",
                            details: null
                        }
                    ]
                },
                servletFilters: [
                    {
                        servletNameMappings: [ ],
                        urlPatternMappings: [
                            "/*"
                        ],
                        name: "requestContextFilter",
                        className: "org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter"
                    },
                    {
                        servletNameMappings: [ ],
                        urlPatternMappings: [
                            "/*"
                        ],
                        name: "characterEncodingFilter",
                        className: "org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter"
                    }
                ],
                servlets: [
                    {
                        mappings: [ ],
                        name: "default",
                        className: "org.apache.catalina.servlets.DefaultServlet"
                    },
                    {
                        mappings: [
                            "/"
                        ],
                        name: "dispatcherServlet",
                        className: "org.springframework.web.servlet.DispatcherServlet"
                    }
                ]
            },
            parentId: null
        }
    }
}


/metrics:提供运行时度量信息,包括内存,堆栈,线程等信息


{
    names: [
        "jvm.memory.max",
        "jvm.gc.memory.promoted",
        "tomcat.cache.hit",
        "tomcat.cache.access",
        "jvm.memory.used",
        "jvm.gc.max.data.size",
        "jvm.gc.pause",
        "jvm.memory.committed",
        "system.cpu.count",
        "logback.events",
        "tomcat.global.sent",
        "jvm.buffer.memory.used",
        "tomcat.sessions.created",
        "jvm.threads.daemon",
        "system.cpu.usage",
        "jvm.gc.memory.allocated",
        "tomcat.global.request.max",
        "tomcat.global.request",
        "tomcat.sessions.expired",
        "jvm.threads.live",
        "jvm.threads.peak",
        "tomcat.global.received",
        "process.uptime",
        "tomcat.sessions.rejected",
        "process.cpu.usage",
        "tomcat.threads.config.max",
        "jvm.classes.loaded",
        "jvm.classes.unloaded",
        "tomcat.global.error",
        "tomcat.sessions.active.current",
        "tomcat.sessions.alive.max",
        "jvm.gc.live.data.size",
        "tomcat.servlet.request.max",
        "tomcat.threads.current",
        "tomcat.servlet.request",
        "jvm.buffer.count",
        "jvm.buffer.total.capacity",
        "tomcat.sessions.active.max",
        "tomcat.threads.busy",
        "process.start.time",
        "tomcat.servlet.error"
    ]
}


/httptrace:追踪web请求的详细信息,包括请求方法、路径、时间戳一级请求和响应的头信息等


{
    traces: [
        {
            timestamp: "2018-06-17T06:54:07.813Z",
            principal: null,
            session: null,
            request: {
                method: "GET",
                uri: "http://localhost:8080/demo",
                headers: {
                    host: [
                        "localhost:8080"
                    ],
                    connection: [
                        "keep-alive"
                    ],
                    upgrade-insecure-requests: [
                        "1"
                    ],
                    user-agent: [
                        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
                    ],
                    accept: [
                        "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
                    ],
                    accept-encoding: [
                        "gzip, deflate, br"
                    ],
                    accept-language: [
                        "zh-CN,zh;q=0.9,ja;q=0.8,ru;q=0.7,en;q=0.6"
                    ]
                },
                remoteAddress: null
            },
            response: {
                status: 200,
                headers: {
                    Content-Type: [
                        "text/html;charset=UTF-8"
                    ],
                    Content-Length: [
                        "14"
                    ],
                    Date: [
                        "Sun, 17 Jun 2018 06:54:07 GMT"
                    ]
                }
            },
            timeTaken: 35
        }
    ]
}


/threaddump:查看应用线程信息


{
    threads: [
        {
            threadName: "DestroyJavaVM",
            threadId: 73,
            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
        }
    ]
}


/shutdown:关闭应用程序(需使用POST请求)




出处:https://blog.csdn.net/laravelshao/article/details/80718846









关注GitHub今日热榜,专注挖掘好用的开发工具,致力于分享优质高效的工具、资源、插件等,助力开发者成长!







点个在看 你最好看


浏览 51
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报