Мониторинг приложений с помощью Spring Boot Actuator
View more Tutorials:
Spring Boot Actuator является подпроектом (sub-project) в проекте Spring Boot. Он построен для собрания и мониторинга инфомации приложения. Вы можете внедрить его в свое приложение и использовать его свойства. Для мониторинга приложения вам нужно получить доступ в endpoint (Конечные точки) построенные в Spring Boot Actuator, одновременно, вы можете создать свои отдельные endpoint если хотите.
В данной статье я покажу вам как использовать Spring Boot Actuator в приложении Spring Boot версии 2.0.0.M7 или новее.
Заметьте, что Spring Boot Actuator имеет множество изменений в версии 2.x по сравнению с версией 1.x, поэтому удостоверьтесь, что вы работаете с Spring Boot версии 2.0.0.M7 или новее.
Spring Boot Actuator это подпроект (завершенный продукт) в экосисетме Spring, и вы можете встроить его в ваш существующий проект Spring Boot. Все, что вам нужно сделать это объявить библиотеки Spring Boot Actuator и некоторые конфигурации в файле application.properties. В данной статье я создам проект Spring Boot и встрою Spring Boot Actuator. Наша цель узнать свойства предоставленные Spring Boot Actuator.
OK!, На Eclipse создать проект Spring Boot.

Здесь мы выберем версию 2.0.0.M7 или новее.

pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="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"> <modelVersion>4.0.0</modelVersion> <groupId>org.o7planning</groupId> <artifactId>SpringBootActuator</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>SpringBootActuator</name> <description>Spring Boot +Actuator</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</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> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Add the configuration to the application.properties file:
application.properties
server.port=8080 management.server.port=8090 management.endpoints.web.exposure.include=* management.endpoint.shutdown.enabled=true
- server.port=8080
Ваше приложение будет работать на порту 8080 (port 8080), это порт по умолчанию и вы можете изменить его, если хотите.
- management.server.port=8090
Эти endpoint связанные с мониторингом Spring Boot Actuator будут доступны по другим портам в отличии от порта 8080 выше, целью является избежание ошибок и увеличение безопасности. Но это не обязательно.
- management.endpoints.web.exposure.include=*
По умолчанию не все Endpoint у Spring Boot Actuator активированы. Использовать знак * чтобы активировать все данные Endpoint.
- management.endpoint.shutdown.enabled=true
shutdown это особенный Endpoint у Spring Boot Actuator, он позволяет вам отключить (shutdown) приложение безопасно, не используя такие команды как "Kill process", "end task" операционной системы.
MainController.java
package org.o7planning.sbactuator.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @ResponseBody @RequestMapping(path = "/") public String home(HttpServletRequest request) { String contextPath = request.getContextPath(); String host = request.getServerName(); // Spring Boot >= 2.0.0.M7 String endpointBasePath = "/actuator"; StringBuilder sb = new StringBuilder(); sb.append("<h2>Sprig Boot Actuator</h2>"); sb.append("<ul>"); // http://localhost:8090/actuator String url = "http://" + host + ":8090" + contextPath + endpointBasePath; sb.append("<li><a href='" + url + "'>" + url + "</a></li>"); sb.append("</ul>"); return sb.toString(); } }
Запустить ваше приложение и пройти по следующей ссылке:

Примечение: Данные предоставленные с помощью endpoint уSpring Boot Actuator имеют формат JSON, поэтому лучше смотрится и вы можете реформатировать (reformat) эти данные. Например вебсайт ниже предоставляет онлайн инструмент для форматирования JSON:
/actuator
/actuator это endpoint (Конечная точка), она предоставляет список других endpoint у Spring Boot Actuator, к которым вы можете иметь доступ.
/actuator
{ "_links": { "self": { "href": "http://localhost:8090/actuator", "templated": false }, "auditevents": { "href": "http://localhost:8090/actuator/auditevents", "templated": false }, "beans": { "href": "http://localhost:8090/actuator/beans", "templated": false }, "health": { "href": "http://localhost:8090/actuator/health", "templated": false }, "conditions": { "href": "http://localhost:8090/actuator/conditions", "templated": false }, "shutdown": { "href": "http://localhost:8090/actuator/shutdown", "templated": false }, "configprops": { "href": "http://localhost:8090/actuator/configprops", "templated": false }, "env": { "href": "http://localhost:8090/actuator/env", "templated": false }, "env-toMatch": { "href": "http://localhost:8090/actuator/env/{toMatch}", "templated": true }, "info": { "href": "http://localhost:8090/actuator/info", "templated": false }, "loggers": { "href": "http://localhost:8090/actuator/loggers", "templated": false }, "loggers-name": { "href": "http://localhost:8090/actuator/loggers/{name}", "templated": true }, "heapdump": { "href": "http://localhost:8090/actuator/heapdump", "templated": false }, "threaddump": { "href": "http://localhost:8090/actuator/threaddump", "templated": false }, "metrics-requiredMetricName": { "href": "http://localhost:8090/actuator/metrics/{requiredMetricName}", "templated": true }, "metrics": { "href": "http://localhost:8090/actuator/metrics", "templated": false }, "scheduledtasks": { "href": "http://localhost:8090/actuator/scheduledtasks", "templated": false }, "trace": { "href": "http://localhost:8090/actuator/trace", "templated": false }, "mappings": { "href": "http://localhost:8090/actuator/mappings", "templated": false } } }
/actuator/health
/actuator/health предоставляет вам информацию здоровья приложения. Статус UP или DOWN, и другую информацию про жесткий диск, такие как размер жесткого диска, использованный объем и неиспользованный объем.
/actuator/health
{ "status": "UP", "details": { "diskSpace": { "status": "UP", "details": { "total": 75812040704, "free": 8067600384, "threshold": 10485760 } } } }
actuator/metrics
Данный Endpoint предоставляет вам список metric (Стандарт измерений)
actuator/metrics
{ "names": [ "jvm.memory.committed", "jvm.buffer.memory.used", "jvm.buffer.count", "logback.events", "process.uptime", "jvm.memory.max", "jvm.memory.used", "jvm.buffer.total.capacity", "system.cpu.count", "process.start.time" ] }
И вы можете посмотреть информацию определенного metric.
actuator/metrics/{requiredMetricName}
/actuator/metrics/jvm.memory.used
{ "name": "jvm.memory.used", "measurements": [ { "statistic": "Value", "value": 109937744 } ], "availableTags": [ { "tag": "area", "values": [ "heap", "nonheap", "nonheap", "heap", "nonheap", "nonheap", "heap" ] }, { "tag": "id", "values": [ "G1 Old Gen", "Compressed Class Space", "CodeHeap 'non-nmethods'", "G1 Survivor Space", "Metaspace", "CodeHeap 'non-profiled nmethods'", "G1 Eden Space" ] } ] }
/actuator/beans
/actuator/beans предоставляет вам список Spring BEAN управляемые в вашем приложении.
/actuator/beans
{ "contextId": "application:8080", "beans": { "endpointCachingOperationInvokerAdvisor": { "aliases": [], "scope": "singleton", "type": "org.springframework.boot.actuate.endpoint.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": [] } .... }, "parent": null }
/actuator/env
/actuator/env предоставляет вам всю информацию про среду, в которой работает ваше приложение, например: название операционной системы, classpath, версия Java,...
/actuator/env
{ "activeProfiles": [], "propertySources": [ { "name": "server.ports", "properties": { "local.management.port": { "value": 8090 }, "local.server.port": { "value": 8080 } } }, { "name": "servletContextInitParams", "properties": {} }, { "name": "systemProperties", "properties": { "sun.desktop": { "value": "windows" }, "awt.toolkit": { "value": "sun.awt.windows.WToolkit" }, "java.specification.version": { "value": "9" }, "file.encoding.pkg": { "value": "sun.io" }, "sun.cpu.isalist": { "value": "amd64" }, "sun.jnu.encoding": { "value": "Cp1252" }, "java.class.path": { "value": "C:\\Users\\tran\\.m2\\repository\\org\\springframework\\spring-jcl\\5.0.2.RELEASE\\spring-jcl-5.0.2.RELEASE.jar;...." }, "com.sun.management.jmxremote.authenticate": { "value": "false" }, "java.vm.vendor": { "value": "Oracle Corporation" }, "sun.arch.data.model": { "value": "64" }, "user.variant": { "value": "" }, "java.vendor.url": { "value": "http://java.oracle.com/" }, "catalina.useNaming": { "value": "false" }, "user.timezone": { "value": "Asia/Bangkok" }, "os.name": { "value": "Windows 8.1" }, "java.vm.specification.version": { "value": "9" }, "sun.java.launcher": { "value": "SUN_STANDARD" }, "user.country": { "value": "US" }, "sun.boot.library.path": { "value": "C:\\DevPrograms\\Java\\jre-9.0.1\\bin" }, "com.sun.management.jmxremote.ssl": { "value": "false" }, "spring.application.admin.enabled": { "value": "true" }, "sun.java.command": { "value": "org.o7planning.sbactuator.SpringBootActuatorApplication" }, "com.sun.management.jmxremote": { "value": "" }, "jdk.debug": { "value": "release" }, "sun.cpu.endian": { "value": "little" }, "user.home": { "value": "C:\\Users\\tran" }, "user.language": { "value": "en" }, "java.specification.vendor": { "value": "Oracle Corporation" }, "java.home": { "value": "C:\\DevPrograms\\Java\\jre-9.0.1" }, "file.separator": { "value": "\\" }, "java.vm.compressedOopsMode": { "value": "Zero based" }, "line.separator": { "value": "\r\n" }, "java.specification.name": { "value": "Java Platform API Specification" }, "java.vm.specification.vendor": { "value": "Oracle Corporation" }, "java.awt.graphicsenv": { "value": "sun.awt.Win32GraphicsEnvironment" }, "java.awt.headless": { "value": "true" }, "user.script": { "value": "" }, "sun.management.compiler": { "value": "HotSpot 64-Bit Tiered Compilers" }, "java.runtime.version": { "value": "9.0.1+11" }, "user.name": { "value": "tran" }, "path.separator": { "value": ";" }, "os.version": { "value": "6.3" }, "java.runtime.name": { "value": "Java(TM) SE Runtime Environment" }, "file.encoding": { "value": "UTF-8" }, "spring.beaninfo.ignore": { "value": "true" }, "java.vm.name": { "value": "Java HotSpot(TM) 64-Bit Server VM" }, "java.vendor.url.bug": { "value": "http://bugreport.java.com/bugreport/" }, "java.io.tmpdir": { "value": "C:\\Users\\tran\\AppData\\Local\\Temp\\" }, "catalina.home": { "value": "C:\\Users\\tran\\AppData\\Local\\Temp\\tomcat.16949807720416048110.8080" }, "java.version": { "value": "9.0.1" }, "com.sun.management.jmxremote.port": { "value": "54408" }, "user.dir": { "value": "E:\\ECLIPSE_TUTORIAL\\JAVA_SPRING_BOOT\\SpringBootActuator" }, "os.arch": { "value": "amd64" }, "java.vm.specification.name": { "value": "Java Virtual Machine Specification" }, "PID": { "value": "5372" }, "java.awt.printerjob": { "value": "sun.awt.windows.WPrinterJob" }, "sun.os.patch.level": { "value": "" }, "catalina.base": { "value": "C:\\Users\\tran\\AppData\\Local\\Temp\\tomcat.8934969984130443549.8090" }, "java.library.path": { "value": "C:\\DevPrograms\\Java\\jre-9.0.1\\bin;...;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files\\EmEditor;." }, "java.vm.info": { "value": "mixed mode" }, "java.vendor": { "value": "Oracle Corporation" }, "java.vm.version": { "value": "9.0.1+11" }, "java.rmi.server.hostname": { "value": "localhost" }, "java.rmi.server.randomIDs": { "value": "true" }, "sun.io.unicode.encoding": { "value": "UnicodeLittle" }, "java.class.version": { "value": "53.0" } } }, { "name": "systemEnvironment", "properties": { "USERDOMAIN_ROAMINGPROFILE": { "value": "tran-pc", "origin": "System Environment Property \"USERDOMAIN_ROAMINGPROFILE\"" }, "LOCALAPPDATA": { "value": "C:\\Users\\tran\\AppData\\Local", "origin": "System Environment Property \"LOCALAPPDATA\"" }, "PROCESSOR_LEVEL": { "value": "6", "origin": "System Environment Property \"PROCESSOR_LEVEL\"" }, "FP_NO_HOST_CHECK": { "value": "NO", "origin": "System Environment Property \"FP_NO_HOST_CHECK\"" }, "USERDOMAIN": { "value": "tran-pc", "origin": "System Environment Property \"USERDOMAIN\"" }, "LOGONSERVER": { "value": "\\\\TRAN-PC", "origin": "System Environment Property \"LOGONSERVER\"" }, "SESSIONNAME": { "value": "Console", "origin": "System Environment Property \"SESSIONNAME\"" }, "ALLUSERSPROFILE": { "value": "C:\\ProgramData", "origin": "System Environment Property \"ALLUSERSPROFILE\"" }, "PROCESSOR_ARCHITECTURE": { "value": "AMD64", "origin": "System Environment Property \"PROCESSOR_ARCHITECTURE\"" }, "PSModulePath": { "value": "C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\", "origin": "System Environment Property \"PSModulePath\"" }, "SystemDrive": { "value": "C:", "origin": "System Environment Property \"SystemDrive\"" }, "APPDATA": { "value": "C:\\Users\\tran\\AppData\\Roaming", "origin": "System Environment Property \"APPDATA\"" }, "USERNAME": { "value": "tran", "origin": "System Environment Property \"USERNAME\"" }, "ProgramFiles(x86)": { "value": "C:\\Program Files (x86)", "origin": "System Environment Property \"ProgramFiles(x86)\"" }, "CommonProgramFiles": { "value": "C:\\Program Files\\Common Files", "origin": "System Environment Property \"CommonProgramFiles\"" }, "Path": { "value": "D:\\DEV_PROGRAMS\\Oracle12c\\product\\12.2.0\\dbhome_1\\bin;...;C:\\Program Files\\EmEditor", "origin": "System Environment Property \"Path\"" }, "PATHEXT": { "value": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC", "origin": "System Environment Property \"PATHEXT\"" }, "OS": { "value": "Windows_NT", "origin": "System Environment Property \"OS\"" }, "COMPUTERNAME": { "value": "TRAN-PC", "origin": "System Environment Property \"COMPUTERNAME\"" }, "PROCESSOR_REVISION": { "value": "3c03", "origin": "System Environment Property \"PROCESSOR_REVISION\"" }, "CommonProgramW6432": { "value": "C:\\Program Files\\Common Files", "origin": "System Environment Property \"CommonProgramW6432\"" }, "ComSpec": { "value": "C:\\Windows\\system32\\cmd.exe", "origin": "System Environment Property \"ComSpec\"" }, "ProgramData": { "value": "C:\\ProgramData", "origin": "System Environment Property \"ProgramData\"" }, "ProgramW6432": { "value": "C:\\Program Files", "origin": "System Environment Property \"ProgramW6432\"" }, "HOMEPATH": { "value": "\\Users\\tran", "origin": "System Environment Property \"HOMEPATH\"" }, "SystemRoot": { "value": "C:\\Windows", "origin": "System Environment Property \"SystemRoot\"" }, "TEMP": { "value": "C:\\Users\\tran\\AppData\\Local\\Temp", "origin": "System Environment Property \"TEMP\"" }, "HOMEDRIVE": { "value": "C:", "origin": "System Environment Property \"HOMEDRIVE\"" }, "PROCESSOR_IDENTIFIER": { "value": "Intel64 Family 6 Model 60 Stepping 3, GenuineIntel", "origin": "System Environment Property \"PROCESSOR_IDENTIFIER\"" }, "USERPROFILE": { "value": "C:\\Users\\tran", "origin": "System Environment Property \"USERPROFILE\"" }, "TMP": { "value": "C:\\Users\\tran\\AppData\\Local\\Temp", "origin": "System Environment Property \"TMP\"" }, "CommonProgramFiles(x86)": { "value": "C:\\Program Files (x86)\\Common Files", "origin": "System Environment Property \"CommonProgramFiles(x86)\"" }, "ProgramFiles": { "value": "C:\\Program Files", "origin": "System Environment Property \"ProgramFiles\"" }, "PUBLIC": { "value": "C:\\Users\\Public", "origin": "System Environment Property \"PUBLIC\"" }, "NUMBER_OF_PROCESSORS": { "value": "8", "origin": "System Environment Property \"NUMBER_OF_PROCESSORS\"" }, "windir": { "value": "C:\\Windows", "origin": "System Environment Property \"windir\"" } } }, { "name": "applicationConfig: [classpath:/application.properties]", "properties": { "server.port": { "value": "8080", "origin": "class path resource [application.properties]:1:13" }, "management.server.port": { "value": "8090", "origin": "class path resource [application.properties]:2:24" }, "management.endpoints.web.expose": { "value": "*", "origin": "class path resource [application.properties]:3:33" }, "management.endpoint.shutdown.enabled": { "value": "true", "origin": "class path resource [application.properties]:4:38" } } } ] }
/actuator/info
/actuator/info предоставляет вашу кастомизированную информацию. По умолчанию пустая информация. Поэтому вы должнысоздать Spring BEAN для предоставления данной информации.
BuildInfoContributor.java
package org.o7planning.sbactuator.monitoring; import java.util.HashMap; import java.util.Map; import org.springframework.boot.actuate.info.Info; import org.springframework.boot.actuate.info.InfoContributor; import org.springframework.stereotype.Component; @Component public class BuildInfoContributor implements InfoContributor { @Override public void contribute(Info.Builder builder) { Map<String,String> data= new HashMap<String,String>(); data.put("build.version", "2.0.0.M7"); builder.withDetail("buildInfo", data); } }

Это endpoint помогающий вам отключить (shutdown) приложение. Вам нужно вызвать его методом POST, если успешно, вы получите сообщение "Shutting down, bye...".
ShutdownController.java
package org.o7planning.sbactuator.controller; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.client.RestTemplate; @Controller public class ShutdownController { @ResponseBody @RequestMapping(path = "/shutdown") public String callActuatorShutdown() { // Actuator Shutdown Endpoint: String url = "http://localhost:8090/actuator/shutdown"; // Http Headers HttpHeaders headers = new HttpHeaders(); headers.add("Accept", MediaType.APPLICATION_JSON_VALUE); headers.setContentType(MediaType.APPLICATION_JSON); RestTemplate restTemplate = new RestTemplate(); // Data attached to the request. HttpEntity<String> requestBody = new HttpEntity<>("", headers); // Send request with POST method. String e = restTemplate.postForObject(url, requestBody, String.class); return "Result: " + e; } }

Spring Boot Actuator это совершенный продукт, которые предоставляет вам endpoint чтобы мониторить приложение. Но в некоторых случаях вы хотите создать ваши отдельные endpoint. Чтобы сделать это вы можете просмотреть следующую статью:
- TODO Link!