浏览代码

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

tomsun28 4 年之前
父节点
当前提交
7df74fc482

+ 26 - 12
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,
     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());
-            return;
+            builder.setMsg(errorMsg);
         } 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) {

+ 1 - 1
collector/src/main/java/com/usthe/collector/dispatch/MetricsCollect.java

@@ -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);
                 }
                 }
             }
             }
         }
         }

+ 5 - 4
manager/src/main/resources/define/param/api.yml

@@ -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
-    required: true
+    limit: 200
+    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

+ 5 - 5
manager/src/main/resources/define/param/website.yml

@@ -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
-    required: true
-    placeholder: '请输入网站地址,例如:/index.html'
+    limit: 200
+    required: false
+    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