架构篇–系统监控–spring-boot2.0.X 系统原生信息监控,SQL信息监控,cpu温度监控报警,cup磁盘内存使用率监控报警,自定义端点监控以及子节点获取,加工原生端点,系统异常邮件通知,ui界面spring-boot-admin2.0集成等等内容
@author Simon
监控是系统中的一个重要组成部分,没有监控的系统是不允许被上线的。
监控是为了防患于未然,将错误扼杀在摇篮。系统报警设置阈值,一旦接触危险,马上通知所有人。错误信息记录,将错误直接暴露在眼前,不必要浪费人力物力去大面积测试寻找,合理化控制了日志输出,减少运维工程师的负担,也方便开发工程师定位解决错误。
这就是监控,先求生存,而后谋发展,保证系统万无一失,这才是监控的作用。
有关具体的监控内容请看下图:
Actuator项目为测试demo,非工程化项目,功能基础,结构简单,仅仅为测试监控内容实现,考察技术难度编写,前后端传值为json形式,restful标准接口。
本项目使用2.0.2.RELEASE,请注意使用2.0.0之前的版本不会匹配。springboot推出2.0版本的actuator模块产生很大改变。
重点上代码:自己撸(项目源码)
依赖模块
springboot依赖
1. spring-boot-starter-parent
2. spring-boot-starter
3. spring-boot-starter-actuator
4. spring-boot-starter-data-jpa
5. spring-boot-starter-web
6. spring-boot-starter-test
7. spring-boot-starter-security
8. spring-context-support
其他依赖
1. com.alibaba
2. jolokia-core
3. org.hsqldb
4. mysql-connector-java
application.yml
#项目路径和端口
server.servlet.context-path=/ds
server.port=9999
#监控配置
management.server.port=8888
#开启全部端点
management.endpoints.web.exposure.include=*
#health
management.endpoints.web.path-mapping.health=healthcheck
management.endpoint.health.show-details=always
management.health.db.enabled=true
management.health.diskspace.enabled=true
management.health.defaults.enabled=true
#配置详情信息
info.app.encoding=UTF-8
info.app.java.source=1.8
info.app.java.target=1.8
#数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/db_ebuy?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#数据库参数配置
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.filters=stat,wall,log4j
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
actuator 提供的端点信息
监控检查url: http://localhost:8888/ + 端点
端点 | 描述 | HTTP 方法 |
---|---|---|
auditevents | 显示通用的监控信息 | GET |
beans | 显示应用程序上下文所有的Spring bean | GET |
configprops | 显示所有 @ConfigurationProperties 的配置属性列表 | GET |
threaddump | 显示线程活动的快照 | GET |
env | 显示应用的环境变量 | GET |
healthcheck | 显示应用程序的健康指标,这些值由HealthIndicator的实现类提供。常见取值:UP / DOWN / UNKNOWN / OUT_OF_SERVICE | GET |
info | 显示应用的信息,可使用 info.* 属性自定义info端点公开的数据 | GET |
mappings | 显示所有的URL路径 | GET |
metrics | 显示应用的度量标准信息 | GET |
shutdown | 关闭应用(默认情况下不启用,如需启用,需设置endpoints.shutdown.enabled=true ) | POST |
sessions | 程序sessions的信息 | GET |
conditions | 显示配置的条件和原因 | GET |
httptrace | 显示http追踪信息 | GET |
loggers | 显示修饰和配置的日志 | GET |
scheduledtasks | 显示程序中预定的任务 | GET |
实时查看性能状态
访问方式
http://localhost:8888/actuator/metrics + { name }
性能查询
springboot 原生集成的信息查看内容
##############################################################################
# 1、http信息
http.client.requests
http.server.requests
# 2、jvm信息
jvm.gc.pause
jvm.gc.max.data.size
jvm.gc.live.data.size
jvm.gc.memory.promoted
jvm.gc.memory.allocated
jvm.memory.used
jvm.memory.max
jvm.memory.committed
jvm.threads.daemon
jvm.threads.live
jvm.threads.peak
jvm.classes.loaded
jvm.classes.unloaded
jvm.buffer.count
jvm.buffer.memory.used
jvm.buffer.total.capacity
# 3、process信息
process.uptime
process.start.time
# 4、系统信息
system.cpu.count
system.cpu.usage
system.load.average.1m
# 5、tomcat信息
#cache
tomcat.cache.hit
tomcat.cache.access
#session
tomcat.sessions.active.current
tomcat.sessions.active.max
tomcat.sessions.rejected
tomcat.sessions.expired
tomcat.sessions.created
#global
tomcat.global.request.max
tomcat.global.request
tomcat.global.sent
tomcat.global.received
tomcat.global.error
#servlet
tomcat.servlet.error
tomcat.servlet.request.max
tomcat.servlet.request
#threads
tomcat.threads.current
tomcat.threads.busy
tomcat.threads.config.max
#logback
logback.events
druid实时信息监控
Druid是Java语言中最好的数据库连接池。
Druid能够提供强大的监控和扩展功能。
访问地址
http://localhost:9999/ds/druid/login.html
账号:admin
密码:admin
资源引入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
自定义监控端点
工程化项目需要对自身项目进行监控,本demo是对功能信息考察
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.Selector;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.stereotype.Component;
/**
*
* @author Simon
* @version 2018年5月25日
* 自定义端点
*/
@Endpoint(id = "get-time")
@Component
public class GetTime {
private final Map<String,Object> message =(Map<String, Object>) new HashMap();
private GetTime(){
this.message.put("当前时间", new Date());
this.message.put("我是", "Simon");
this.message.put("111", "222");
}
@ReadOperation
public Map<String,Object> getAll() {
return message;
}
@ReadOperation
public Map<String,Object> getOne(@Selector String name) {
Object value=message.get(name);
Map<String,Object> message2= new HashMap<String,Object>();
return message2;
}
@WriteOperation
public void updatePerson(@Selector String name) {
this.message.put(name, name);
}
}
访问地址
import java.util.*;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.Selector;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes;
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
import org.springframework.boot.actuate.endpoint.web.annotation.WebEndpoint;
import org.springframework.boot.actuate.web.mappings.MappingDescriptionProvider;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.cors.CorsConfiguration;
/**
*
* @author Simon
* @version 2018年5月25日
*
* 自定义监视端点
*/
@Endpoint(id = "person")
@Component
public class PersonEndpoint {
private final Map<String, Person> people = new HashMap<>();
PersonEndpoint() {
this.people.put("Simon", new Person("Michael Simon"));
this.people.put("Alan", new Person("Rowena Alan"));
this.people.put("Bryant", new Person("Barry Bryant"));
}
@ReadOperation
public Map<String, Person> getAll() {
return people;
}
@ReadOperation
public Person getPerson(@Selector String person) {
return this.people.get(person);
}
@WriteOperation
public void updatePerson(@Selector String name, String person) {
this.people.put(name, new Person(person));
}
}
访问地址
ui界面spring-boot-admin2.0集成
创建新maven项目monitoring-server作为监控的服务端
pom.xml
<!--服务端监控-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-ui</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 在管理界面中与 JMX-beans 进行交互所需要被依赖的 JAR -->
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
<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>
application.properties
server.port=8080
#设置监控的名称
spring.application.name=monitor-server
启动项
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
/**
* @author Simon
* @create 2018-10-11 14:26
* @desc
**/
@Configuration
@EnableAutoConfiguration
@EnableAdminServer
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
完成服务端配置
编写要监控的服务项目author
pom.xml
<!--监控客户端-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.0.0</version>
</dependency>
application.properties
#开启全部端点
management.endpoints.web.exposure.include=*
#配置服务器
spring.boot.admin.client.url=http://localhost:8080
完成配置,先运行monitoring-server,再运行author
在浏览器上执行http://localhost:8080/#/wallboard