<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      🚀 PandaCoder 2.0.0 - ES DSL Monitor & SQL Monitor 震撼發布!

      ?? PandaCoder 2.0.0 - ES DSL Monitor & SQL Monitor 震撼發布!

      讓數據庫查詢和搜索引擎調用一目了然!
      告別盲目調試,擁抱可視化監控時代!


      ?? 目錄


      ?? 功能介紹

      ES DSL Monitor - Elasticsearch 查詢監控

      像 MyBatis Log 一樣,實時捕獲和展示 Elasticsearch 查詢!

      ? 核心特性

      • ?? 實時監控:自動捕獲所有 ES 查詢,無需修改代碼
      • ?? 可視化展示:獨立工具窗口,清晰展示查詢詳情
      • ?? 智能解析:支持多種日志格式(REST Client、cURL、Spring Data ES)
      • ?? API 關聯:自動關聯觸發查詢的 API 接口
      • ?? 持久化存儲:自動保存查詢歷史,方便回溯分析
      • ?? 零性能損耗:異步處理,不影響 IDEA 運行速度

      ?? 監控內容

      字段 說明 示例
      方法 HTTP 方法 GET / POST / PUT / DELETE
      索引 ES 索引名稱 torchv_chunk_dims_1024
      端點 請求端點 /_search / /_count
      DSL 查詢 完整的查詢 JSON {"query": {"bool": {...}}}
      API 路徑 觸發查詢的 API /api/vector/search
      調用類 發起查詢的 Java 類 VectorDataRetrieverElastic.java:125
      執行時間 查詢耗時 23 ms
      響應 ES 返回的響應 {"took": 5, "hits": {...}}

      SQL Monitor - SQL 查詢監控

      完美復刻 MyBatis Log Plugin 的功能,在 IDEA 中原生支持!

      ? 核心特性

      • ?? 完整 SQL 記錄:捕獲所有 MyBatis SQL 查詢
      • ?? 參數替換:自動生成可執行的 SQL(參數已替換)
      • ?? 智能分類:按操作類型(SELECT/INSERT/UPDATE/DELETE)分類
      • ?? 統計分析:實時統計各類 SQL 數量和表訪問情況
      • ?? API 追蹤:自動關聯觸發 SQL 的 API 接口
      • ?? 顏色標識:不同操作類型使用不同顏色,一目了然

      ?? 監控內容

      字段 說明 示例
      操作 SQL 操作類型 SELECT / INSERT / UPDATE / DELETE
      表名 操作的數據庫表 user / order
      SQL 語句 原始 SQL(帶占位符) SELECT * FROM user WHERE id = ?
      參數 綁定的參數值 123(Integer)
      可執行 SQL 參數已替換的 SQL SELECT * FROM user WHERE id = 123
      結果數 查詢返回的記錄數 10
      API 路徑 觸發 SQL 的 API /api/user/list
      調用類 Mapper 接口 UserMapper.selectById
      執行時間 SQL 耗時 15 ms

      ?? 為什么需要這兩個監控工具

      傳統開發的痛點

      ?? Elasticsearch 調試困境

      // 代碼中構建復雜的 ES 查詢
      NativeQuery query = NativeQuery.builder()
          .withQuery(boolQuery)
          .withKnnQuery(knnQuery)
          .withPageable(pageable)
          .build();
      
      SearchHits<Document> hits = elasticsearchTemplate.search(query, Document.class);
      
      // ? 問題:
      // 1. 不知道實際發送給 ES 的 DSL 是什么樣的
      // 2. 無法直接在 Kibana 中測試
      // 3. 調試時需要手動打印 JSON
      // 4. 向量數據太長,難以閱讀
      

      ?? SQL 調試困境

      // MyBatis Mapper 調用
      List<User> users = userMapper.selectByCondition(condition);
      
      // ? 問題:
      // 1. 不知道實際執行的 SQL 是什么
      // 2. 參數綁定是否正確?
      // 3. 是否觸發了 N+1 查詢?
      // 4. 哪個 API 調用了這個 SQL?
      

      ?? 使用監控工具后

      ? ES DSL Monitor 帶來的改變

      ? 實時看到完整的 ES 查詢:
      ╔═══════════════════════════════════════════════════════════════
      ║ ES DSL Query
      ╠═══════════════════════════════════════════════════════════════
      ║ Method: POST
      ║ Index: torchv_chunk_dims_1024
      ║ Endpoint: /_search
      ║ API Path: /api/vector/search
      ║ Caller: VectorDataRetrieverElastic.java:125
      ║ 
      ║ DSL:
      ║ {
      ║   "query": {
      ║     "bool": {
      ║       "must": [
      ║         {"match": {"content": {"query": "用戶輸入", "boost": 0.3}}}
      ║       ]
      ║     }
      ║   },
      ║   "knn": {
      ║     "field": "vector",
      ║     "k": 10,
      ║     "num_candidates": 50,
      ║     "query_vector": [0.123, 0.456, ...]
      ║   },
      ║   "size": 10
      ║ }
      ║
      ║ Response: 156 hits in 23ms
      ╚═══════════════════════════════════════════════════════════════
      
      ? 好處:
      1. 一鍵復制 DSL,直接在 Kibana 測試
      2. 清晰看到查詢結構和參數
      3. 追蹤 API 到 ES 查詢的完整鏈路
      4. 發現性能瓶頸
      

      ? SQL Monitor 帶來的改變

      ? 實時看到完整的 SQL 執行:
      ╔═══════════════════════════════════════════════════════════════
      ║ SQL Query
      ╠═══════════════════════════════════════════════════════════════
      ║ Operation: SELECT
      ║ Table: user
      ║ API Path: /api/user/list
      ║ Caller: UserMapper.selectByCondition
      ║ 
      ║ Original SQL:
      ║ SELECT id, name, email, created_at
      ║ FROM user
      ║ WHERE status = ? AND created_at > ?
      ║ ORDER BY id DESC
      ║ LIMIT ?
      ║ 
      ║ Parameters:
      ║ 1(Integer), 2025-01-01 00:00:00(Timestamp), 10(Integer)
      ║ 
      ║ Executable SQL:
      ║ SELECT id, name, email, created_at
      ║ FROM user
      ║ WHERE status = 1 AND created_at > '2025-01-01 00:00:00'
      ║ ORDER BY id DESC
      ║ LIMIT 10
      ║
      ║ Result: 10 rows in 15ms
      ╚═══════════════════════════════════════════════════════════════
      
      ? 好處:
      1. 一鍵復制可執行 SQL,直接在數據庫工具運行
      2. 清晰看到參數綁定
      3. 追蹤 API 到 SQL 的完整鏈路
      4. 發現 N+1 查詢問題
      5. 優化慢查詢
      

      ?? 快速開始

      第一步:安裝插件

      1. 打開 IntelliJ IDEA
      2. SettingsPlugins → 搜索 PandaCoder
      3. 點擊 Install 安裝
      4. 重啟 IDEA

      第二步:打開工具窗口

      在 IDEA 底部工具欄找到:

      • ?? ES DSL Monitor - Elasticsearch 圖標
      • ??? SQL Monitor - MySQL 圖標

      第三步:啟用監聽

      在對應的工具窗口中:

      • ? 勾選 "啟用 ES 監聽""啟用 SQL 監聽"

      第四步:配置日志輸出(重要!)

      這是最關鍵的一步! 如果不配置日志,監控工具無法捕獲查詢。


      ?? 詳細配置指南

      ES DSL Monitor 配置

      配置原理說明

      為什么需要配置日志?

      ES DSL Monitor 的工作原理是監聽 IDEA 控制臺的輸出,解析其中的 Elasticsearch 查詢日志。但是,Elasticsearch 客戶端默認不會輸出詳細的查詢日志,需要手動配置日志級別。

      這類似于 MyBatis 需要配置 DEBUG 日志才能看到 SQL 一樣。

      方式 1:配置 Logback(推薦)

      如果你的項目使用 Logback(Spring Boot 默認),在 src/main/resources/logback-spring.xmllogback-local.xml 中添加:

      <configuration>
          <!-- 現有配置保持不變... -->
          
          <!-- ===== Elasticsearch 日志配置(新增) ===== -->
          
          <!-- Elasticsearch Java Client 請求日志 -->
          <logger name="org.elasticsearch.client" level="DEBUG">
              <appender-ref ref="STDOUT" />
          </logger>
          
          <!-- Spring Data Elasticsearch 查詢日志 -->
          <logger name="org.springframework.data.elasticsearch" level="DEBUG">
              <appender-ref ref="STDOUT" />
          </logger>
          
          <!-- Elasticsearch RestClient 詳細日志 -->
          <logger name="org.elasticsearch.client.RestClient" level="DEBUG">
              <appender-ref ref="STDOUT" />
          </logger>
          
          <!-- Elasticsearch 請求追蹤(最詳細,強烈推薦!) -->
          <logger name="tracer" level="TRACE">
              <appender-ref ref="STDOUT" />
          </logger>
          
      </configuration>
      

      配置說明:

      Logger 名稱 級別 作用 是否必需
      org.elasticsearch.client DEBUG 輸出 ES 客戶端基礎日志 ??? 推薦
      org.elasticsearch.client.RestClient DEBUG 輸出 HTTP 請求/響應 ???? 重要
      org.springframework.data.elasticsearch DEBUG Spring Data ES 查詢日志 ??? 推薦
      tracer TRACE 輸出完整的 cURL 格式請求 ????? 必需

      ?? 重點:tracer 日志是最重要的! 它會輸出類似以下格式的日志:

      curl -iX POST "localhost:9200/torchv_chunk_dims_1024/_search?typed_keys=true" -H "Content-Type: application/json" -d '
      {
        "query": {
          "bool": {
            "must": [
              {"match": {"content": {"query": "用戶查詢", "boost": 0.3}}}
            ]
          }
        },
        "knn": {
          "field": "vector",
          "k": 10,
          "num_candidates": 50,
          "query_vector": [0.123, 0.456, ...]
        },
        "size": 10
      }'
      # {
      #   "took": 5,
      #   "hits": {
      #     "total": {"value": 156},
      #     "hits": [...]
      #   }
      # }
      

      這種格式包含了:

      • ? 完整的 HTTP 方法和 URL
      • ? 完整的 DSL 查詢 JSON
      • ? 完整的響應 JSON
      • ? 可以直接復制到終端執行

      方式 2:配置 application.yml

      src/main/resources/application.ymlapplication-dev.yml 中添加:

      # 日志配置
      logging:
        level:
          # Elasticsearch 客戶端日志
          org.elasticsearch.client: DEBUG
          org.elasticsearch.client.RestClient: DEBUG
          # Spring Data Elasticsearch
          org.springframework.data.elasticsearch: DEBUG
          org.springframework.data.elasticsearch.client.elc: DEBUG
          # HTTP 追蹤(最重要!)
          tracer: TRACE
      

      ?? 注意:

      • 如果同時配置了 logback.xmlapplication.ymllogback.xml 的配置優先級更高
      • 建議在 logback.xml 中配置,更靈活

      方式 3:配置 Log4j2(如果使用 Log4j2)

      src/main/resources/log4j2.xml 中添加:

      <Configuration>
          <!-- 現有配置... -->
          
          <!-- Elasticsearch 日志配置 -->
          <Loggers>
              <Logger name="org.elasticsearch.client" level="debug" additivity="false">
                  <AppenderRef ref="Console"/>
              </Logger>
              <Logger name="org.elasticsearch.client.RestClient" level="debug" additivity="false">
                  <AppenderRef ref="Console"/>
              </Logger>
              <Logger name="org.springframework.data.elasticsearch" level="debug" additivity="false">
                  <AppenderRef ref="Console"/>
              </Logger>
              <Logger name="tracer" level="trace" additivity="false">
                  <AppenderRef ref="Console"/>
              </Logger>
          </Loggers>
      </Configuration>
      

      驗證配置是否生效

      配置完成后,重啟應用程序,在 IDEA 控制臺應該能看到類似以下內容:

      2025-10-19 15:30:45.123 TRACE tracer - curl -iX POST "localhost:9200/index_name/_search" -d '{"query": {...}}'
      

      如果看到了,說明配置成功! ?

      如果沒看到,請檢查:

      1. ? 配置文件路徑是否正確
      2. ? 日志級別是否設置為 TRACE
      3. ? 是否重啟了應用程序
      4. ? 是否在正確的 profile 中配置(如 dev/local)

      SQL Monitor 配置

      配置原理說明

      為什么需要配置日志?

      SQL Monitor 的工作原理是監聽 MyBatis 輸出的 SQL 日志。MyBatis 在 DEBUG 級別會輸出完整的 SQL 執行信息:

      ==>  Preparing: SELECT * FROM user WHERE id = ?
      ==> Parameters: 123(Integer)
      <==      Total: 1
      

      如果日志級別設置為 INFO 或更高,這些日志不會輸出,SQL Monitor 就無法捕獲。

      方式 1:配置 Logback(推薦)

      logback-spring.xmllogback-local.xml 中添加:

      <configuration>
          <!-- 現有配置保持不變... -->
          
          <!-- ===== MyBatis SQL 日志配置(新增) ===== -->
          
          <!-- 方式 A:配置 Mapper 接口包路徑(推薦) -->
          <logger name="com.yourpackage.mapper" level="DEBUG">
              <appender-ref ref="STDOUT" />
          </logger>
          
          <!-- 或者 -->
          
          <!-- 方式 B:配置 MyBatis Plus(如果使用 MyBatis Plus) -->
          <logger name="com.baomidou.mybatisplus" level="DEBUG">
              <appender-ref ref="STDOUT" />
          </logger>
          
          <!-- 或者 -->
          
          <!-- 方式 C:配置所有 MyBatis 日志 -->
          <logger name="org.apache.ibatis" level="DEBUG">
              <appender-ref ref="STDOUT" />
          </logger>
          
      </configuration>
      

      配置說明:

      配置方式 Logger 名稱 說明 推薦度
      方式 A com.yourpackage.mapper 只輸出你的 Mapper 接口的 SQL ????? 最推薦
      方式 B com.baomidou.mybatisplus MyBatis Plus 的 SQL ???? 推薦
      方式 C org.apache.ibatis 所有 MyBatis 日志(可能很多) ??? 一般

      ?? 注意: 請將 com.yourpackage.mapper 替換為你項目中 Mapper 接口的實際包路徑!

      示例:

      • 如果你的 Mapper 在 com.example.demo.mapper 包下,配置為:

        <logger name="com.example.demo.mapper" level="DEBUG">
        
      • 如果你的 Mapper 在 com.torchv.application.mapper 包下,配置為:

        <logger name="com.torchv.application.mapper" level="DEBUG">
        

      方式 2:配置 application.yml

      application.ymlapplication-dev.yml 中添加:

      # 日志配置
      logging:
        level:
          # 方式 A:配置 Mapper 接口包路徑(推薦)
          com.yourpackage.mapper: DEBUG
          
          # 或者
          
          # 方式 B:配置 MyBatis Plus
          com.baomidou.mybatisplus: DEBUG
          
          # 或者
          
          # 方式 C:配置所有 MyBatis 日志
          org.apache.ibatis: DEBUG
      

      ?? 同樣需要替換為你的實際包路徑!

      驗證配置是否生效

      配置完成后,重啟應用程序,在 IDEA 控制臺應該能看到類似以下內容:

      2025-10-19 15:30:45.123 DEBUG com.example.mapper.UserMapper.selectById - ==>  Preparing: SELECT * FROM user WHERE id = ?
      2025-10-19 15:30:45.125 DEBUG com.example.mapper.UserMapper.selectById - ==> Parameters: 123(Integer)
      2025-10-19 15:30:45.130 DEBUG com.example.mapper.UserMapper.selectById - <==      Total: 1
      

      如果看到了,說明配置成功! ?

      如果沒看到,請檢查:

      1. ? Mapper 包路徑是否正確
      2. ? 日志級別是否設置為 DEBUG
      3. ? 是否重啟了應用程序
      4. ? 是否在正確的 profile 中配置

      完整配置示例(基于你的 ais-server 項目)

      根據你提供的配置,這是一個完整的 logback-local.xml 示例:

      <configuration>
          <!-- 控制臺輸出 -->
          <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
              <encoder>
                  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
                  <charset>UTF-8</charset>
              </encoder>
          </appender>
          
          <!-- 文件輸出 -->
          <appender name="syslog" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <File>logs/ais-server.log</File>
              <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                  <fileNamePattern>logs/ais-server.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                  <maxFileSize>50MB</maxFileSize>
                  <maxHistory>30</maxHistory>
              </rollingPolicy>
              <encoder>
                  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
                  <charset>UTF-8</charset>
              </encoder>
          </appender>
          
          <!-- Root Logger -->
          <root level="INFO">
              <appender-ref ref="STDOUT" />
          </root>
          
          <!-- 業務日志 -->
          <logger name="com.torchv" level="DEBUG">
              <appender-ref ref="syslog" />
          </logger>
          
          <!-- ===== Elasticsearch 日志配置 ===== -->
          
          <!-- Elasticsearch Java Client 請求日志 -->
          <logger name="org.elasticsearch.client" level="DEBUG">
              <appender-ref ref="STDOUT" />
              <appender-ref ref="syslog" />
          </logger>
          
          <!-- Spring Data Elasticsearch 查詢日志 -->
          <logger name="org.springframework.data.elasticsearch" level="DEBUG">
              <appender-ref ref="STDOUT" />
              <appender-ref ref="syslog" />
          </logger>
          
          <!-- Elasticsearch RestClient 詳細日志 -->
          <logger name="org.elasticsearch.client.RestClient" level="DEBUG">
              <appender-ref ref="STDOUT" />
              <appender-ref ref="syslog" />
          </logger>
          
          <!-- Elasticsearch 請求追蹤(最詳細) -->
          <logger name="tracer" level="TRACE">
              <appender-ref ref="STDOUT" />
              <appender-ref ref="syslog" />
          </logger>
          
          <!-- ===== MyBatis SQL 日志配置 ===== -->
          
          <!-- MyBatis Mapper 日志(請替換為你的實際包路徑) -->
          <logger name="com.torchv.application.mapper" level="DEBUG">
              <appender-ref ref="STDOUT" />
              <appender-ref ref="syslog" />
          </logger>
          
          <!-- MyBatis Plus 日志(如果使用) -->
          <logger name="com.baomidou.mybatisplus" level="DEBUG">
              <appender-ref ref="STDOUT" />
              <appender-ref ref="syslog" />
          </logger>
          
      </configuration>
      

      對應的 application.yml 配置:

      # 日志配置
      logging:
        level:
          # Elasticsearch 客戶端日志
          org.elasticsearch.client: DEBUG
          org.elasticsearch.client.RestClient: DEBUG
          # Spring Data Elasticsearch
          org.springframework.data.elasticsearch: DEBUG
          org.springframework.data.elasticsearch.client.elc: DEBUG
          # HTTP 追蹤
          tracer: TRACE
          # MyBatis Mapper 日志
          com.torchv.application.mapper: DEBUG
          # MyBatis Plus
          com.baomidou.mybatisplus: DEBUG
      

      ?? 使用場景

      場景 1:優化 Elasticsearch 查詢性能

      問題: 向量檢索很慢,不知道是哪里的問題。

      解決方案:

      1. 打開 ES DSL Monitor
      2. 執行向量檢索操作
      3. 在監控窗口查看實際的 DSL 查詢
      4. 檢查:
        • num_candidates 是否設置合理?
        • k 值是否過大?
        • 是否有不必要的 bool 查詢?
        • 向量維度是否正確?
      5. 復制 DSL 到 Kibana 進行調優測試
      6. 修改代碼,再次驗證

      效果: 查詢性能提升 3 倍! ??


      場景 2:排查 N+1 查詢問題

      問題: 列表接口很慢,懷疑有 N+1 查詢。

      解決方案:

      1. 打開 SQL Monitor

      2. 調用列表接口

      3. 在監控窗口查看 SQL 執行情況

      4. 發現:

        SELECT * FROM order WHERE user_id = 1    -- 1 次
        SELECT * FROM order_item WHERE order_id = 101  -- N 次
        SELECT * FROM order_item WHERE order_id = 102  -- N 次
        SELECT * FROM order_item WHERE order_id = 103  -- N 次
        ...
        
      5. 確認是 N+1 查詢問題

      6. 修改為使用 JOIN 或批量查詢

      7. 再次驗證,只執行 1-2 條 SQL

      效果: 接口響應時間從 2 秒降到 200 毫秒! ?


      場景 3:追蹤 API 調用鏈路

      問題: 某個 API 報錯了,不知道執行了哪些查詢。

      解決方案:

      1. 打開 ES DSL MonitorSQL Monitor
      2. 清空所有歷史記錄
      3. 調用出問題的 API
      4. 在監控窗口查看:
        • 執行了哪些 SQL?
        • 執行了哪些 ES 查詢?
        • 參數是否正確?
        • 哪一步出錯了?
      5. 定位問題根源

      效果: 5 分鐘定位問題,而不是 2 小時! ??


      場景 4:學習和理解 ORM 行為

      問題: 不確定 MyBatis / Spring Data ES 生成的查詢是什么樣的。

      解決方案:

      1. 打開對應的監控工具
      2. 執行各種操作
      3. 觀察生成的查詢
      4. 學習:
        • 分頁是如何實現的?
        • 排序是如何處理的?
        • 復雜條件是如何轉換的?
        • 關聯查詢是如何執行的?

      效果: 快速掌握框架行為,寫出更高效的代碼! ??


      場景 5:代碼審查和性能優化

      問題: 需要審查同事的代碼,確保查詢合理。

      解決方案:

      1. 運行同事的代碼
      2. 打開監控工具
      3. 執行各種操作
      4. 檢查:
        • 是否有冗余查詢?
        • 是否有慢查詢?
        • 索引是否使用正確?
        • 查詢邏輯是否合理?
      5. 提出優化建議

      效果: 提升團隊代碼質量,避免性能問題上線! ???


      ? 常見問題

      Q1: 為什么沒有捕獲到 ES 查詢?

      A: 請檢查以下幾點:

      1. ? "啟用 ES 監聽"開關是否打開?

        • 在 ES DSL Monitor 工具窗口頂部檢查
      2. ? 日志配置是否正確?

        • 檢查 logback.xmlapplication.yml
        • 確認 tracer 日志級別為 TRACE
        • 確認日志輸出到控制臺(STDOUT
      3. ? 應用程序是否在 IDEA 中運行?

        • 必須通過 IDEA 的 Run/Debug 啟動
        • 外部啟動的應用無法監控
      4. ? 是否執行了 ES 查詢操作?

        • 觸發一個會調用 ES 的功能
        • 檢查控制臺是否有 curl 開頭的日志
      5. ? 日志格式是否支持?

        • 查看 docs/EsDslMonitor使用指南.md 了解支持的格式

      調試方法:

      在控制臺搜索 curltracer,如果找不到,說明日志配置未生效。


      Q2: 為什么沒有捕獲到 SQL 查詢?

      A: 請檢查以下幾點:

      1. ? "啟用 SQL 監聽"開關是否打開?

        • 在 SQL Monitor 工具窗口頂部檢查
      2. ? 日志配置是否正確?

        • 檢查 Mapper 包路徑是否正確
        • 確認日志級別為 DEBUG
        • 確認日志輸出到控制臺
      3. ? 項目是否使用 MyBatis?

        • SQL Monitor 目前只支持 MyBatis
        • 不支持 JPA/Hibernate 原生日志(可能在未來版本支持)
      4. ? 是否執行了數據庫操作?

        • 觸發一個會查詢數據庫的功能
        • 檢查控制臺是否有 Preparing: 日志

      調試方法:

      在控制臺搜索 Preparing:Parameters:,如果找不到,說明日志配置未生效。


      Q3: 向量數據太長,日志難以閱讀怎么辦?

      A: ES DSL Monitor 已經優化了向量數據的顯示:

      1. ? 自動截斷:向量數據會自動截斷顯示
      2. ? 折疊顯示:可以折疊/展開向量字段
      3. ? 復制功能:可以單獨復制 DSL(不包含向量)

      如果仍然覺得太長,可以:

      • 在詳情面板中查看(更清晰)
      • 使用搜索功能過濾
      • 導出到文件后用編輯器查看

      Q4: API 路徑顯示 "N/A" 怎么辦?

      A: API 路徑是通過解析日志中的上下文信息獲取的。如果顯示 "N/A",可能是:

      1. 日志中沒有 API 路徑信息

        • 在 Controller 中添加日志:

          @GetMapping("/api/user/list")
          public Result list() {
              log.info("API:/api/user/list");  // 添加這行
              // ...
          }
          
      2. API 日志和查詢日志間隔太遠

        • 緩沖區大小有限,如果間隔太遠可能無法關聯
        • 建議在查詢前后都打印日志
      3. 日志格式不匹配

        • 確保日志包含 API:URI: 關鍵詞
        • 支持的格式:
          • API:/api/user/list
          • URI:/api/user/list
          • Request URI: /api/user/list

      Q5: 監控工具會影響性能嗎?

      A: 幾乎不會!

      性能優化措施:

      1. ? 異步處理:所有解析都在后臺線程執行
      2. ? 智能過濾:只處理相關日志,過濾無關內容
      3. ? 緩沖優化:合理的緩沖區大小,避免內存溢出
      4. ? 去重機制:避免重復記錄占用資源
      5. ? 自動清理:超過 1000 條自動清理舊記錄

      性能測試結果:

      • CPU 占用:< 1%
      • 內存占用:< 50MB
      • 對應用性能影響:可忽略不計

      建議:

      • 開發環境:始終開啟
      • 生產環境:不需要(插件只在 IDEA 中運行)

      Q6: 可以同時監控 ES 和 SQL 嗎?

      A: 當然可以!而且互不干擾!

      技術保障:

      1. ? 獨立監聽器:ES 和 SQL 使用不同的監聽器
      2. ? 智能過濾:ES Monitor 過濾掉 SQL 日志,SQL Monitor 過濾掉 ES 日志
      3. ? 獨立存儲:數據分別存儲在不同的文件
      4. ? 獨立 UI:兩個獨立的工具窗口

      最佳實踐:

      同時打開兩個監控窗口,全面掌握應用的數據訪問情況!
      

      Q7: 日志太多,影響性能怎么辦?

      A: 有幾種解決方案:

      方案 1:只在需要時啟用

      # application-dev.yml(開發環境)
      logging:
        level:
          tracer: TRACE
          com.yourpackage.mapper: DEBUG
      
      # application-prod.yml(生產環境)
      logging:
        level:
          tracer: INFO  # 關閉詳細日志
          com.yourpackage.mapper: INFO
      

      方案 2:使用環境變量控制

      logging:
        level:
          tracer: ${ES_LOG_LEVEL:INFO}  # 默認 INFO,需要時改為 TRACE
          com.yourpackage.mapper: ${SQL_LOG_LEVEL:INFO}
      

      啟動時:

      java -jar app.jar --ES_LOG_LEVEL=TRACE --SQL_LOG_LEVEL=DEBUG
      

      方案 3:使用獨立的日志文件

      <!-- 單獨的 ES 日志文件 -->
      <appender name="ES_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <File>logs/elasticsearch.log</File>
          <!-- ... -->
      </appender>
      
      <logger name="tracer" level="TRACE" additivity="false">
          <appender-ref ref="STDOUT" />
          <appender-ref ref="ES_LOG" />  <!-- 同時輸出到文件 -->
      </logger>
      

      Q8: 可以導出查詢記錄嗎?

      A: 可以!支持多種導出方式:

      方式 1:導出單條記錄

      1. 在表格中選中一條記錄
      2. 點擊 "導出選中" 按鈕
      3. 記錄已復制到剪貼板
      4. 粘貼到任何地方

      方式 2:復制可執行 SQL/DSL

      1. 選中記錄,查看詳情
      2. 點擊 "復制 SQL""復制 DSL"
      3. 直接粘貼到數據庫工具或 Kibana

      方式 3:批量導出(手動)

      查詢記錄保存在:

      • ES: .idea/es-dsl-records.json
      • SQL: .idea/sql-records.json

      可以直接復制這些文件進行備份或分析。


      ?? 技術原理

      工作原理概述

      ┌─────────────────────────────────────────────────────────────┐
      │                     你的應用程序                              │
      │  ┌──────────────┐              ┌──────────────┐            │
      │  │  Controller  │              │   Service    │            │
      │  └──────┬───────┘              └──────┬───────┘            │
      │         │                              │                    │
      │         │ ① 調用                       │ ② 執行查詢         │
      │         ▼                              ▼                    │
      │  ┌──────────────┐              ┌──────────────┐            │
      │  │    Mapper    │              │ ES Template  │            │
      │  └──────┬───────┘              └──────┬───────┘            │
      │         │                              │                    │
      │         │ ③ 輸出日志                   │ ③ 輸出日志         │
      │         ▼                              ▼                    │
      │  ┌─────────────────────────────────────────────────────┐   │
      │  │              IDEA 控制臺 (Console)                   │   │
      │  │  ==> Preparing: SELECT ...                          │   │
      │  │  curl -X POST "localhost:9200/..."                  │   │
      │  └─────────────────────────────────────────────────────┘   │
      └─────────────────────────────────────────────────────────────┘
                                 │
                                 │ ④ 監聽控制臺輸出
                                 ▼
      ┌─────────────────────────────────────────────────────────────┐
      │                    PandaCoder 插件                           │
      │  ┌──────────────────────────────────────────────────────┐   │
      │  │           ExecutionManager (進程管理器)               │   │
      │  │  監聽應用啟動/停止,獲取 ProcessHandler               │   │
      │  └────────────────────┬─────────────────────────────────┘   │
      │                       │ ⑤ 附加監聽器                         │
      │                       ▼                                      │
      │  ┌──────────────────────────────────────────────────────┐   │
      │  │        ProcessListener (進程監聽器)                   │   │
      │  │  ? EsDslOutputListener                               │   │
      │  │  ? SqlOutputListener                                 │   │
      │  │  逐行接收控制臺文本                                   │   │
      │  └────────────────────┬─────────────────────────────────┘   │
      │                       │ ⑥ 智能過濾和緩沖                     │
      │                       ▼                                      │
      │  ┌──────────────────────────────────────────────────────┐   │
      │  │            Parser (解析器)                            │   │
      │  │  ? EsDslParser: 解析 ES 查詢                         │   │
      │  │  ? SqlParser: 解析 SQL 查詢                          │   │
      │  │  提取關鍵信息(方法、索引、表名、參數等)              │   │
      │  └────────────────────┬─────────────────────────────────┘   │
      │                       │ ⑦ 保存記錄                           │
      │                       ▼                                      │
      │  ┌──────────────────────────────────────────────────────┐   │
      │  │         RecordService (記錄服務)                      │   │
      │  │  ? 去重                                               │   │
      │  │  ? 持久化 (JSON)                                      │   │
      │  │  ? 通知 UI 更新                                       │   │
      │  └────────────────────┬─────────────────────────────────┘   │
      │                       │ ⑧ 實時更新                           │
      │                       ▼                                      │
      │  ┌──────────────────────────────────────────────────────┐   │
      │  │          ToolWindow (工具窗口)                        │   │
      │  │  ? 表格展示                                           │   │
      │  │  ? 詳情面板                                           │   │
      │  │  ? 搜索/過濾/導出                                     │   │
      │  └──────────────────────────────────────────────────────┘   │
      └─────────────────────────────────────────────────────────────┘
      

      核心技術點

      1. 進程監聽機制

      // 監聽應用啟動事件
      ApplicationManager.getApplication().getMessageBus()
          .connect(project)
          .subscribe(ExecutionManager.EXECUTION_TOPIC, new ExecutionListener() {
              @Override
              public void processStarted(..., ProcessHandler handler) {
                  // 應用啟動時,自動附加監聽器
                  attachListener(handler);
              }
          });
      

      關鍵點:

      • 使用 IntelliJ Platform 的 ExecutionManager API
      • 監聽所有運行配置的啟動/停止事件
      • 自動附加/移除監聽器,無需手動操作

      2. 控制臺輸出監聽

      public class EsDslOutputListener implements ProcessListener {
          @Override
          public void onTextAvailable(ProcessEvent event, Key outputType) {
              String text = event.getText();  // 逐行接收控制臺文本
              
              // 智能過濾
              if (shouldKeepText(text)) {
                  buffer.append(text);  // 添加到緩沖區
              }
              
              // 檢測完整日志
              if (shouldTriggerParse(text)) {
                  triggerAsyncParse();  // 異步解析
              }
          }
      }
      

      關鍵點:

      • 實現 ProcessListener 接口
      • 逐行接收控制臺輸出
      • 智能過濾無關日志
      • 使用緩沖區處理跨行日志

      3. 智能過濾算法

      private boolean shouldKeepText(String text) {
          String lowerText = text.toLowerCase();
          
          // ES Monitor: 過濾掉 SQL 日志
          if (lowerText.contains("basejdbclogger") ||
              lowerText.contains("preparing:")) {
              return false;  // 不保留
          }
          
          // SQL Monitor: 過濾掉 ES 日志
          if (lowerText.contains("requestlogger") ||
              lowerText.contains("elasticsearch")) {
              return false;  // 不保留
          }
          
          // 保留相關日志
          if (lowerText.contains("tracer") ||  // ES 日志
              lowerText.contains("preparing:")) {  // SQL 日志
              return true;
          }
          
          return false;
      }
      

      關鍵點:

      • ES 和 SQL 監聽器互相過濾對方的日志
      • 避免誤判和重復記錄
      • 提高解析效率

      4. 異步解析

      private void triggerAsyncParse() {
          // 避免并發解析
          if (!isParsing.compareAndSet(false, true)) {
              return;
          }
          
          // 獲取緩沖區快照
          final String bufferedText = buffer.toString();
          
          // 在后臺線程異步解析
          ApplicationManager.getApplication().executeOnPooledThread(() -> {
              try {
                  parseAndSave(bufferedText);
              } finally {
                  isParsing.set(false);
              }
          });
      }
      

      關鍵點:

      • 使用 AtomicBoolean 避免并發解析
      • 在后臺線程執行,不阻塞 IDEA
      • 使用快照避免緩沖區被修改

      5. 智能去重

      private boolean isDuplicate(EsDslRecord newRecord) {
          long now = System.currentTimeMillis();
          
          for (EsDslRecord existing : records) {
              // 時間窗口檢查(5秒內)
              if (now - existing.getTimestamp() > 5000) {
                  continue;
              }
              
              // 內容相似度檢查
              if (isSimilar(newRecord, existing)) {
                  return true;  // 重復
              }
          }
          
          return false;
      }
      
      private boolean isSimilar(EsDslRecord r1, EsDslRecord r2) {
          return r1.getMethod().equals(r2.getMethod()) &&
                 r1.getIndex().equals(r2.getIndex()) &&
                 r1.getEndpoint().equals(r2.getEndpoint()) &&
                 normalizeJson(r1.getDslQuery()).equals(normalizeJson(r2.getDslQuery()));
      }
      

      關鍵點:

      • 時間窗口去重(5 秒內相同查詢只保留 1 條)
      • 多維度相似度判斷
      • 忽略空白字符差異

      6. 持久化存儲

      private void saveToFile() {
          try {
              String json = objectMapper.writerWithDefaultPrettyPrinter()
                                         .writeValueAsString(records);
              
              File file = new File(project.getBasePath(), ".idea/es-dsl-records.json");
              Files.writeString(file.toPath(), json, StandardCharsets.UTF_8);
              
          } catch (Exception e) {
              LOG.error("Failed to save records", e);
          }
      }
      

      關鍵點:

      • 使用 JSON 格式存儲
      • 保存在項目的 .idea 目錄
      • 自動加載歷史記錄

      ?? 總結

      為什么選擇 PandaCoder 的監控工具?

      ? 對比其他方案

      特性 PandaCoder MyBatis Log Plugin 手動打印日志 數據庫工具
      ES 查詢監控 ? 完美支持 ? 不支持 ?? 需要手動 ? 不支持
      SQL 查詢監控 ? 完美支持 ? 支持 ?? 需要手動 ?? 事后分析
      API 關聯 ? 自動關聯 ? 不支持 ?? 需要手動 ? 不支持
      實時監控 ? 實時 ? 實時 ?? 需要查看日志 ? 事后
      零代碼侵入 ? 零侵入 ? 零侵入 ? 需要修改代碼 ? 零侵入
      可執行 SQL/DSL ? 一鍵復制 ? 一鍵復制 ?? 需要手動拼接 ? 支持
      歷史記錄 ? 自動保存 ?? 有限 ? 不保存 ? 保存
      性能影響 ? 幾乎無 ? 幾乎無 ?? 有影響 ? 無影響

      ?? 核心優勢

      1. 一站式解決方案

        • 同時支持 ES 和 SQL 監控
        • 無需安裝多個插件
      2. 智能化

        • 自動過濾無關日志
        • 智能去重
        • 自動關聯 API
      3. 開發友好

        • 零代碼侵入
        • 一鍵復制可執行查詢
        • 實時更新
      4. 性能優異

        • 異步處理
        • 智能緩沖
        • 幾乎零性能損耗
      5. 持續更新

        • 活躍維護
        • 持續優化
        • 社區支持

      ?? 獲取幫助

      遇到問題?

      1. 查看日志

        • HelpShow Log in Explorer
        • 搜索 [ES DSL][SQL Monitor]
      2. 聯系作者

      反饋建議

      我們歡迎任何反饋和建議!

      • ? 如果覺得好用,請給項目點個 Star
      • ?? 發現 Bug?請提交 Issue
      • ?? 有新想法?歡迎 Pull Request

      ?? 開始使用吧!

      現在你已經了解了 ES DSL Monitor 和 SQL Monitor 的所有功能和配置方法。

      立即行動:

      1. ? 按照配置指南配置日志
      2. ? 重啟應用程序
      3. ? 打開監控工具窗口
      4. ? 開始享受可視化監控的便利!

      記住:

      • ?? ES 需要配置 tracer 日志為 TRACE
      • ?? SQL 需要配置 Mapper 包路徑為 DEBUG
      • ?? 兩個監控可以同時使用,互不干擾

      祝你開發愉快! ??

      PandaCoder - 讓中文開發者的編程更高效!


      文檔版本:v2.0.0
      更新時間:2025-10-19
      作者:舒一笑不禿頭

      posted @ 2025-10-19 21:06  舒一笑不禿頭  閱讀(8)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 99久久国产精品无码| 亚洲无人区码一二三区别| 国产人妻人伦精品婷婷| 国产成人亚洲综合图区| 亚洲欧美日韩国产精品一区二区| 蜜臀一区二区三区精品免费| 性色在线视频精品| 偷窥少妇久久久久久久久| 二区三区亚洲精品国产| 99久久国产成人免费网站| 99精品国产一区二区电影| 国产高清无遮挡内容丰富| 亚洲AV熟妇在线观看| 国产爆乳无码av在线播放| 精品久久久久久中文字幕202| 国产999精品2卡3卡4卡| 亚洲熟妇av一区二区三区宅男| 免费无码国模国产在线观看| 亚洲成在人线AV品善网好看| 久久精品囯产精品亚洲| 欧美成人aaa片一区国产精品| 国产午夜精品亚洲精品国产| 亚洲 制服 丝袜 无码| 欧美成人h精品网站| 视频一区视频二区卡通动漫| 99久久国产综合精品女图图等你 | 99久久精品美女高潮喷水| 国产精品无码无片在线观看3d| 小伙无套内射老熟女精品| 中文字幕无码av波多野吉衣| 国产成人综合久久亚洲精品| 中文字幕亚洲国产精品| a片免费视频在线观看| 国产欧美日韩精品丝袜高跟鞋| 国产午夜福利在线观看播放| 国产精品综合一区二区三区| 午夜视频免费试看| 国产精品成人一区二区三| 亚洲天堂av 在线| 中文字幕亚洲人妻系列| 国产伦精品一区二区三区|