From 7df74fc4823c08be44627c76a383bcc7bd6da5e1 Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Wed, 9 Feb 2022 10:43:08 +0800 Subject: [PATCH] =?UTF-8?q?[manager,collector]fix=20HTTP=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E9=87=87=E9=9B=86PATH=E7=A9=BA=E5=AF=BC=E8=87=B4NPE=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0api=20website=20=E7=9B=91=E6=8E=A7=E5=85=A5?= =?UTF-8?q?=E5=8F=82=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collect/http/HttpCollectImpl.java | 38 +++++++++++++------ .../collector/dispatch/MetricsCollect.java | 2 +- .../src/main/resources/define/param/api.yml | 9 +++-- .../main/resources/define/param/website.yml | 10 ++--- 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/collector/src/main/java/com/usthe/collector/collect/http/HttpCollectImpl.java b/collector/src/main/java/com/usthe/collector/collect/http/HttpCollectImpl.java index 8174605..0346788 100644 --- a/collector/src/main/java/com/usthe/collector/collect/http/HttpCollectImpl.java +++ b/collector/src/main/java/com/usthe/collector/collect/http/HttpCollectImpl.java @@ -58,10 +58,12 @@ public class HttpCollectImpl extends AbstractCollect { public void collect(CollectRep.MetricsData.Builder builder, long appId, String app, Metrics metrics) { long startTime = System.currentTimeMillis(); - // 简单校验必有参数 - if (metrics == null || metrics.getHttp() == null) { + // 校验参数 + try { + validateParams(metrics); + } catch (Exception e) { builder.setCode(CollectRep.Code.FAIL); - builder.setMsg("Http/Https collect must has http params"); + builder.setMsg(e.getMessage()); return; } HttpContext httpContext = createHttpContext(metrics.getHttp()); @@ -103,38 +105,38 @@ public class HttpCollectImpl extends AbstractCollect { log.info("parse error: {}.", e.getMessage(), e); builder.setCode(CollectRep.Code.FAIL); builder.setMsg("parse response data error:" + e.getMessage()); - return; } } } 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.setMsg(e1.getCause().getMessage()); - return; + builder.setMsg(errorMsg); } catch (UnknownHostException e2) { // 对端不可达 log.info(e2.getMessage()); builder.setCode(CollectRep.Code.UN_REACHABLE); builder.setMsg("unknown host"); - return; } catch (InterruptedIOException | ConnectException | SSLException e3) { // 对端连接失败 log.info(e3.getMessage()); builder.setCode(CollectRep.Code.UN_CONNECTABLE); builder.setMsg(e3.getMessage()); - return; } catch (IOException e4) { // 其它IO异常 log.info(e4.getMessage()); builder.setCode(CollectRep.Code.FAIL); builder.setMsg(e4.getMessage()); - return; } catch (Exception e) { // 其它异常 log.error(e.getMessage(), e); builder.setCode(CollectRep.Code.FAIL); builder.setMsg(e.getMessage()); - return; } finally { if (request != null) { 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 aliasFields, CollectRep.MetricsData.Builder builder, Long responseTime) { CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder(); @@ -162,7 +176,7 @@ public class HttpCollectImpl extends AbstractCollect { private void parseResponseByJsonPath(String resp, List aliasFields, HttpProtocol http, CollectRep.MetricsData.Builder builder, Long responseTime) { - List> results = JsonPathParser.parseContentWithJsonPath(resp,http. getParseScript()); + List> results = JsonPathParser.parseContentWithJsonPath(resp, http.getParseScript()); for (Map stringMap : results) { CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder(); for (String alias : aliasFields) { diff --git a/collector/src/main/java/com/usthe/collector/dispatch/MetricsCollect.java b/collector/src/main/java/com/usthe/collector/dispatch/MetricsCollect.java index ab19586..c13e0f5 100644 --- a/collector/src/main/java/com/usthe/collector/dispatch/MetricsCollect.java +++ b/collector/src/main/java/com/usthe/collector/dispatch/MetricsCollect.java @@ -132,7 +132,7 @@ public class MetricsCollect implements Runnable, Comparable { log.error("[Metrics Collect]: {}.", msg, e); response.setCode(CollectRep.Code.FAIL); if (msg != null) { - response.setMsg(e.getMessage()); + response.setMsg(msg); } } } diff --git a/manager/src/main/resources/define/param/api.yml b/manager/src/main/resources/define/param/api.yml index 611e898..38a50d2 100644 --- a/manager/src/main/resources/define/param/api.yml +++ b/manager/src/main/resources/define/param/api.yml @@ -17,11 +17,12 @@ param: range: '[0,65535]' required: true - field: uri - name: URI路径 + name: 相对路径 type: text # 当type为text时,用limit表示字符串限制大小 - limit: 100 - required: true + limit: 200 + required: false + placeholder: 'API地址除IP端口外的路径 例如:/v2/book/bar' - field: method name: 请求方式 type: radio @@ -47,7 +48,7 @@ param: type: password required: false - field: ssl - name: 开启SSL + name: 启用HTTPS # 当type为boolean时,前端用switch展示开关 type: boolean required: true diff --git a/manager/src/main/resources/define/param/website.yml b/manager/src/main/resources/define/param/website.yml index 4a4fef5..76b7945 100644 --- a/manager/src/main/resources/define/param/website.yml +++ b/manager/src/main/resources/define/param/website.yml @@ -18,14 +18,14 @@ param: required: true defaultValue: 80 - field: uri - name: 网站路径 + name: 相对路径 type: text # 当type为text时,用limit表示字符串限制大小 - limit: 100 - required: true - placeholder: '请输入网站地址,例如:/index.html' + limit: 200 + required: false + placeholder: '网站地址除IP端口外的路径 例如:/console' - field: ssl - name: 开启SSL + name: 启用HTTPS # 当type为boolean时,前端用switch展示开关 type: boolean required: true \ No newline at end of file