[manager,collector]fix HTTP协议采集PATH空导致NPE,更新api website 监控入参显示

This commit is contained in:
tomsun28
2022-02-09 10:43:08 +08:00
parent ff50e46192
commit 7df74fc482
4 changed files with 37 additions and 22 deletions

View File

@@ -58,10 +58,12 @@ public class HttpCollectImpl extends AbstractCollect {
public void collect(CollectRep.MetricsData.Builder builder, public void collect(CollectRep.MetricsData.Builder builder,
long appId, String app, Metrics metrics) { long appId, String app, Metrics metrics) {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
// 简单校验必有参数 // 校验参数
if (metrics == null || metrics.getHttp() == null) { try {
validateParams(metrics);
} catch (Exception e) {
builder.setCode(CollectRep.Code.FAIL); builder.setCode(CollectRep.Code.FAIL);
builder.setMsg("Http/Https collect must has http params"); builder.setMsg(e.getMessage());
return; return;
} }
HttpContext httpContext = createHttpContext(metrics.getHttp()); HttpContext httpContext = createHttpContext(metrics.getHttp());
@@ -103,38 +105,38 @@ public class HttpCollectImpl extends AbstractCollect {
log.info("parse error: {}.", e.getMessage(), e); log.info("parse error: {}.", e.getMessage(), e);
builder.setCode(CollectRep.Code.FAIL); builder.setCode(CollectRep.Code.FAIL);
builder.setMsg("parse response data error:" + e.getMessage()); builder.setMsg("parse response data error:" + e.getMessage());
return;
} }
} }
} catch (ClientProtocolException e1) { } catch (ClientProtocolException e1) {
log.error(e1.getCause().getMessage(), e1); String errorMsg;
if (e1.getCause() != null) {
errorMsg = e1.getCause().getMessage();
} else {
errorMsg = e1.getMessage();
}
log.error(errorMsg);
builder.setCode(CollectRep.Code.UN_CONNECTABLE); builder.setCode(CollectRep.Code.UN_CONNECTABLE);
builder.setMsg(e1.getCause().getMessage()); builder.setMsg(errorMsg);
return;
} catch (UnknownHostException e2) { } catch (UnknownHostException e2) {
// 对端不可达 // 对端不可达
log.info(e2.getMessage()); log.info(e2.getMessage());
builder.setCode(CollectRep.Code.UN_REACHABLE); builder.setCode(CollectRep.Code.UN_REACHABLE);
builder.setMsg("unknown host"); builder.setMsg("unknown host");
return;
} catch (InterruptedIOException | ConnectException | SSLException e3) { } catch (InterruptedIOException | ConnectException | SSLException e3) {
// 对端连接失败 // 对端连接失败
log.info(e3.getMessage()); log.info(e3.getMessage());
builder.setCode(CollectRep.Code.UN_CONNECTABLE); builder.setCode(CollectRep.Code.UN_CONNECTABLE);
builder.setMsg(e3.getMessage()); builder.setMsg(e3.getMessage());
return;
} catch (IOException e4) { } catch (IOException e4) {
// 其它IO异常 // 其它IO异常
log.info(e4.getMessage()); log.info(e4.getMessage());
builder.setCode(CollectRep.Code.FAIL); builder.setCode(CollectRep.Code.FAIL);
builder.setMsg(e4.getMessage()); builder.setMsg(e4.getMessage());
return;
} catch (Exception e) { } catch (Exception e) {
// 其它异常 // 其它异常
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
builder.setCode(CollectRep.Code.FAIL); builder.setCode(CollectRep.Code.FAIL);
builder.setMsg(e.getMessage()); builder.setMsg(e.getMessage());
return;
} finally { } finally {
if (request != null) { if (request != null) {
request.abort(); request.abort();
@@ -142,6 +144,18 @@ public class HttpCollectImpl extends AbstractCollect {
} }
} }
private void validateParams(Metrics metrics) throws Exception {
if (metrics == null || metrics.getHttp() == null) {
throw new Exception("Http/Https collect must has http params");
}
HttpProtocol httpProtocol = metrics.getHttp();
if (httpProtocol.getUrl() == null
|| "".equals(httpProtocol.getUrl())
|| !httpProtocol.getUrl().startsWith("/")) {
httpProtocol.setUrl(httpProtocol.getUrl() == null ? "/" : "/" + httpProtocol.getUrl().trim());
}
}
private void parseResponseByWebsite(String resp, List<String> aliasFields, private void parseResponseByWebsite(String resp, List<String> aliasFields,
CollectRep.MetricsData.Builder builder, Long responseTime) { CollectRep.MetricsData.Builder builder, Long responseTime) {
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder(); CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
@@ -162,7 +176,7 @@ public class HttpCollectImpl extends AbstractCollect {
private void parseResponseByJsonPath(String resp, List<String> aliasFields, HttpProtocol http, private void parseResponseByJsonPath(String resp, List<String> aliasFields, HttpProtocol http,
CollectRep.MetricsData.Builder builder, Long responseTime) { CollectRep.MetricsData.Builder builder, Long responseTime) {
List<Map<String, Object>> results = JsonPathParser.parseContentWithJsonPath(resp,http. getParseScript()); List<Map<String, Object>> results = JsonPathParser.parseContentWithJsonPath(resp, http.getParseScript());
for (Map<String, Object> stringMap : results) { for (Map<String, Object> stringMap : results) {
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder(); CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
for (String alias : aliasFields) { for (String alias : aliasFields) {

View File

@@ -132,7 +132,7 @@ public class MetricsCollect implements Runnable, Comparable<MetricsCollect> {
log.error("[Metrics Collect]: {}.", msg, e); log.error("[Metrics Collect]: {}.", msg, e);
response.setCode(CollectRep.Code.FAIL); response.setCode(CollectRep.Code.FAIL);
if (msg != null) { if (msg != null) {
response.setMsg(e.getMessage()); response.setMsg(msg);
} }
} }
} }

View File

@@ -17,11 +17,12 @@ param:
range: '[0,65535]' range: '[0,65535]'
required: true required: true
- field: uri - field: uri
name: URI路径 name: 相对路径
type: text type: text
# 当type为text时,用limit表示字符串限制大小 # 当type为text时,用limit表示字符串限制大小
limit: 100 limit: 200
required: true required: false
placeholder: 'API地址除IP端口外的路径 例如:/v2/book/bar'
- field: method - field: method
name: 请求方式 name: 请求方式
type: radio type: radio
@@ -47,7 +48,7 @@ param:
type: password type: password
required: false required: false
- field: ssl - field: ssl
name: 开启SSL name: 启用HTTPS
# 当type为boolean时,前端用switch展示开关 # 当type为boolean时,前端用switch展示开关
type: boolean type: boolean
required: true required: true

View File

@@ -18,14 +18,14 @@ param:
required: true required: true
defaultValue: 80 defaultValue: 80
- field: uri - field: uri
name: 网站路径 name: 相对路径
type: text type: text
# 当type为text时,用limit表示字符串限制大小 # 当type为text时,用limit表示字符串限制大小
limit: 100 limit: 200
required: true required: false
placeholder: '请输入网站地址,例如:/index.html' placeholder: '网站地址除IP端口外的路径 例如:/console'
- field: ssl - field: ssl
name: 开启SSL name: 启用HTTPS
# 当type为boolean时,前端用switch展示开关 # 当type为boolean时,前端用switch展示开关
type: boolean type: boolean
required: true required: true