Преглед на файлове

更新 search-service 的 log 包

reghao преди 2 месеца
родител
ревизия
72fb3cba61

+ 41 - 26
search/search-service/src/main/java/cn/reghao/tnb/search/app/es/SearchService.java

@@ -98,7 +98,7 @@ public class SearchService {
      * @date 2025-12-25 15:54:34
      */
     public List<NginxLog> searchByPage(String indexName, int pageSize, int pageNumber,
-                                       Query query, String sortField, SortOrder sortOrder) throws IOException {
+                                       Query query, String sortField, SortOrder sortOrder) {
         int start = (pageNumber-1)*pageSize;
         SearchRequest searchRequest = SearchRequest.of(s -> s
                 .index(indexName)
@@ -109,17 +109,22 @@ public class SearchService {
                 .sort(f -> f.field(o -> o.field(sortField).order(sortOrder)))
         );
 
-        SearchResponse<NginxLog> searchResponse = esClient.search(searchRequest, NginxLog.class);
-        HitsMetadata<NginxLog> hitsMetadata = searchResponse.hits();
-        //得到总数
-        TotalHits totalHits = hitsMetadata.total();
-        long total = totalHits.value();
-        Double maxScore = hitsMetadata.maxScore();
-        //拿到匹配的数据
-        List<Hit<NginxLog>> hits = hitsMetadata.hits();
-        //拿到_source中的数据
-        List<NginxLog> nginxLogs = hits.stream().map(Hit::source).collect(Collectors.toList());
-        return nginxLogs;
+        try {
+            SearchResponse<NginxLog> searchResponse = esClient.search(searchRequest, NginxLog.class);
+            HitsMetadata<NginxLog> hitsMetadata = searchResponse.hits();
+            //得到总数
+            TotalHits totalHits = hitsMetadata.total();
+            long total = totalHits.value();
+            Double maxScore = hitsMetadata.maxScore();
+            //拿到匹配的数据
+            List<Hit<NginxLog>> hits = hitsMetadata.hits();
+            //拿到_source中的数据
+            List<NginxLog> nginxLogs = hits.stream().map(Hit::source).collect(Collectors.toList());
+            return nginxLogs;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return Collections.emptyList();
     }
 
     public void searchAll(String indexName) throws IOException {
@@ -266,7 +271,7 @@ public class SearchService {
      * @return 日期 -> 每日访问量
      * @date 2025-12-25 17:23:04
      */
-    public Map<String, Long> aggregateByDay(String index, String aggregateField, Query query) throws Exception {
+    public Map<String, Long> aggregateByDay(String index, String aggregateField, Query query) {
         SearchRequest searchRequest = new SearchRequest.Builder()
                 .index(index)
                 .size(0)
@@ -275,13 +280,18 @@ public class SearchService {
                 .aggregations("agg1", a->a.dateHistogram(t -> t.field(aggregateField)
                         .calendarInterval(CalendarInterval.Day).timeZone(timeZone).minDocCount(0)))
                 .build();
+        try {
+            SearchResponse<NginxLog> searchResponse = esClient.search(searchRequest, NginxLog.class);
+            TotalHits totalHits = searchResponse.hits().total();
+            long total = totalHits.value();
+            Map<String, Aggregate> resultMap = searchResponse.aggregations();
+            Map<String, Long> map = getAggregateMap(aggregateField, resultMap);
+            return map;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
 
-        SearchResponse<NginxLog> searchResponse = esClient.search(searchRequest, NginxLog.class);
-        TotalHits totalHits = searchResponse.hits().total();
-        long total = totalHits.value();
-        Map<String, Aggregate> resultMap = searchResponse.aggregations();
-        Map<String, Long> map = getAggregateMap(aggregateField, resultMap);
-        return map;
+        return Collections.emptyMap();
     }
 
     /**
@@ -291,7 +301,7 @@ public class SearchService {
      * @return url -> 每日访问量
      * @date 2025-12-25 17:31:56
      */
-    public Map<String, Long> aggregateByQuery(String index, String aggregateField, Query query) throws Exception {
+    public Map<String, Long> aggregateByQuery(String index, String aggregateField, Query query) {
         int aggregateSize = 65535;
         SearchRequest searchRequest = new SearchRequest.Builder()
                 .index(index)
@@ -299,13 +309,18 @@ public class SearchService {
                 .query(query)
                 .aggregations("first_agg", a->a.terms(t->t.field(aggregateField).size(aggregateSize)))
                 .build();
+        try {
+            SearchResponse<NginxLog> searchResponse = esClient.search(searchRequest, NginxLog.class);
+            TotalHits totalHits = searchResponse.hits().total();
+            long total = totalHits.value();
+            Map<String, Aggregate> resultMap = searchResponse.aggregations();
+            Map<String, Long> map = getAggregateMap(aggregateField, resultMap);
+            return map;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
 
-        SearchResponse<NginxLog> searchResponse = esClient.search(searchRequest, NginxLog.class);
-        TotalHits totalHits = searchResponse.hits().total();
-        long total = totalHits.value();
-        Map<String, Aggregate> resultMap = searchResponse.aggregations();
-        Map<String, Long> map = getAggregateMap(aggregateField, resultMap);
-        return map;
+        return Collections.emptyMap();
     }
 
     private Map<String, Long> getAggregateMap(String aggregateField, Map<String, Aggregate> resultMap) {

+ 15 - 43
search/search-service/src/main/java/cn/reghao/tnb/search/app/log/controller/NginxLogController.java

@@ -2,8 +2,9 @@ package cn.reghao.tnb.search.app.log.controller;
 
 import cn.reghao.tnb.common.db.SelectOption;
 import cn.reghao.tnb.common.web.WebResult;
+import cn.reghao.tnb.search.app.log.model.dto.LogQuery;
 import cn.reghao.tnb.search.app.log.service.NginxLogService;
-import cn.reghao.tnb.search.app.log.model.dto.DateTimeRange;
+import cn.reghao.tnb.search.app.log.model.dto.DateTimeQuery;
 import cn.reghao.tnb.search.app.log.model.vo.ChartData;
 import cn.reghao.tnb.search.app.log.model.vo.ChartMap;
 import cn.reghao.tnb.search.app.log.model.vo.GroupCount;
@@ -43,72 +44,43 @@ public class NginxLogController {
 
     @Operation(summary = "不超过 24 小时", description = "N")
     @PostMapping(value = "/log2", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String nginxLog2(@RequestBody @Validated DateTimeRange dateTimeRange) throws Exception {
-        List<Object> chartData = nginxLogService.getNginxLog2(dateTimeRange);
-        return WebResult.success(chartData);
-    }
-
-    @Operation(summary = "指定日期的最近一周内 NginxLog 在每天的数量", description = "N")
-    @GetMapping(value = "/log/chart1", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getLogChart1(@RequestParam(value = "dateStr") String dateStr) throws Exception {
-        List<Object> chartData = nginxLogService.getChartData5(dateStr, "");
+    public String nginxLog2(@RequestBody @Validated DateTimeQuery dateTimeQuery) {
+        List<Object> chartData = nginxLogService.getNginxLog2(dateTimeQuery);
         return WebResult.success(chartData);
     }
 
     @Operation(summary = "指定日期和 url 的最近一周内 NginxLog 在每天的数量", description = "N")
     @GetMapping(value = "/log/chart5", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getLogChart5(@RequestParam(value = "dateStr") String dateStr,
-                               @RequestParam(value = "url") String url) throws Exception {
-        List<Object> chartData = nginxLogService.getChartData5(dateStr, url);
+    public String getLogChart5(@Validated DateTimeQuery dateTimeQuery) {
+        List<Object> chartData = nginxLogService.getChartData5(dateTimeQuery);
         return WebResult.success(chartData);
     }
 
     @Operation(summary = "指定 url 在某天内每秒的数量", description = "N")
     @GetMapping(value = "/log/chart2", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getLogChart2(@RequestParam(value = "dateStr") String dateStr,
-                               @RequestParam(value = "url") String url) throws Exception {
-        List<Object> chartData = nginxLogService.getChartData2(dateStr, url);
+    public String getLogChart2(@Validated LogQuery logQuery) {
+        List<Object> chartData = nginxLogService.getChartData2(logQuery);
         return WebResult.success(chartData);
     }
 
     @Operation(summary = "对指定字段在某天内进行聚合", description = "N")
     @GetMapping(value = "/log/chart3", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getLogChart3(@RequestParam(value = "dateStr") String dateStr,
-                               @RequestParam(value = "aggregateField") String aggregateField) throws Exception {
-        String aggregateField0;
-        if ("url".equals(aggregateField)) {
-            aggregateField0 = "methodUrl.raw";
-        } else if ("statusCode".equals(aggregateField)) {
-            aggregateField0 = "status";
-        } else if ("ip".equals(aggregateField)) {
-            aggregateField0 = "remoteAddr";
-        } else if ("userAgent".equals(aggregateField)) {
-            aggregateField0 = "httpUserAgent.raw";
-        } else {
-            return WebResult.failWithMsg("unknown aggregate type: " + aggregateField);
-        }
-
-        List<GroupCount> chartData = nginxLogService.getChartData3(aggregateField0, dateStr);
+    public String getLogChart3(@Validated LogQuery logQuery) {
+        List<GroupCount> chartData = nginxLogService.getChartData3(logQuery);
         return WebResult.success(chartData);
     }
 
     @Operation(summary = "获取 NginxLog 中耗时 TopN 的数据", description = "N")
     @GetMapping(value = "/log/chart4", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getLogChart4(@RequestParam(value = "dateStr") String dateStr) throws Exception {
-        List<ChartData> list = nginxLogService.getTopN(dateStr);
+    public String getLogChart4(@Validated LogQuery logQuery) {
+        List<ChartData> list = nginxLogService.getTopN(logQuery.getDateStr());
         return WebResult.success(list);
     }
 
     @Operation(summary = "获取 NginxLog 中根据访问 IP 得到的 echart 地图", description = "N")
     @GetMapping(value = "/log/chart6", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getLogChart6(@RequestParam(value = "dateStr") String dateStr,
-                               @RequestParam(value = "aggregateField") String aggregateField) throws Exception {
-        if ("ip".equals(aggregateField)) {
-            String aggregateField0 = "remoteAddr";
-            ChartMap chartMap = nginxLogService.getChartMap(aggregateField0, dateStr);
-            return WebResult.success(chartMap);
-        } else {
-            return WebResult.failWithMsg("");
-        }
+    public String getLogChart6(@Validated LogQuery logQuery) {
+        ChartMap chartMap = nginxLogService.getChartMap(logQuery);
+        return chartMap != null ? WebResult.success(chartMap) : WebResult.failWithMsg("");
     }
 }

+ 2 - 2
search/search-service/src/main/java/cn/reghao/tnb/search/app/log/model/dto/DateTimeRange.java → search/search-service/src/main/java/cn/reghao/tnb/search/app/log/model/dto/DateTimeQuery.java

@@ -2,7 +2,6 @@ package cn.reghao.tnb.search.app.log.model.dto;
 
 import cn.reghao.tnb.search.app.model.DateVerify;
 import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.Size;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
@@ -16,7 +15,7 @@ import lombok.Setter;
 @AllArgsConstructor
 @Setter
 @Getter
-public class DateTimeRange {
+public class DateTimeQuery {
     @NotBlank
     //@Size(min = 19, max = 19, message = "日期时间格式 yyyy-mm-dd hh:mm:ss")
     @DateVerify(dateFormat = "yyyy-MM-dd HH:mm:ss")
@@ -25,4 +24,5 @@ public class DateTimeRange {
     //@Size(min = 19, max = 19, message = "日期时间格式 yyyy-mm-dd hh:mm:ss")
     @DateVerify(dateFormat = "yyyy-MM-dd HH:mm:ss")
     private String end;
+    private String url;
 }

+ 24 - 0
search/search-service/src/main/java/cn/reghao/tnb/search/app/log/model/dto/LogQuery.java

@@ -0,0 +1,24 @@
+package cn.reghao.tnb.search.app.log.model.dto;
+
+import cn.reghao.tnb.search.app.model.DateVerify;
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2026-01-10 00:07:40
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Setter
+@Getter
+public class LogQuery {
+    @NotBlank
+    @DateVerify(dateFormat = "yyyy-MM-dd")
+    private String dateStr;
+    private String aggregateField;
+    private String url;
+}

+ 8 - 4
search/search-service/src/main/java/cn/reghao/tnb/search/app/log/service/NginxLogDocument.java

@@ -38,12 +38,16 @@ public class NginxLogDocument {
         }
     }
 
-    public void saveAll(String indexName, List<NginxLog> nginxLogs) throws IOException {
+    public void saveAll(String indexName, List<NginxLog> nginxLogs) {
         List<BulkOperation> bulkOperations = new ArrayList<>();
         nginxLogs.forEach(p -> bulkOperations.add(BulkOperation.of(b -> b.index(c -> c.id(p.getId()).document(p)))));
-        BulkResponse bulkResponse = esClient.bulk(s -> s.index(indexName).operations(bulkOperations));
-        if (bulkResponse.errors()) {
-            bulkResponse.items().forEach(b -> log.error("bulk response result = {}", b.result()));
+        try {
+            BulkResponse bulkResponse = esClient.bulk(s -> s.index(indexName).operations(bulkOperations));
+            if (bulkResponse.errors()) {
+                bulkResponse.items().forEach(b -> log.error("bulk response result = {}", b.result()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
         }
     }
 

+ 69 - 61
search/search-service/src/main/java/cn/reghao/tnb/search/app/log/service/NginxLogService.java

@@ -11,7 +11,8 @@ import cn.reghao.tnb.search.app.es.EsQuery;
 import cn.reghao.tnb.search.app.es.SearchService;
 import cn.reghao.tnb.search.app.log.geoip.GeoIpTool;
 import cn.reghao.tnb.search.app.log.geoip.Location;
-import cn.reghao.tnb.search.app.log.model.dto.DateTimeRange;
+import cn.reghao.tnb.search.app.log.model.dto.DateTimeQuery;
+import cn.reghao.tnb.search.app.log.model.dto.LogQuery;
 import cn.reghao.tnb.search.app.log.model.vo.ChartData;
 import cn.reghao.tnb.search.app.log.model.vo.ChartMap;
 import cn.reghao.tnb.search.app.log.model.vo.GroupCount;
@@ -23,9 +24,7 @@ import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.io.IOException;
 import java.time.Duration;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -69,48 +68,43 @@ public class NginxLogService {
             nginxLog.setMethodUrl(methodUrl);
             nginxLog.setId(idGenerator.nextId() + "");
         });
-
-        try {
-            nginxLogDocument.saveAll(indexName, list);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
+        nginxLogDocument.saveAll(indexName, list);
     }
 
     public List<SelectOption> getDateList() {
+        String aggregateField = "timeIso8601";
+        Query query = Query.of(q -> q.matchAll(m -> m));
+        Map<String, Long> groupMap = searchService.aggregateByDay(indexName, aggregateField, query);
+
+        Set<String> dateSet = groupMap.keySet();
+        return dateSet.stream()
+                .sorted(Comparator.reverseOrder())
+                .map(dateStr -> new SelectOption(dateStr, dateStr))
+                .collect(Collectors.toList());
+    }
+
+    public List<Object> getNginxLog2(DateTimeQuery dateTimeQuery) {
         try {
-            String aggregateField = "timeIso8601";
-            Query query = Query.of(q -> q.matchAll(m -> m));
-            Map<String, Long> groupMap = searchService.aggregateByDay(indexName, aggregateField, query);
-
-            Set<String> dateSet = groupMap.keySet();
-            return dateSet.stream()
-                    .sorted(Comparator.reverseOrder())
-                    .map(dateStr -> new SelectOption(dateStr, dateStr))
-                    .collect(Collectors.toList());
+            String start = dateTimeQuery.getStart();
+            LocalDateTime start1 = DateTimeConverter.localDateTime2(start);
+            String end = dateTimeQuery.getEnd();
+            LocalDateTime end1 = DateTimeConverter.localDateTime2(end);
+
+            Duration duration = Duration.between(start1, end1);
+            long days = duration.toHours();
+            if (days < 0) {
+                return Collections.emptyList();
+            } else if (days > 24) {
+                return Collections.emptyList();
+            }
         } catch (Exception e) {
-            e.printStackTrace();
+            // ignore
         }
-        return Collections.emptyList();
-    }
 
-    public List<Object> getNginxLog2(DateTimeRange dateTimeRange) throws Exception {
-        String start = dateTimeRange.getStart();
-        LocalDateTime start1 = DateTimeConverter.localDateTime2(start);
-        String end = dateTimeRange.getEnd();
-        LocalDateTime end1 = DateTimeConverter.localDateTime2(end);
-
-        Duration duration = Duration.between(start1, end1);
-        long days = duration.toHours();
-        if (days < 0) {
-            return Collections.emptyList();
-        } else if (days > 24) {
-            return Collections.emptyList();
-        }
         return null;
     }
 
-    public List<ChartData> getTopN(String dateStr) throws IOException {
+    public List<ChartData> getTopN(String dateStr) {
         int pageSize = 100;
         int pageNumber = 1;
 
@@ -150,15 +144,16 @@ public class NginxLogService {
         return searchService.count(indexName, dateQuery);
     }
 
-    public List<Object> getChartData2(String dateStr, String fieldValue) throws Exception {
+    public List<Object> getChartData2(LogQuery logQuery) {
         String aggregateField = "timeIso8601";
         String dateField = "timeIso8601";
         String fieldName = "methodUrl.raw";
 
+        String dateStr = logQuery.getDateStr();
+        String fieldValue = logQuery.getUrl();
+
         String start = String.format("%s 00:00:00", dateStr);
         String end = String.format("%s 23:59:59", dateStr);
-        /*String start1 = startDateTime.replace(" ", "T");
-        String end1 = endDateTime.replace(" ", "T");*/
         Query dateQuery = RangeQuery.of(q -> q.field(dateField)
                 .from(start).to(end).format(dateTimeFormat).timeZone(timeZone))._toQuery();
         Query combinedQuery;
@@ -168,8 +163,8 @@ public class NginxLogService {
             Query termQuery = EsQuery.getTermQuery(fieldName, fieldValue);
             combinedQuery = Query.of(q -> q.bool(b -> b.filter(dateQuery).filter(termQuery)));
         }
-        Map<String, Long> urlGroupMap = searchService.aggregateByQuery(indexName, aggregateField, combinedQuery);
 
+        Map<String, Long> urlGroupMap = searchService.aggregateByQuery(indexName, aggregateField, combinedQuery);
         List<String> xList = new ArrayList<>();
         List<Long> yList = new ArrayList<>();
         urlGroupMap.forEach((key, value) -> {
@@ -192,11 +187,25 @@ public class NginxLogService {
      * @return
      * @date 2026-01-09 21:26:58
      */
-    public List<GroupCount> getChartData3(String aggregateField, String dateStr) throws Exception {
+    public List<GroupCount> getChartData3(LogQuery logQuery) {
+        String dateStr = logQuery.getDateStr();
+        String aggregateField0 = logQuery.getAggregateField();
+        String aggregateField;
+        if ("url".equals(aggregateField0)) {
+            aggregateField = "methodUrl.raw";
+        } else if ("statusCode".equals(aggregateField0)) {
+            aggregateField = "status";
+        } else if ("ip".equals(aggregateField0)) {
+            aggregateField = "remoteAddr";
+        } else if ("userAgent".equals(aggregateField0)) {
+            aggregateField = "httpUserAgent.raw";
+        } else {
+            return Collections.emptyList();
+        }
+
         String dateField = "timeIso8601";
-        DateTimeRange dateTimeRange = getDateTimeRange(dateStr);
-        String start = dateTimeRange.getStart();
-        String end = dateTimeRange.getEnd();
+        String start = String.format("%s 00:00:00", dateStr);
+        String end = String.format("%s 23:59:59", dateStr);
         Query dateQuery = RangeQuery.of(q -> q.field(dateField)
                 .from(start).to(end).format(dateTimeFormat).timeZone(timeZone))._toQuery();
         Map<String, Long> groupMap = searchService.aggregateByQuery(indexName, aggregateField, dateQuery);
@@ -216,12 +225,20 @@ public class NginxLogService {
         return list;
     }
 
-    public ChartMap getChartMap(String aggregateField, String dateStr) throws Exception {
+    public ChartMap getChartMap(LogQuery logQuery) {
+        String dateStr = logQuery.getDateStr();
+        String aggregateField0 = logQuery.getAggregateField();
+        String aggregateField;
+        if ("ip".equals(aggregateField0)) {
+            aggregateField = "remoteAddr";
+        } else {
+            return null;
+        }
+
         int deep = 1;
         String dateField = "timeIso8601";
-        DateTimeRange dateTimeRange = getDateTimeRange(dateStr);
-        String start = dateTimeRange.getStart();
-        String end = dateTimeRange.getEnd();
+        String start = String.format("%s 00:00:00", dateStr);
+        String end = String.format("%s 23:59:59", dateStr);
         Query dateQuery = RangeQuery.of(q -> q.field(dateField)
                 .from(start).to(end).format(dateTimeFormat).timeZone(timeZone))._toQuery();
         Map<String, Long> groupMap1 = searchService.aggregateByQuery(indexName, aggregateField, dateQuery);
@@ -289,23 +306,13 @@ public class NginxLogService {
         return new ChartMap(geoJson, chartDataList);
     }
 
-    private DateTimeRange getDateTimeRange(String dateStr) {
-        LocalDate localDate = LocalDate.parse(dateStr);
-        String startDate = localDate.minusDays(7).toString();
-        String endDate = localDate.toString();
-
-        String start1 = String.format("%s 00:00:00", endDate);
-        String end1 = String.format("%s 23:59:59", endDate);
-        return new DateTimeRange(start1, end1);
-    }
-
-    public List<Object> getChartData5(String dateStr, String fieldValue) throws Exception {
+    public List<Object> getChartData5(DateTimeQuery dateTimeQuery) {
         String aggregateField = "timeIso8601";
         String fieldName = "methodUrl.raw";
 
-        DateTimeRange dateTimeRange = getDateTimeRange(dateStr);
-        String start = dateTimeRange.getStart();
-        String end = dateTimeRange.getEnd();
+        String fieldValue = dateTimeQuery.getUrl();
+        String start = dateTimeQuery.getStart();
+        String end = dateTimeQuery.getEnd();
         String dateField = "timeIso8601";
         Query dateQuery = RangeQuery.of(q -> q.field(dateField)
                 .from(start).to(end).format(dateTimeFormat).timeZone(timeZone))._toQuery();
@@ -317,6 +324,7 @@ public class NginxLogService {
         } else {
             combinedQuery = Query.of(q -> q.bool(b -> b.filter(dateQuery)));
         }
+
         Map<String, Long> groupMap = searchService.aggregateByDay(indexName, aggregateField, combinedQuery);
 
         List<String> xList = new ArrayList<>();