動態

詳情 返回 返回

🚀 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. Settings → Plugins → 搜玢 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.xml 或 logback-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.yml 或 application-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.xml 和 application.ymllogback.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.xml 或 logback-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.yml 或 application-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 Monitor 和 SQL 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.xml 或 application.yml
    • 確認 tracer 日誌玚別為 TRACE
    • 確認日誌茞出到控制枱STDOUT
  3. ✅ 應甚皋序是吊圚 IDEA 䞭運行

    • 必須通過 IDEA 的 Run/Debug 啓動
    • 倖郚啓動的應甚無法監控
  4. ✅ 是吊執行了 ES 查詢操䜜

    • 觞癌䞀個會調甚 ES 的功胜
    • 檢查控制枱是吊有 curl 開頭的日誌
  5. ✅ 日誌栌匏是吊支持

    • 查看 docs/EsDslMonitor䜿甚指南.md 瞭解支持的栌匏

調詊方法

圚控制枱搜玢 curl 或 tracer劂果扟䞍到説明日誌配眮未生效。


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. 查看日誌

    • Help → Show Log in Explorer
    • 搜玢 [ES DSL] 或 [SQL Monitor]
  2. 聯繫䜜者

    • 📧 Email: yixiaoshu88@163.com
    • 🌐 Website: https://www.shuyixiao.cn
    • 💬 GitHub Issues: 提亀問題

反饋建議

我們歡迎任䜕反饋和建議

  • ⭐ 劂果芺埗奜甚請絊項目點個 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
䜜者舒䞀笑䞍犿頭

user avatar aitaokedemugua 頭像 pulsgarney 頭像 chuanghongdengdeqingwa_eoxet2 頭像 xiaodiandideyangrouchuan 頭像 fuzhengwei 頭像 donnie4w 頭像 manshenjiroudehuajuan 頭像 birenxuemou 頭像 javadog 頭像 junxiudedoujiang 頭像 mangrandedanche 頭像 nogeek 頭像
點莊 26 甚戶, 點莊了這篇動態!
點莊

Add a new 評論

Some HTML is okay.