整理监控代码

pull/64/head
fengshuonan 2021-01-21 22:18:11 +08:00
parent 77e3694add
commit 522a132750
14 changed files with 117 additions and 92 deletions

12
pom.xml
View File

@ -161,28 +161,18 @@
<version>${oshi.version}</version> <version>${oshi.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- actuator monitor --> <!-- actuator monitor -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId> <artifactId>spring-boot-starter-actuator</artifactId>
</dependency> </dependency>
<!-- prometheus meter --> <!-- prometheus meter -->
<dependency> <dependency>
<groupId>io.micrometer</groupId> <groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId> <artifactId>micrometer-registry-prometheus</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -1,13 +1,9 @@
package cn.stylefeng.guns; package cn.stylefeng.guns;
import io.micrometer.core.instrument.MeterRegistry;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
import org.springframework.context.annotation.Bean;
/** /**
* SpringBoot * SpringBoot
@ -23,10 +19,6 @@ public class GunsApplication {
SpringApplication.run(GunsApplication.class, args); SpringApplication.run(GunsApplication.class, args);
log.info(GunsApplication.class.getSimpleName() + " is success!"); log.info(GunsApplication.class.getSimpleName() + " is success!");
} }
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(
@Value("${spring.application.name}") String applicationName) {
return (registry) -> registry.config().commonTags("application", applicationName);
}
} }

View File

@ -0,0 +1,29 @@
package cn.stylefeng.guns.config;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*
*
* @author fengshuonan
* @date 2021/1/21 22:07
*/
@Configuration
public class ActuatorConfiguration {
/**
*
*/
@Value("${spring.application.name}")
private String applicationName;
@Bean
public MeterRegistryCustomizer<MeterRegistry> configurer() {
return (registry) -> registry.config().commonTags("application", applicationName);
}
}

View File

@ -44,6 +44,7 @@ public interface ProjectConstants {
* prometheus * prometheus
*/ */
String PROMETHEUS_QUERY_RANGE = "query_range"; String PROMETHEUS_QUERY_RANGE = "query_range";
/** /**
* prometheus * prometheus
*/ */
@ -58,4 +59,5 @@ public interface ProjectConstants {
* prometheus * prometheus
*/ */
String PROMETHEUS_STEP = "step"; String PROMETHEUS_STEP = "step";
} }

View File

@ -1,21 +1,19 @@
package cn.stylefeng.guns.modular.system.controller; package cn.stylefeng.guns.modular.system.controller;
import cn.hutool.core.util.EscapeUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.guns.core.consts.ProjectConstants; import cn.stylefeng.guns.core.consts.ProjectConstants;
import cn.stylefeng.guns.modular.system.model.PromResultInfo; import cn.stylefeng.guns.modular.system.model.PromResultInfo;
import cn.stylefeng.guns.modular.system.service.MetricService; import cn.stylefeng.guns.modular.system.service.MetricService;
import cn.stylefeng.guns.modular.system.warpper.SystemHardwareWarpper; import cn.stylefeng.guns.modular.system.warpper.SystemHardwareWrapper;
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource; import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource; import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -23,15 +21,12 @@ import java.util.Objects;
* *
* *
* @author chenli * @author chenli
* @Date 2020/12/30 16:40 * @date 2020/12/30 16:40
*/ */
@Controller @Controller
@Slf4j
@ApiResource(name = "项目监控") @ApiResource(name = "项目监控")
public class MonitorController { public class MonitorController {
private String PREFIX = "/modular/frame";
@Value("${server.port}") @Value("${server.port}")
private String port; private String port;
@ -44,83 +39,84 @@ public class MonitorController {
@Value("${prometheus.instance}") @Value("${prometheus.instance}")
private String prometheusInstance; private String prometheusInstance;
@Autowired @Resource
private MetricService service; private MetricService service;
/** /**
* *
* *
* @author fengshuonan * @author fengshuonan
* @Date 2018/12/24 22:43 * @date 2018/12/24 22:43
*/ */
@GetResource(name = "服务器监控", path = "/monitor/systemInfo") @GetResource(name = "服务器监控", path = "/view/monitor/systemInfo")
public String systemInfo(Model model) { public String systemInfo(Model model) {
SystemHardwareWarpper systemHardwareWarpper = new SystemHardwareWarpper(); SystemHardwareWrapper systemHardwareWrapper = new SystemHardwareWrapper();
systemHardwareWarpper.copyTo(); systemHardwareWrapper.copyTo();
model.addAttribute("server",systemHardwareWarpper); model.addAttribute("server", systemHardwareWrapper);
return PREFIX+"/systemInfo.html"; return "/modular/frame/systemInfo.html";
} }
/** /**
* durid sql * druid sql
* *
* @author chenli * @author chenli
* @Date 2021/1/4 16:32 * @date 2021/1/4 16:32
*/ */
@GetResource(name = "SQL监控", path = "/monitor/druid") @GetResource(name = "SQL监控", path = "/view/monitor/druid")
public String duridInfo(Model model){ public String druidInfo(Model model) {
model.addAttribute("port",port); model.addAttribute("port", port);
return PREFIX+"/druid.html"; return "/modular/frame/druid.html";
} }
/** /**
* tomcat * tomcat
* *
* @author chenli * @author chenli
* @Date 2021/1/4 16:32 * @date 2021/1/4 16:32
*/ */
@GetResource(name = "tomcat监控", path = "/monitor/tomcatInfo") @GetResource(name = "tomcat监控", path = "/view/monitor/tomcatInfo")
public String tomcatInfo(Model model){ public String tomcatInfo(Model model) {
getMetricInfos("tomcat_",model); getMetricInfos("tomcat_", model);
return PREFIX+"/tomcatInfo.html"; return "/modular/frame/tomcatInfo.html";
} }
/** /**
* jvm * jvm
* *
* @author chenli * @author chenli
* @Date 2021/1/4 16:32 * @date 2021/1/4 16:32
*/ */
@GetResource(name = "jvm监控", path = "/monitor/jvmInfo") @GetResource(name = "jvm监控", path = "/view/monitor/jvmInfo")
public String jvmInfo(Model model){ public String jvmInfo(Model model) {
getMetricInfos("jvm_",model); getMetricInfos("jvm_", model);
return PREFIX+"/jvmInfo.html"; return "/modular/frame/jvmInfo.html";
} }
/** /**
* *
* *
* @author chenli * @author chenli
* @Date 2021/1/4 16:32 * @date 2021/1/4 16:32
*/ */
private void getMetricInfos(String metric,Model model){ private void getMetricInfos(String metric, Model model) {
String promQL = ""; String promQL = "";
if(!StringUtils.isEmpty(prometheusInstance)){ if (!StrUtil.isEmpty(prometheusInstance)) {
promQL = "{application=\""+name+"\",instance=\""+prometheusInstance+"\"}"; promQL = "{application=\"" + name + "\",instance=\"" + prometheusInstance + "\"}";
} else { } else {
promQL = "{application=\""+name+"\"}"; promQL = "{application=\"" + name + "\"}";
} }
if(!StringUtils.isEmpty(prometheusUrl)){ if (!StrUtil.isEmpty(prometheusUrl)) {
List<PromResultInfo> promResultInfos = service.getMetricInfo(prometheusUrl.concat(ProjectConstants.PROMETHEUS_QUERY_RANGE), promQL); List<PromResultInfo> promResultInfos = service.getMetricInfo(prometheusUrl.concat(ProjectConstants.PROMETHEUS_QUERY_RANGE), promQL);
for(PromResultInfo promResultInfo : promResultInfos){ for (PromResultInfo promResultInfo : promResultInfos) {
String metricName = promResultInfo.getMetric().get__name__(); String metricName = promResultInfo.getMetric().get__name__();
if(!Objects.isNull(metricName)){ if (!Objects.isNull(metricName)) {
if(metricName.contains(metric)){ if (metricName.contains(metric)) {
String metricValues = StringEscapeUtils.unescapeJava(JSON.toJSONString(promResultInfo.getValues())); String metricValues = EscapeUtil.unescape(JSON.toJSONString(promResultInfo.getValues()));
model.addAttribute(metricName, metricValues.replace("\"","")); model.addAttribute(metricName, metricValues.replace("\"", ""));
} }
} }
} }
} }
} }
} }

View File

@ -12,12 +12,14 @@ import java.util.List;
*/ */
@Data @Data
public class PromDataInfo { public class PromDataInfo {
/** /**
* prometheus * prometheus:
* vector-- * <p>
* matrix-- * vector --
* scalar-- * matrix --
* string-- * scalar --
* string --
*/ */
private String resultType; private String resultType;
@ -25,4 +27,5 @@ public class PromDataInfo {
* prometheus * prometheus
*/ */
private List<PromResultInfo> result; private List<PromResultInfo> result;
} }

View File

@ -25,5 +25,6 @@ public class PromMetricInfo {
* prometheus * prometheus
*/ */
private String job; private String job;
} }

View File

@ -9,11 +9,12 @@ import lombok.Data;
* @date 2021/1/10 19:00 * @date 2021/1/10 19:00
*/ */
@Data @Data
public class PromResponceInfo { public class PromResponseInfo {
/** /**
* * :
* -- success * <p>
* -success
*/ */
private String status; private String status;
@ -21,4 +22,5 @@ public class PromResponceInfo {
* prometheus * prometheus
*/ */
private PromDataInfo data; private PromDataInfo data;
} }

View File

@ -3,11 +3,14 @@ package cn.stylefeng.guns.modular.system.model;
import lombok.Data; import lombok.Data;
/** /**
* prometheus
*
* @author chenli * @author chenli
* @date 2021/1/10 18:58 * @date 2021/1/10 18:58
*/ */
@Data @Data
public class PromResultInfo { public class PromResultInfo {
/** /**
* prometheus * prometheus
*/ */

View File

@ -15,11 +15,12 @@ public interface MetricService {
/** /**
* prometheus * prometheus
* *
* @param promURL prometheus * @param promURL prometheus
* @param promQL prometheus * @param promQL prometheus
* @return Map<String, Object> * @return Map<String, Object>
* @author chenli * @author chenli
* @date 2021/1/10 17:37 * @date 2021/1/10 17:37
*/ */
List<PromResultInfo> getMetricInfo(String promURL, String promQL); List<PromResultInfo> getMetricInfo(String promURL, String promQL);
} }

View File

@ -2,19 +2,14 @@ package cn.stylefeng.guns.modular.system.service.impl;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.stylefeng.guns.core.consts.ProjectConstants; import cn.stylefeng.guns.core.consts.ProjectConstants;
import cn.stylefeng.guns.core.exception.BusinessException; import cn.stylefeng.guns.modular.system.model.PromResponseInfo;
import cn.stylefeng.guns.modular.system.model.PromResponceInfo;
import cn.stylefeng.guns.modular.system.model.PromResultInfo; import cn.stylefeng.guns.modular.system.model.PromResultInfo;
import cn.stylefeng.guns.modular.system.service.MetricService; import cn.stylefeng.guns.modular.system.service.MetricService;
import com.alibaba.excel.util.StringUtils; import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Calendar; import java.util.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* prometheus * prometheus
@ -34,17 +29,25 @@ public class MetricServiceImpl implements MetricService {
@Override @Override
public List<PromResultInfo> getMetricInfo(String promURL, String promQL) { public List<PromResultInfo> getMetricInfo(String promURL, String promQL) {
Map<String, Object> paramMap = new HashMap<>(); Map<String, Object> paramMap = new HashMap<>();
// prometheus查询命令
paramMap.put(ProjectConstants.PROMETHEUS_QUERY, promQL); paramMap.put(ProjectConstants.PROMETHEUS_QUERY, promQL);
Calendar calendar = Calendar.getInstance();
// 查询5分钟数据 // 查询5分钟数据
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) - 5); calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) - 5);
// 查询开始时间 // 查询开始时间
paramMap.put(ProjectConstants.PROMETHEUS_START, (calendar.getTime().getTime())/1000L); paramMap.put(ProjectConstants.PROMETHEUS_START, (calendar.getTime().getTime()) / 1000L);
// 查询结束时间 // 查询结束时间
paramMap.put(ProjectConstants.PROMETHEUS_END, (new Date().getTime())/1000L); paramMap.put(ProjectConstants.PROMETHEUS_END, (new Date().getTime()) / 1000L);
// 查询步长 // 查询步长
paramMap.put(ProjectConstants.PROMETHEUS_STEP,15); paramMap.put(ProjectConstants.PROMETHEUS_STEP, 15);
PromResponceInfo responseInfo = JSON.parseObject(HttpUtil.get(promURL, paramMap), PromResponceInfo.class);
// 获取查询结果
PromResponseInfo responseInfo = JSON.parseObject(HttpUtil.get(promURL, paramMap), PromResponseInfo.class);
if (StringUtils.isEmpty(responseInfo)) { if (StringUtils.isEmpty(responseInfo)) {
// prometheus未开启 // prometheus未开启
return null; return null;
@ -55,4 +58,5 @@ public class MetricServiceImpl implements MetricService {
} }
return responseInfo.getData().getResult(); return responseInfo.getData().getResult();
} }
} }

View File

@ -178,4 +178,5 @@ public class SystemHardwareWrapper {
return String.format("%d B", size); return String.format("%d B", size);
} }
} }
} }

View File

@ -42,13 +42,14 @@ mybatis-plus:
cache-enabled: true cache-enabled: true
lazy-loading-enabled: true lazy-loading-enabled: true
multiple-result-sets-enabled: true multiple-result-sets-enabled: true
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config: global-config:
banner: false banner: false
enable-sql-runner: true enable-sql-runner: true
db-config: db-config:
id-type: assign_id id-type: assign_id
table-underline: true table-underline: true
# prometheus监控 # prometheus监控
management: management:
endpoints: endpoints:

View File

@ -2,7 +2,7 @@
* 高频方法集 * 高频方法集
* *
* @author fengshuonan * @author fengshuonan
* @Date 2019/7/29 21:20 * @date 2019/7/29 21:20
*/ */
layui.define(['jquery', 'layer', 'admin', 'table'], function (exports) { layui.define(['jquery', 'layer', 'admin', 'table'], function (exports) {
var $ = layui.$; var $ = layui.$;