package cc.mrbird.febs.monitor.helper;
|
|
import cc.mrbird.febs.common.annotation.Helper;
|
import cc.mrbird.febs.common.utils.DateUtil;
|
import cc.mrbird.febs.monitor.endpoint.FebsMetricsEndpoint;
|
import cc.mrbird.febs.monitor.entity.JvmInfo;
|
import cc.mrbird.febs.monitor.entity.ServerInfo;
|
import cc.mrbird.febs.monitor.entity.TomcatInfo;
|
import com.google.common.base.Predicates;
|
import lombok.RequiredArgsConstructor;
|
import org.apache.commons.lang3.StringUtils;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.text.NumberFormat;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Set;
|
import java.util.stream.Collectors;
|
|
import static cc.mrbird.febs.monitor.endpoint.FebsMetricsEndpoint.FebsMetricResponse;
|
import static cc.mrbird.febs.monitor.endpoint.FebsMetricsEndpoint.Sample;
|
|
/**
|
* @author MrBird
|
*/
|
@Helper
|
@RequiredArgsConstructor
|
public class FebsActuatorHelper {
|
|
private static final BigDecimal DECIMAL = new BigDecimal("1048576");
|
|
private final FebsMetricsEndpoint metricsEndpoint;
|
|
public List<FebsMetricResponse> getMetricResponseByType(String type) {
|
FebsMetricsEndpoint.ListNamesResponse listNames = metricsEndpoint.listNames();
|
Set<String> names = listNames.getNames();
|
Iterable<String> jvm = names.stream()
|
.filter(Predicates.containsPattern(type)::apply)
|
.collect(Collectors.toList());
|
List<FebsMetricResponse> metricResponseList = new ArrayList<>();
|
jvm.forEach(s -> {
|
FebsMetricResponse metric = metricsEndpoint.metric(s, null);
|
metricResponseList.add(metric);
|
});
|
return metricResponseList;
|
}
|
|
public JvmInfo getJvmInfoFromMetricData(List<FebsMetricResponse> metrics) {
|
JvmInfo jvmInfo = new JvmInfo();
|
metrics.forEach(d -> {
|
String name = d.getName();
|
Sample sample = d.getMeasurements().get(0);
|
Double value = sample.getValue();
|
switch (name) {
|
case "jvm.memory.max":
|
jvmInfo.setJvmMemoryMax(convertToMb(value));
|
break;
|
case "jvm.memory.committed":
|
jvmInfo.setJvmMemoryCommitted(convertToMb(value));
|
break;
|
case "jvm.memory.used":
|
jvmInfo.setJvmMemoryUsed(convertToMb(value));
|
break;
|
case "jvm.buffer.memory.used":
|
jvmInfo.setJvmBufferMemoryUsed(convertToMb(value));
|
break;
|
case "jvm.buffer.count":
|
jvmInfo.setJvmBufferCount(value);
|
break;
|
case "jvm.threads.daemon":
|
jvmInfo.setJvmThreadsdaemon(value);
|
break;
|
case "jvm.threads.live":
|
jvmInfo.setJvmThreadsLive(value);
|
break;
|
case "jvm.threads.peak":
|
jvmInfo.setJvmThreadsPeak(value);
|
break;
|
case "jvm.classes.loaded":
|
jvmInfo.setJvmClassesLoaded(value);
|
break;
|
case "jvm.classes.unloaded":
|
jvmInfo.setJvmClassesUnloaded(value);
|
break;
|
case "jvm.gc.memory.allocated":
|
jvmInfo.setJvmGcMemoryAllocated(convertToMb(value));
|
break;
|
case "jvm.gc.memory.promoted":
|
jvmInfo.setJvmGcMemoryPromoted(convertToMb(value));
|
break;
|
case "jvm.gc.max.data.size":
|
jvmInfo.setJvmGcMaxDataSize(convertToMb(value));
|
break;
|
case "jvm.gc.live.data.size":
|
jvmInfo.setJvmGcLiveDataSize(convertToMb(value));
|
break;
|
default:
|
}
|
});
|
return jvmInfo;
|
}
|
|
public TomcatInfo getTomcatInfoFromMetricData(List<FebsMetricResponse> metrics) {
|
TomcatInfo tomcatInfo = new TomcatInfo();
|
metrics.forEach(d -> {
|
String name = d.getName();
|
Sample sample = d.getMeasurements().get(0);
|
Double value = sample.getValue();
|
switch (name) {
|
case "tomcat.sessions.created":
|
tomcatInfo.setTomcatSessionsCreated(value);
|
break;
|
case "tomcat.sessions.expired":
|
tomcatInfo.setTomcatSessionsExpired(value);
|
break;
|
case "tomcat.sessions.active.current":
|
tomcatInfo.setTomcatSessionsActiveCurrent(value);
|
break;
|
case "tomcat.sessions.active.max":
|
tomcatInfo.setTomcatSessionsActiveMax(value);
|
break;
|
case "tomcat.sessions.rejected":
|
tomcatInfo.setTomcatSessionsRejected(value);
|
break;
|
case "tomcat.global.error":
|
tomcatInfo.setTomcatGlobalError(value);
|
break;
|
case "tomcat.global.sent":
|
tomcatInfo.setTomcatGlobalSent(value);
|
break;
|
case "tomcat.global.request.max":
|
tomcatInfo.setTomcatGlobalRequestMax(value);
|
break;
|
case "tomcat.threads.current":
|
tomcatInfo.setTomcatThreadsCurrent(value);
|
break;
|
case "tomcat.threads.config.max":
|
tomcatInfo.setTomcatThreadsConfigMax(value);
|
break;
|
case "tomcat.threads.busy":
|
tomcatInfo.setTomcatThreadsBusy(value);
|
break;
|
default:
|
}
|
});
|
return tomcatInfo;
|
}
|
|
public ServerInfo getServerInfoFromMetricData(List<FebsMetricResponse> jdbcInfo,
|
List<FebsMetricResponse> systemInfo,
|
List<FebsMetricResponse> processInfo) {
|
ServerInfo serverInfo = new ServerInfo();
|
jdbcInfo.forEach(j -> {
|
String name = j.getName();
|
Sample sample = j.getMeasurements().get(0);
|
Double value = sample.getValue();
|
switch (name) {
|
case "jdbc.connections.active":
|
serverInfo.setJdbcConnectionsActive(value);
|
break;
|
case "jdbc.connections.max":
|
serverInfo.setJdbcConnectionsMax(value);
|
break;
|
case "jdbc.connections.min":
|
serverInfo.setJdbcConnectionsMin(value);
|
break;
|
default:
|
}
|
});
|
systemInfo.forEach(s -> {
|
String name = s.getName();
|
Sample sample = s.getMeasurements().get(0);
|
Double value = sample.getValue();
|
switch (name) {
|
case "system.cpu.count":
|
serverInfo.setSystemCpuCount(value);
|
break;
|
case "system.cpu.usage":
|
serverInfo.setSystemCpuUsage(value);
|
break;
|
default:
|
}
|
});
|
processInfo.forEach(p -> {
|
String name = p.getName();
|
Sample sample = p.getMeasurements().get(0);
|
Double value = sample.getValue();
|
switch (name) {
|
case "process.cpu.usage":
|
serverInfo.setProcessCpuUsage(value);
|
break;
|
case "process.uptime":
|
serverInfo.setProcessUptime(value);
|
break;
|
case "process.start.time":
|
NumberFormat numberFormat = NumberFormat.getInstance();
|
numberFormat.setMaximumFractionDigits(20);
|
numberFormat.setGroupingUsed(false);
|
long timeMillis = Long.parseLong(StringUtils.replace(numberFormat.format(value), ".", ""));
|
String startTime = DateUtil.getDateFormat(new Date(timeMillis), DateUtil.FULL_TIME_SPLIT_PATTERN);
|
serverInfo.setProcessStartTime(startTime);
|
default:
|
}
|
});
|
return serverInfo;
|
}
|
|
private static Double convertToMb(Object value) {
|
return new BigDecimal(String.valueOf(value))
|
.divide(DECIMAL, 3, RoundingMode.HALF_UP).doubleValue();
|
}
|
}
|