[monitor] 支持PING监控类型

This commit is contained in:
tomsun28
2021-12-04 15:38:59 +08:00
parent 647f972110
commit 4041c83a99
10 changed files with 160 additions and 11 deletions

View File

@@ -74,7 +74,7 @@ public class HttpCollectImpl extends AbstractCollect {
if (statusCode < HttpStatus.SC_OK || statusCode >= HttpStatus.SC_BAD_REQUEST) {
// 1XX 3XX 4XX 5XX 状态码 失败
builder.setCode(CollectRep.Code.FAIL);
builder.setMsg("statusCode: " + statusCode);
builder.setMsg("StatusCode " + statusCode);
return;
} else {
// 2xx 状态码 成功

View File

@@ -0,0 +1,86 @@
package com.usthe.collector.collect.icmp;
import com.usthe.collector.collect.AbstractCollect;
import com.usthe.collector.util.CollectorConstants;
import com.usthe.common.entity.job.Metrics;
import com.usthe.common.entity.job.protocol.IcmpProtocol;
import com.usthe.common.entity.message.CollectRep;
import com.usthe.common.util.CommonConstants;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* icmp协议采集实现 - ping
* @author tom
* @date 2021/12/4 12:32
*/
@Slf4j
public class IcmpCollectImpl extends AbstractCollect {
private IcmpCollectImpl(){}
public static IcmpCollectImpl getInstance() {
return IcmpCollectImpl.Singleton.INSTANCE;
}
@Override
public void collect(CollectRep.MetricsData.Builder builder, long appId, String app, Metrics metrics) {
long startTime = System.currentTimeMillis();
// 简单校验必有参数
if (metrics == null || metrics.getIcmp() == null) {
builder.setCode(CollectRep.Code.FAIL);
builder.setMsg("ICMP collect must has icmp params");
return;
}
IcmpProtocol icmp = metrics.getIcmp();
// 超时时间默认300毫秒
int timeout = 300;
try {
timeout = Integer.parseInt(metrics.getIcmp().getTimeout());
} catch (Exception e) {
log.warn(e.getMessage());
}
try {
// todo 需要配置java虚拟机root权限从而使用ICMP否则是判断telnet对端7号端口是否开通
// https://stackoverflow.com/questions/11506321/how-to-ping-an-ip-address
boolean status = InetAddress.getByName(icmp.getHost()).isReachable(timeout);
long responseTime = System.currentTimeMillis() - startTime;
if (status) {
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
for (String alias : metrics.getAliasFields()) {
if (CollectorConstants.RESPONSE_TIME.equalsIgnoreCase(alias)) {
valueRowBuilder.addColumns(Long.toString(responseTime));
} else {
valueRowBuilder.addColumns(CommonConstants.NULL_VALUE);
}
}
builder.addValues(valueRowBuilder.build());
} else {
builder.setCode(CollectRep.Code.UN_REACHABLE);
builder.setMsg("对端不可达Timeout " + timeout + "ms");
return;
}
} catch (UnknownHostException unknownHostException) {
builder.setCode(CollectRep.Code.UN_REACHABLE);
builder.setMsg("UnknownHost " + unknownHostException.getMessage());
return;
} catch (IOException ioException) {
builder.setCode(CollectRep.Code.UN_REACHABLE);
builder.setMsg("IOException " + ioException.getMessage());
return;
} catch (Exception e) {
log.error(e.getMessage(), e);
builder.setCode(CollectRep.Code.FAIL);
builder.setMsg("IllegalArgument " + e.getMessage());
}
}
private static class Singleton {
private static final IcmpCollectImpl INSTANCE = new IcmpCollectImpl();
}
}

View File

@@ -4,6 +4,7 @@ import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import com.usthe.collector.collect.AbstractCollect;
import com.usthe.collector.collect.http.HttpCollectImpl;
import com.usthe.collector.collect.icmp.IcmpCollectImpl;
import com.usthe.collector.dispatch.timer.Timeout;
import com.usthe.collector.dispatch.timer.WheelTimerTask;
import com.usthe.common.entity.job.Job;
@@ -98,6 +99,8 @@ public class MetricsCollect implements Runnable, Comparable<MetricsCollect> {
case DispatchConstants.PROTOCOL_HTTP:
abstractCollect = HttpCollectImpl.getInstance();
break;
case DispatchConstants.PROTOCOL_ICMP:
abstractCollect = IcmpCollectImpl.getInstance();
// todo
default: break;
}