This is an automated email from the ASF dual-hosted git repository.

jeffreyh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/doris-opentelemetry-demo.git


The following commit(s) were added to refs/heads/main by this push:
     new 72d9d6f  feat: fix the grafana auth error
72d9d6f is described below

commit 72d9d6f96a8cd510bcd3e27b6e0b61f8159f9bc1
Author: Jeffrey <[email protected]>
AuthorDate: Thu Aug 28 19:19:31 2025 +0800

    feat: fix the grafana auth error
---
 src/grafana/plugins/doris-app/181.js               | 766 +++++++++++++--------
 src/grafana/plugins/doris-app/181.js.map           |   2 +-
 src/grafana/plugins/doris-app/{892.js => 301.js}   | 586 +++++++++++-----
 src/grafana/plugins/doris-app/301.js.map           |   1 +
 src/grafana/plugins/doris-app/462.js               |   4 +-
 src/grafana/plugins/doris-app/462.js.map           |   2 +-
 src/grafana/plugins/doris-app/600.js               | 300 ++++----
 src/grafana/plugins/doris-app/600.js.map           |   2 +-
 src/grafana/plugins/doris-app/892.js.map           |   1 -
 .../plugins/doris-app/gpx_doris-app_darwin_amd64   | Bin 25602304 -> 25602304 
bytes
 .../plugins/doris-app/gpx_doris-app_darwin_arm64   | Bin 24454450 -> 24454450 
bytes
 .../plugins/doris-app/gpx_doris-app_linux_amd64    | Bin 24740024 -> 24740024 
bytes
 .../plugins/doris-app/gpx_doris-app_linux_arm      | Bin 23199928 -> 23199928 
bytes
 .../plugins/doris-app/gpx_doris-app_linux_arm64    | Bin 23462072 -> 23462072 
bytes
 .../doris-app/gpx_doris-app_windows_amd64.exe      | Bin 25480192 -> 25480192 
bytes
 src/grafana/plugins/doris-app/module.js            |   4 +-
 src/grafana/plugins/doris-app/module.js.map        |   2 +-
 src/grafana/plugins/doris-app/plugin.json          |   2 +-
 18 files changed, 1040 insertions(+), 632 deletions(-)

diff --git a/src/grafana/plugins/doris-app/181.js 
b/src/grafana/plugins/doris-app/181.js
index e5630b8..ed1e9bd 100644
--- a/src/grafana/plugins/doris-app/181.js
+++ b/src/grafana/plugins/doris-app/181.js
@@ -16,7 +16,7 @@
 /* harmony import */ var jotai__WEBPACK_IMPORTED_MODULE_8__ = 
__webpack_require__(3689);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = 
__webpack_require__(5959);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = 
/*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
-/* harmony import */ var _services_discover__WEBPACK_IMPORTED_MODULE_4__ = 
__webpack_require__(7626);
+/* harmony import */ var _services_traces__WEBPACK_IMPORTED_MODULE_4__ = 
__webpack_require__(3764);
 /* harmony import */ var _store_discover__WEBPACK_IMPORTED_MODULE_5__ = 
__webpack_require__(6247);
 /* harmony import */ var _store_traces__WEBPACK_IMPORTED_MODULE_6__ = 
__webpack_require__(3982);
 /* harmony import */ var _utils_data__WEBPACK_IMPORTED_MODULE_7__ = 
__webpack_require__(6700);
@@ -64,6 +64,7 @@ function TraceDetail(props) {
     const [traceData, setTraceData] = (0,jotai__WEBPACK_IMPORTED_MODULE_8__/* 
.useAtom */ .fp)(_store_discover__WEBPACK_IMPORTED_MODULE_5__/* 
.tableTracesDataAtom */ .UB);
     const selectedRow = (0,jotai__WEBPACK_IMPORTED_MODULE_8__/* .useAtomValue 
*/ .md)(_store_discover__WEBPACK_IMPORTED_MODULE_5__/* .selectedRowAtom */ .nn);
     const selectdbDS = (0,jotai__WEBPACK_IMPORTED_MODULE_8__/* .useAtomValue 
*/ .md)(_store_discover__WEBPACK_IMPORTED_MODULE_5__/* .selectedDatasourceAtom 
*/ .SW);
+    const [loading, setLoading] = 
react__WEBPACK_IMPORTED_MODULE_3___default().useState(false);
     const { open, traceId } = props;
     const getTraceData = 
react__WEBPACK_IMPORTED_MODULE_3___default().useCallback(()=>{
         let payload = {
@@ -74,16 +75,19 @@ function TraceDetail(props) {
             sort: 'DESC',
             trace_id: traceId || ''
         };
-        (0,_services_discover__WEBPACK_IMPORTED_MODULE_4__/* 
.getTableDataTraceService */ .hA)(_object_spread({
+        setLoading(true);
+        (0,_services_traces__WEBPACK_IMPORTED_MODULE_4__/* 
.getTableDataTraceService */ .hA)(_object_spread({
             selectdbDS
         }, payload)).subscribe({
             next: ({ data, ok })=>{
+                setLoading(false);
                 if (ok) {
-                    const formatedData = 
(0,_utils_data__WEBPACK_IMPORTED_MODULE_7__/* .formatTracesResData */ 
.O1)(data);
+                    const formatedData = 
(0,_utils_data__WEBPACK_IMPORTED_MODULE_7__/* .formatTracesResData */ 
.O1)(data.results.getTableDataTrace.frames[0]);
                     setTraceData(formatedData);
                 }
             },
             error: (err)=>{
+                setLoading(false);
                 console.log('查询错误', err);
             }
         });
@@ -108,6 +112,32 @@ function TraceDetail(props) {
         getTraceData,
         traceId
     ]);
+    function renderTracePanel() {
+        if (traceData) {
+            return /*#__PURE__*/ 
react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_grafana_runtime__WEBPACK_IMPORTED_MODULE_1__.PanelRenderer,
 {
+                title: "test",
+                width: 200,
+                height: 300,
+                pluginId: "traces",
+                options: {},
+                data: {
+                    state: loading ? 
_grafana_data__WEBPACK_IMPORTED_MODULE_0__.LoadingState.Loading : 
_grafana_data__WEBPACK_IMPORTED_MODULE_0__.LoadingState.Done,
+                    series: [
+                        traceData
+                    ],
+                    timeRange: {
+                        from: new Date(Date.now() - 15 * 60 * 1000),
+                        to: new Date(),
+                        raw: {
+                            from: 'now-15m',
+                            to: 'now'
+                        }
+                    }
+                }
+            });
+        }
+        return null;
+    }
     return /*#__PURE__*/ 
react__WEBPACK_IMPORTED_MODULE_3___default().createElement((react__WEBPACK_IMPORTED_MODULE_3___default().Fragment),
 null, open && /*#__PURE__*/ 
react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_grafana_ui__WEBPACK_IMPORTED_MODULE_2__.Drawer,
 {
         title: "Trace Panel",
         onClose: ()=>{
@@ -115,27 +145,370 @@ function TraceDetail(props) {
             props === null || props === void 0 ? void 0 : (_props_onClose = 
props.onClose) === null || _props_onClose === void 0 ? void 0 : 
_props_onClose.call(props);
         },
         size: "lg"
-    }, traceData ? /*#__PURE__*/ 
react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_grafana_runtime__WEBPACK_IMPORTED_MODULE_1__.PanelRenderer,
 {
-        title: "test",
-        width: 200,
-        height: 300,
-        pluginId: "traces",
-        options: {},
+    }, loading ? /*#__PURE__*/ 
react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_grafana_ui__WEBPACK_IMPORTED_MODULE_2__.LoadingPlaceholder,
 {
+        text: `Loading`
+    }) : renderTracePanel()));
+}
+
+
+/***/ }),
+
+/***/ 3764:
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+
+// EXPORTS
+__webpack_require__.d(__webpack_exports__, {
+  jo: () => (/* binding */ getOperationListService),
+  FC: () => (/* binding */ getServiceListService),
+  hA: () => (/* binding */ getTableDataTraceService),
+  Cy: () => (/* binding */ getTracesService)
+});
+
+// EXTERNAL MODULE: external "@grafana/runtime"
+var runtime_ = __webpack_require__(8531);
+;// ./services/traces.sql.ts
+// 查询某个Table的Trace详情
+function getQueryTableTraceSQL(params) {
+    const { table, trace_id, database } = params;
+    const sql = `
+      SELECT
+        trace_id AS traceID,
+        span_id AS spanID,
+        parent_span_id AS parentSpanID,
+        span_name AS operationName,
+        service_name AS serviceName,
+        CONCAT(
+          '[',
+          array_join(
+            array_map(
+              (x, y) -> json_object('key', x, 'value', y),
+              map_keys(CAST(CAST(resource_attributes AS TEXT) AS MAP<STRING, 
STRING>)),
+              map_values(CAST(CAST(resource_attributes AS TEXT) AS MAP<STRING, 
STRING>))
+            ),
+            ','
+          ),
+          ']'
+        ) AS serviceTags,
+        UNIX_TIMESTAMP(timestamp) * 1000 AS startTime,
+        duration / 1000 AS duration,
+        CONCAT(
+          '[',
+          array_join(
+            array_map(
+              (x, y) -> json_object('key', x, 'value', y),
+              map_keys(CAST(CAST(span_attributes AS TEXT) AS MAP<STRING, 
STRING>)),
+              map_values(CAST(CAST(span_attributes AS TEXT) AS MAP<STRING, 
STRING>))
+            ),
+            ','
+          ),
+          ']'
+        ) AS tags,
+        span_kind AS kind,
+        CASE status_code
+          WHEN 'STATUS_CODE_OK' THEN 1
+          WHEN 'STATUS_CODE_ERROR' THEN 2
+          ELSE 0
+        END AS statusCode,
+        status_message AS statusMessage,
+        scope_name AS instrumentationLibraryName,
+        scope_version AS instrumentationLibraryVersion,
+        trace_state AS traceState
+      FROM ${database}.\`${table}\`
+      WHERE trace_id = '${trace_id}';
+    `;
+    return sql;
+}
+function parseDuration(input) {
+    if (!input) {
+        return 0;
+    }
+    if (input.endsWith('ms')) {
+        return parseFloat(input.replace('ms', ''));
+    } else if (input.endsWith('us')) {
+        return parseFloat(input.replace('us', '')) / 1000;
+    } else if (input.endsWith('s')) {
+        return parseFloat(input.replace('s', '')) * 1000;
+    }
+    return 0;
+}
+function tagsToDorisSQLConditions(tags) {
+    if (!tags) {
+        return '1=1';
+    }
+    const conditions = [];
+    const regex = /(\w+)=([^\s]+)/g;
+    let match;
+    while((match = regex.exec(tags)) !== null){
+        const key = match[1];
+        const val = match[2];
+        conditions.push(`span_attributes['${key}'] = '${val}'`);
+    }
+    return conditions.length > 0 ? conditions.join(' AND ') : '1=1';
+}
+function buildTraceAggSQLFromParams(params) {
+    const timeFilter = `${params.timeField} >= '${params.startDate}' AND 
${params.timeField} < '${params.endDate}'`;
+    const serviceFilter = params.service_name && params.service_name !== 'all' 
? `service_name = '${params.service_name}'` : '1=1';
+    const operationFilter = params.operation && params.operation !== 'all' ? 
`span_name = '${params.operation}'` : '1=1';
+    const statusFilter = params.statusCode && params.statusCode !== 'all' ? 
`status_code = '${params.statusCode}'` : '1=1';
+    const minDuration = parseDuration(params.minDuration);
+    const maxDuration = parseDuration(params.maxDuration);
+    let durationFilter = '1=1';
+    if (minDuration > 0 && maxDuration > 0) {
+        durationFilter = `trace_duration BETWEEN ${minDuration} AND 
${maxDuration}`;
+    } else if (minDuration > 0) {
+        durationFilter = `trace_duration >= ${minDuration}`;
+    } else if (maxDuration > 0) {
+        durationFilter = `trace_duration <= ${maxDuration}`;
+    }
+    const tagsFilter = tagsToDorisSQLConditions(params.tags);
+    let rootSpansFilter = '1=1';
+    if (params.service_name && params.service_name !== 'all') {
+        rootSpansFilter = `service_name = '${params.service_name}'`;
+    }
+    if (params.operation && params.operation !== 'all') {
+        rootSpansFilter += ` AND span_name = '${params.operation}'`;
+    }
+    var _params_page_size;
+    const limit = (_params_page_size = params.page_size) !== null && 
_params_page_size !== void 0 ? _params_page_size : 1000;
+    var _params_page;
+    const offset = Math.max((((_params_page = params.page) !== null && 
_params_page !== void 0 ? _params_page : 1) - 1) * limit, 0);
+    let rowNumberOrderBy = 'time DESC';
+    switch(params.sortBy){
+        case 'longest-duration':
+            rowNumberOrderBy = 'trace_duration_ms DESC';
+            break;
+        case 'shortest-duration':
+            rowNumberOrderBy = 'trace_duration_ms ASC';
+            break;
+        case 'most-spans':
+            rowNumberOrderBy = 'spans DESC';
+            break;
+        case 'least-spans':
+            rowNumberOrderBy = 'spans ASC';
+            break;
+        case 'most-recent':
+            rowNumberOrderBy = 'time DESC';
+            break;
+    }
+    const query = `
+USE ${params.database};
+
+WITH
+  trace_durations AS (
+    SELECT
+      trace_id,
+      (UNIX_TIMESTAMP(MAX(end_time)) - UNIX_TIMESTAMP(MIN(timestamp))) * 1000 
AS trace_duration
+    FROM ${params.table}
+    WHERE ${timeFilter}
+    GROUP BY trace_id
+  ),
+  all_trace_ids AS (
+    SELECT
+      t.trace_id,
+      MIN(t.${params.timeField}) AS time,
+      d.trace_duration
+    FROM ${params.table} t
+    JOIN trace_durations d ON t.trace_id = d.trace_id
+    WHERE
+      ${timeFilter}
+      AND ${serviceFilter}
+      AND ${operationFilter}
+      AND ${statusFilter}
+      AND ${tagsFilter}
+      AND 1=1
+      AND ${durationFilter}
+    GROUP BY t.trace_id, d.trace_duration
+  ),
+  root_spans AS (
+    SELECT
+      trace_id,
+      span_name AS operation,
+      service_name AS root_service
+    FROM ${params.table}
+    WHERE (parent_span_id IS NULL OR parent_span_id = '') AND 
${rootSpansFilter}
+  ),
+  aggregated AS (
+    SELECT
+      UNIX_TIMESTAMP(MIN(t.${params.timeField})) AS time,
+      t.trace_id,
+      r.operation,
+      r.root_service,
+      COLLECT_SET(t.service_name) AS services,
+      COUNT(*) AS spans,
+      SUM(IF(status_code = 'STATUS_CODE_ERROR', 1, 0)) AS error_spans,
+      MAX(duration) / 1000 AS max_span_duration_ms,
+      MAX(UNIX_TIMESTAMP(t.timestamp) * 1000 + duration / 1000) - 
MIN(UNIX_TIMESTAMP(t.timestamp) * 1000) AS trace_duration_ms,
+      MAX(IF(t.parent_span_id IS NULL OR t.parent_span_id = '', duration, 0)) 
/ 1000 AS root_span_duration_ms
+    FROM ${params.table} t
+    JOIN all_trace_ids a ON t.trace_id = a.trace_id
+    JOIN root_spans r ON t.trace_id = r.trace_id
+    GROUP BY t.trace_id, r.operation, r.root_service
+  ),
+  numbered AS (
+    SELECT
+      a.*,
+      COUNT(*) OVER() AS total_count,
+      ROW_NUMBER() OVER(ORDER BY ${rowNumberOrderBy}) AS rn
+    FROM aggregated a
+  )
+
+SELECT
+  *,
+  total_count AS total
+FROM numbered
+WHERE rn > ${offset} AND rn <= ${offset + limit}
+ORDER BY ${rowNumberOrderBy};
+`;
+    return query;
+}
+function getServiceListSQL(params) {
+    return `
+    SELECT DISTINCT service_name 
+    FROM ${params.table} 
+    WHERE ${params.timeField} BETWEEN '${params.startDate}' AND 
'${params.endDate}' 
+    ORDER BY service_name ASC
+  `;
+}
+function getOperationListSQL(params) {
+    return `
+    SELECT DISTINCT span_name 
+    FROM ${params.table} 
+    WHERE ${params.timeField} BETWEEN '${params.startDate}' AND 
'${params.endDate}' 
+    AND service_name = '${params.service_name}'
+    ORDER BY span_name ASC
+  `;
+}
+
+;// ./services/traces.ts
+function _object_without_properties(source, excluded) {
+    if (source == null) return {};
+    var target = _object_without_properties_loose(source, excluded);
+    var key, i;
+    if (Object.getOwnPropertySymbols) {
+        var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
+        for(i = 0; i < sourceSymbolKeys.length; i++){
+            key = sourceSymbolKeys[i];
+            if (excluded.indexOf(key) >= 0) continue;
+            if (!Object.prototype.propertyIsEnumerable.call(source, key)) 
continue;
+            target[key] = source[key];
+        }
+    }
+    return target;
+}
+function _object_without_properties_loose(source, excluded) {
+    if (source == null) return {};
+    var target = {};
+    var sourceKeys = Object.keys(source);
+    var key, i;
+    for(i = 0; i < sourceKeys.length; i++){
+        key = sourceKeys[i];
+        if (excluded.indexOf(key) >= 0) continue;
+        target[key] = source[key];
+    }
+    return target;
+}
+
+
+// 获取table的Trace数据
+function getTableDataTraceService(payload) {
+    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
+        "selectdbDS"
+    ]);
+    const traceSQL = getQueryTableTraceSQL(rest);
+    return (0,runtime_.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
         data: {
-            state: 
_grafana_data__WEBPACK_IMPORTED_MODULE_0__.LoadingState.Done,
-            series: [
-                traceData
-            ],
-            timeRange: {
-                from: new Date(Date.now() - 15 * 60 * 1000),
-                to: new Date(),
-                raw: {
-                    from: 'now-15m',
-                    to: 'now'
+            queries: [
+                {
+                    refId: 'getTableDataTrace',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: traceSQL,
+                    format: 'table'
                 }
-            }
-        }
-    }) : null));
+            ]
+        },
+        credentials: 'include'
+    });
+}
+// 查询Traces
+function getTracesService(payload) {
+    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
+        "selectdbDS"
+    ]);
+    const getTracesSQL = buildTraceAggSQLFromParams(rest);
+    return (0,runtime_.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getTraces',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: getTracesSQL,
+                    format: 'table'
+                }
+            ]
+        },
+        credentials: 'include'
+    });
+}
+// 查询Trace Services
+function getServiceListService(payload) {
+    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
+        "selectdbDS"
+    ]);
+    const serviceListSQL = getServiceListSQL(rest);
+    return (0,runtime_.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getServiceList',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: serviceListSQL,
+                    format: 'table'
+                }
+            ]
+        },
+        credentials: 'include'
+    });
+}
+// 查询Trace Operations
+function getOperationListService(payload) {
+    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
+        "selectdbDS"
+    ]);
+    const operationListSQL = getOperationListSQL(rest);
+    return (0,runtime_.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getOperationList',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: operationListSQL,
+                    format: 'table'
+                }
+            ]
+        },
+        credentials: 'include'
+    });
 }
 
 
@@ -973,8 +1346,7 @@ function getChartsData(tableDataCharts, currentDate) {
         'asc'
     ]);
 }
-function convertColumnToRow(jsonData) {
-    const frame = jsonData.results[0];
+function convertColumnToRow(frame) {
     const fieldNames = frame.schema.fields.map((f)=>f.name);
     const columns = frame.data.values;
     if (columns.length === 0) {
@@ -986,11 +1358,9 @@ function convertColumnToRow(jsonData) {
         const row = {};
         for(let j = 0; j < columns.length; j++){
             row[fieldNames[j]] = columns[j][i];
-            console.log(frame.schema.fields[j].type.toUpperCase());
             if 
(isValidTimeFieldType(frame.schema.fields[j].type.toUpperCase())) {
                 // 如果是时间字段,转换为 Dayjs 对象
                 row[fieldNames[j]] = 
formatTimestampToDateTime(row[fieldNames[j]], frame.schema.fields[j].precision 
|| 3);
-            // row[fieldNames[j]] = 
dayjs.utc(row[fieldNames[j]]).locale(currentLocale).format('YYYY-MM-DD 
HH:mm:ss.SSS');
             }
             if (frame.schema.fields[j].type === 'VARIANT') {
                 // 如果是 VARIANT 类型,转换为 JSON 对象
@@ -1006,9 +1376,7 @@ function convertColumnToRow(jsonData) {
     return rows;
 }
 // 通过查询 Doris 的字段判断类型,不依赖 Grafana 类型
-function convertColumnToRowViaFieldsType(jsonData, fields) {
-    console.log('fields', fields);
-    const frame = jsonData.results[0];
+function convertColumnToRowViaFieldsType(frame, fields) {
     const fieldNames = frame.schema.fields.map((f)=>f.name);
     const columns = frame.data.values;
     if (columns.length === 0) {
@@ -1051,8 +1419,7 @@ function formatTimestampToDateTime(timestamp, precision = 
3) {
     // 转换时间戳并格式化
     return 
dayjs__WEBPACK_IMPORTED_MODULE_1___default().utc(timestamp).locale(currentLocale).format(formatString);
 }
-function formatTracesResData(resData) {
-    const frame = resData.results[0];
+function formatTracesResData(frame) {
     const { data } = frame;
     const traceDataFrame = {
         name: 'Trace ID',
@@ -1179,232 +1546,6 @@ function generateHighlightedResults(data, result) {
 }
 
 
-/***/ }),
-
-/***/ 7626:
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
-
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   $g: () => (/* binding */ getTableDataCountService),
-/* harmony export */   Cq: () => (/* binding */ getTracesServicesService),
-/* harmony export */   Cy: () => (/* binding */ getTracesService),
-/* harmony export */   EF: () => (/* binding */ getTableDataService),
-/* harmony export */   H7: () => (/* binding */ getTraceOperationsService),
-/* harmony export */   N: () => (/* binding */ getTopDataService),
-/* harmony export */   Rp: () => (/* binding */ getTableDataChartsService),
-/* harmony export */   hA: () => (/* binding */ getTableDataTraceService),
-/* harmony export */   oq: () => (/* binding */ getSurroundingDataService)
-/* harmony export */ });
-/* harmony import */ var _grafana_runtime__WEBPACK_IMPORTED_MODULE_0__ = 
__webpack_require__(8531);
-/* harmony import */ var _grafana_runtime__WEBPACK_IMPORTED_MODULE_0___default 
= 
/*#__PURE__*/__webpack_require__.n(_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__);
-function _define_property(obj, key, value) {
-    if (key in obj) {
-        Object.defineProperty(obj, key, {
-            value: value,
-            enumerable: true,
-            configurable: true,
-            writable: true
-        });
-    } else {
-        obj[key] = value;
-    }
-    return obj;
-}
-function _object_spread(target) {
-    for(var i = 1; i < arguments.length; i++){
-        var source = arguments[i] != null ? arguments[i] : {};
-        var ownKeys = Object.keys(source);
-        if (typeof Object.getOwnPropertySymbols === "function") {
-            ownKeys = 
ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
-                return Object.getOwnPropertyDescriptor(source, sym).enumerable;
-            }));
-        }
-        ownKeys.forEach(function(key) {
-            _define_property(target, key, source[key]);
-        });
-    }
-    return target;
-}
-function ownKeys(object, enumerableOnly) {
-    var keys = Object.keys(object);
-    if (Object.getOwnPropertySymbols) {
-        var symbols = Object.getOwnPropertySymbols(object);
-        if (enumerableOnly) {
-            symbols = symbols.filter(function(sym) {
-                return Object.getOwnPropertyDescriptor(object, sym).enumerable;
-            });
-        }
-        keys.push.apply(keys, symbols);
-    }
-    return keys;
-}
-function _object_spread_props(target, source) {
-    source = source != null ? source : {};
-    if (Object.getOwnPropertyDescriptors) {
-        Object.defineProperties(target, 
Object.getOwnPropertyDescriptors(source));
-    } else {
-        ownKeys(Object(source)).forEach(function(key) {
-            Object.defineProperty(target, key, 
Object.getOwnPropertyDescriptor(source, key));
-        });
-    }
-    return target;
-}
-function _object_without_properties(source, excluded) {
-    if (source == null) return {};
-    var target = _object_without_properties_loose(source, excluded);
-    var key, i;
-    if (Object.getOwnPropertySymbols) {
-        var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
-        for(i = 0; i < sourceSymbolKeys.length; i++){
-            key = sourceSymbolKeys[i];
-            if (excluded.indexOf(key) >= 0) continue;
-            if (!Object.prototype.propertyIsEnumerable.call(source, key)) 
continue;
-            target[key] = source[key];
-        }
-    }
-    return target;
-}
-function _object_without_properties_loose(source, excluded) {
-    if (source == null) return {};
-    var target = {};
-    var sourceKeys = Object.keys(source);
-    var key, i;
-    for(i = 0; i < sourceKeys.length; i++){
-        key = sourceKeys[i];
-        if (excluded.indexOf(key) >= 0) continue;
-        target[key] = source[key];
-    }
-    return target;
-}
-
-function getTableDataService(payload) {
-    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
-        "selectdbDS"
-    ]);
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/table_data',
-        method: 'POST',
-        data: _object_spread_props(_object_spread({}, rest), {
-            ds: selectdbDS.uid
-        }),
-        credentials: 'include'
-    });
-    return response;
-}
-function getTableDataChartsService(payload) {
-    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
-        "selectdbDS"
-    ]);
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/table_data_charts',
-        method: 'POST',
-        data: _object_spread_props(_object_spread({}, rest), {
-            ds: selectdbDS.uid
-        }),
-        credentials: 'include'
-    });
-    return response;
-}
-function getTopDataService(payload) {
-    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
-        "selectdbDS"
-    ]);
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/top_data',
-        method: 'POST',
-        data: _object_spread_props(_object_spread({}, rest), {
-            ds: selectdbDS.uid
-        }),
-        credentials: 'include'
-    });
-    return response;
-}
-function getTableDataCountService(payload) {
-    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
-        "selectdbDS"
-    ]);
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/table_data_count',
-        method: 'POST',
-        data: _object_spread_props(_object_spread({}, rest), {
-            ds: selectdbDS.uid
-        }),
-        credentials: 'include'
-    });
-    return response;
-}
-function getTableDataTraceService(payload) {
-    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
-        "selectdbDS"
-    ]);
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/table_data_trace',
-        method: 'POST',
-        data: _object_spread_props(_object_spread({}, rest), {
-            ds: selectdbDS.uid
-        }),
-        credentials: 'include'
-    });
-    return response;
-}
-function getTracesService(payload) {
-    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
-        "selectdbDS"
-    ]);
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/traces',
-        method: 'POST',
-        data: _object_spread_props(_object_spread({}, rest), {
-            ds: selectdbDS.uid
-        }),
-        credentials: 'include'
-    });
-    return response;
-}
-function getTracesServicesService(payload) {
-    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
-        "selectdbDS"
-    ]);
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/traces_services',
-        method: 'POST',
-        data: _object_spread_props(_object_spread({}, rest), {
-            ds: selectdbDS.uid
-        }),
-        credentials: 'include'
-    });
-    return response;
-}
-function getTraceOperationsService(payload) {
-    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
-        "selectdbDS"
-    ]);
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/traces_operations',
-        method: 'POST',
-        data: _object_spread_props(_object_spread({}, rest), {
-            ds: selectdbDS.uid
-        }),
-        credentials: 'include'
-    });
-    return response;
-}
-function getSurroundingDataService(payload) {
-    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
-        "selectdbDS"
-    ]);
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/surrounding_data',
-        method: 'POST',
-        data: _object_spread_props(_object_spread({}, rest), {
-            ds: selectdbDS.uid
-        }),
-        credentials: 'include'
-    });
-    return response;
-}
-
-
 /***/ }),
 
 /***/ 7944:
@@ -1434,67 +1575,92 @@ var IntervalEnum = /*#__PURE__*/ function(IntervalEnum) 
{
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
 /* harmony export */   H1: () => (/* binding */ getFieldsService),
 /* harmony export */   Hm: () => (/* binding */ getDatabases),
-/* harmony export */   oI: () => (/* binding */ getTables),
+/* harmony export */   Rw: () => (/* binding */ getTablesService),
 /* harmony export */   s1: () => (/* binding */ getIndexesService)
 /* harmony export */ });
 /* harmony import */ var _grafana_runtime__WEBPACK_IMPORTED_MODULE_0__ = 
__webpack_require__(8531);
 /* harmony import */ var _grafana_runtime__WEBPACK_IMPORTED_MODULE_0___default 
= 
/*#__PURE__*/__webpack_require__.n(_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__);
 
-// import { lastValueFrom } from 'rxjs';
 function getDatabases(selectdbDS) {
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/database',
-        method: 'GET',
-        params: {
-            ds: selectdbDS.uid
-        },
-        credentials: 'include'
+    const response$ = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getDatabases',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: 'SHOW DATABASES',
+                    format: 'table'
+                }
+            ]
+        }
     });
-    return response;
-// const res = await lastValueFrom(response);
-// return res;
+    return response$;
 }
-function getTables({ selectdbDS, database }) {
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/table',
-        method: 'GET',
-        params: {
-            ds: selectdbDS.uid,
-            database
-        },
-        credentials: 'include'
+function getTablesService({ selectdbDS, database }) {
+    return 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getTables',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: `SHOW TABLES FROM \`${database}\``,
+                    format: 'table'
+                }
+            ]
+        }
     });
-    return response;
 }
 function getFieldsService({ selectdbDS, database, table }) {
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/fields',
-        method: 'GET',
-        params: {
-            ds: selectdbDS.uid,
-            database,
-            table
-        },
-        credentials: 'include'
+    return 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getFields',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: `SHOW COLUMNS FROM \`${database}\`.\`${table}\``,
+                    format: 'table'
+                }
+            ]
+        }
     });
-    return response;
 }
 function getIndexesService({ selectdbDS, database, table }) {
-    const response = 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
-        url: '/api/plugins/doris-app/resources/indexes',
-        method: 'GET',
-        params: {
-            ds: selectdbDS.uid,
-            database,
-            table
-        },
-        credentials: 'include'
+    return 
(0,_grafana_runtime__WEBPACK_IMPORTED_MODULE_0__.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getIndexes',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: `SHOW INDEXES FROM \`${database}\`.\`${table}\``,
+                    format: 'table'
+                }
+            ]
+        }
     });
-    return response;
 }
 
 
 /***/ })
 
 }]);
-//# sourceMappingURL=181.js.map?_cache=6d914ab9f7dffb39d3ea
\ No newline at end of file
+//# sourceMappingURL=181.js.map?_cache=199c7bc22e9b0ba4a085
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/181.js.map 
b/src/grafana/plugins/doris-app/181.js.map
index 9a93b2d..70c334f 100644
--- a/src/grafana/plugins/doris-app/181.js.map
+++ b/src/grafana/plugins/doris-app/181.js.map
@@ -1 +1 @@
-{"version":3,"file":"181.js?_cache=6d914ab9f7dffb39d3ea","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA6C;AACI;AACZ;AACS;AACL;AACoB;AAC0E;AAClF;AACJ;AAElC,SAASe,YAAYC,KAAgE;IAChG,MAAMC,eAAeb,6DAAYA,CAACS,0EAAqBA;IACvD,MAAMK,iBAAiBd,6DAAYA,CAACI,yEAAkBA;IACtD,MAAMW,kBAAkBf,6DAAYA,CAACK,0EAAmBA;IACxD,MAAM,CAACW,WAAWC,aAAa,GAAGlB,wDAAOA,CAACO,0EAAmBA;IAC7D,MAAMY,cAAclB,6DAAYA,CAACQ,sEAAeA;IAChD,MAAMW,aAAanB,6DAAYA,CAACO,6EAAsBA;IAEtD,MAAM,EAACa,IAAI,EAAEC,OAAO,EAAC,GAAGT;
 [...]
\ No newline at end of file
+{"version":3,"file":"181.js?_cache=199c7bc22e9b0ba4a085","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA6C;AACI;AACQ;AACX;AACL;AACkB;AAC4E;AAClF;AACJ;AAElC,SAASgB,YAAYC,KAAgE;IAChG,MAAMC,eAAeb,6DAAYA,CAACS,0EAAqBA;IACvD,MAAMK,iBAAiBd,6DAAYA,CAACI,yEAAkBA;IACtD,MAAMW,kBAAkBf,6DAAYA,CAACK,0EAAmBA;IACxD,MAAM,CAACW,WAAWC,aAAa,GAAGlB,wDAAOA,CAACO,0EAAmBA;IAC7D,MAAMY,cAAclB,6DAAYA,CAACQ,sEAAeA;IAChD,MAAMW,aAAanB,6DAAYA,CAACO,6EAAsBA;IACtD,MAAM,CAACa,SAASC,WAAW,GAAGpB,qDAAc,CA
 [...]
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/892.js 
b/src/grafana/plugins/doris-app/301.js
similarity index 92%
rename from src/grafana/plugins/doris-app/892.js
rename to src/grafana/plugins/doris-app/301.js
index b82338a..0f08d1d 100644
--- a/src/grafana/plugins/doris-app/892.js
+++ b/src/grafana/plugins/doris-app/301.js
@@ -1,38 +1,7 @@
 "use strict";
-(self["webpackChunkdoris_app"] = self["webpackChunkdoris_app"] || 
[]).push([[892],{
+(self["webpackChunkdoris_app"] = self["webpackChunkdoris_app"] || 
[]).push([[301],{
 
-/***/ 5611:
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
-
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */   b: () => (/* binding */ testIds)
-/* harmony export */ });
-const testIds = {
-    appConfig: {
-        apiKey: 'data-testid ac-api-key',
-        apiUrl: 'data-testid ac-api-url',
-        submit: 'data-testid ac-submit-form'
-    },
-    pageOne: {
-        container: 'data-testid pg-one-container',
-        navigateToFour: 'data-testid navigate-to-four'
-    },
-    pageTwo: {
-        container: 'data-testid pg-two-container'
-    },
-    pageThree: {
-        container: 'data-testid pg-three-container'
-    },
-    pageFour: {
-        container: 'data-testid pg-four-container',
-        navigateBack: 'data-testid navigate-back'
-    }
-};
-
-
-/***/ }),
-
-/***/ 9892:
+/***/ 1301:
 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
 // ESM COMPAT FLAG
@@ -211,26 +180,12 @@ function SearchType() {
 
 
 // import { CodeEditor, CodeEditorSuggestionItem, ReactMonacoEditor } from 
'@grafana/ui';
-function getWordPosLR(str, currentPos) {
-    let posR = currentPos;
-    let posL = currentPos;
-    while(posR < str.length && str.charAt(posR) !== ' '){
-        posR++;
-    }
-    while(posL >= 0 && str.charAt(posL) !== ' '){
-        posL--;
-    }
-    return [
-        posL,
-        posR
-    ];
-}
 function SQLSearch({ style, onQuerying }) {
     const searchType = (0,react/* useAtomValue */.md)(discover/* 
searchTypeAtom */.WM);
-    const setSearchFocus = (0,react/* useSetAtom */.Xr)(discover/* 
searchFocusAtom */.MM);
-    const [tableFields, setTableFields] = (0,react/* useAtom */.fp)(discover/* 
tableFieldsAtom */.D_);
+    // const setSearchFocus = useSetAtom(searchFocusAtom);
+    // const [tableFields, setTableFields] = useAtom(tableFieldsAtom);
     const [searchValue, setSearchValue] = (0,react/* useAtom */.fp)(discover/* 
searchValueAtom */.P8);
-    const currentTimeField = (0,react/* useAtomValue */.md)(discover/* 
currentTimeFieldAtom */.CA);
+    // const currentTimeField = useAtomValue(currentTimeFieldAtom);
     if (false) // removed by dead control flow
 {}
     // const [options, setOptions] = useState<Array<{ value: string; label: 
string }>>([]);
@@ -256,6 +211,8 @@ var utils_data = __webpack_require__(6700);
 var constants = __webpack_require__(2351);
 // EXTERNAL MODULE: ./services/metaservice.ts
 var metaservice = __webpack_require__(8161);
+// EXTERNAL MODULE: external "@grafana/data"
+var data_ = __webpack_require__(7781);
 ;// ./components/discover-header/index.tsx
 'use client';
 function _define_property(obj, key, value) {
@@ -323,24 +280,25 @@ function _object_spread_props(target, source) {
 
 
 
+
 function DiscoverHeader(props) {
-    const catalog = 'internal';
+    // const catalog = 'internal';
     // const catalogs = useAtomValue(catalogAtom);
     const setIndexes = (0,react/* useSetAtom */.Xr)(discover/* indexesAtom 
*/.Eq);
-    const setSearchType = (0,react/* useSetAtom */.Xr)(discover/* 
searchTypeAtom */.WM);
+    // const setSearchType = useSetAtom(searchTypeAtom);
     const [discoverCurrent, setDiscoverCurrent] = (0,react/* useAtom 
*/.fp)(discover/* discoverCurrentAtom */.WN);
     if (false) // removed by dead control flow
 {}
-    const [loc, setLoc] = (0,react/* useAtom */.fp)(discover/* locationAtom 
*/.JT);
-    const [currentCluster, setCurrentCluster] = (0,react/* useAtom 
*/.fp)(discover/* currentClusterAtom */.bP);
+    const [_loc, setLoc] = (0,react/* useAtom */.fp)(discover/* locationAtom 
*/.JT);
+    // const [currentCluster, setCurrentCluster] = useAtom(currentClusterAtom);
     const setTableFields = (0,react/* useSetAtom */.Xr)(discover/* 
tableFieldsAtom */.D_);
     const [timeFields, setTimeFields] = (0,react/* useAtom */.fp)(discover/* 
timeFieldsAtom */.Gg);
-    const [currentDate, setCurrentDate] = (0,react/* useAtom */.fp)(discover/* 
currentDateAtom */.Zb);
+    const [_currentDate, setCurrentDate] = (0,react/* useAtom 
*/.fp)(discover/* currentDateAtom */.Zb);
     const currentTimeField = (0,react/* useAtomValue */.md)(discover/* 
currentTimeFieldAtom */.CA);
     const [currentIndex, setCurrentIndex] = (0,react/* useAtom 
*/.fp)(discover/* currentIndexAtom */.TY);
     const searchFocus = (0,react/* useAtomValue */.md)(discover/* 
searchFocusAtom */.MM);
     // const { databaseList } = useDatabaseList();
-    const [activeItem, setActiveItem] = (0,react/* useAtom */.fp)(discover/* 
activeShortcutAtom */.m_);
+    const [activeItem, _setActiveItem] = (0,react/* useAtom */.fp)(discover/* 
activeShortcutAtom */.m_);
     // const [clusters, setClusters] = useState<any[]>([]);
     // const database = loc.searchParams?.get('database');
     // const table = loc.searchParams?.get('table');
@@ -352,7 +310,7 @@ function DiscoverHeader(props) {
     const [currentTable, setCurrentTable] = (0,react/* useAtom 
*/.fp)(discover/* currentTableAtom */.$w);
     const [databases, setDatabases] = (0,react/* useAtom */.fp)(discover/* 
databasesAtom */.SK);
     const [tables, setTables] = (0,react/* useAtom */.fp)(discover/* 
tablesAtom */.b9);
-    const [datasources, setDataSource] = (0,react/* useAtom */.fp)(discover/* 
datasourcesAtom */.ui);
+    const [_datasources, setDataSource] = (0,react/* useAtom */.fp)(discover/* 
datasourcesAtom */.ui);
     const setDisabledOptions = (0,react/* useSetAtom */.Xr)(discover/* 
disabledOptionsAtom */.IH);
     const searchType = (0,react/* useAtomValue */.md)(discover/* 
searchTypeAtom */.WM);
     const searchMode = searchType === 'Search';
@@ -377,38 +335,29 @@ function DiscoverHeader(props) {
     ]);
     const theme = (0,ui_.useTheme2)();
     (0,external_react_.useEffect)(()=>{
-        if (selectdbDS) {
-            const res = (0,metaservice/* getDatabases */.Hm)(selectdbDS);
-            res.subscribe({
-                next: ({ data, ok })=>{
-                    if (ok) {
-                        var _data_results__data, _data_results_;
-                        const value = data === null || data === void 0 ? void 
0 : (_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? 
void 0 : (_data_results__data = _data_results_.data) === null || 
_data_results__data === void 0 ? void 0 : _data_results__data.values[0];
-                        if (value) {
-                            const options = value.map((item)=>{
-                                return {
-                                    label: item,
-                                    value: item
-                                };
-                            });
-                            setDatabases(options);
-                        }
-                    }
-                },
-                error: (err)=>{
-                    console.log('查询错误', err);
-                }
-            });
+        if (!selectdbDS) {
+            return;
         }
-    // eslint-disable-next-line react-hooks/exhaustive-deps
+        const subscription = (0,metaservice/* getDatabases 
*/.Hm)(selectdbDS).subscribe({
+            next: (resp)=>{
+                const { data, ok } = resp;
+                if (ok) {
+                    const frame = 
(0,data_.toDataFrame)(data.results.getDatabases.frames[0]);
+                    const values = Array.from(frame.fields[0].values);
+                    const options = values.map((item)=>({
+                            label: item,
+                            value: item
+                        }));
+                    setDatabases(options);
+                }
+            },
+            error: (err)=>console.log('查询错误', err)
+        });
+        return ()=>subscription.unsubscribe();
     }, [
-        selectdbDS
+        selectdbDS,
+        setDatabases
     ]);
-    // useEffect(() => {
-    //     if (startTime && endTime) {
-    //         setCurrentDate([dayjs(startTime), dayjs(endTime)]);
-    //     }
-    // }, [startTime, endTime, setCurrentDate]);
     function getFields(selectedTable) {
         (0,metaservice/* getFieldsService */.H1)({
             selectdbDS,
@@ -417,10 +366,11 @@ function DiscoverHeader(props) {
         }).subscribe({
             next: ({ data, ok })=>{
                 if (ok) {
-                    var _data_results__data, _data_results_, 
_data_results__data1, _data_results_1, _data_results__data2, _data_results_2;
-                    const value = data === null || data === void 0 ? void 0 : 
(_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? void 
0 : (_data_results__data = _data_results_.data) === null || _data_results__data 
=== void 0 ? void 0 : _data_results__data.values[0];
-                    const fieldTypes = data === null || data === void 0 ? void 
0 : (_data_results_1 = data.results[0]) === null || _data_results_1 === void 0 
? void 0 : (_data_results__data1 = _data_results_1.data) === null || 
_data_results__data1 === void 0 ? void 0 : _data_results__data1.values[1];
-                    const tableFields = data === null || data === void 0 ? 
void 0 : (_data_results_2 = data.results[0]) === null || _data_results_2 === 
void 0 ? void 0 : (_data_results__data2 = _data_results_2.data) === null || 
_data_results__data2 === void 0 ? void 0 : 
_data_results__data2.values[0].map((item, index)=>{
+                    const frame = 
(0,data_.toDataFrame)(data.results.getFields.frames[0]);
+                    console.log('frame', frame);
+                    const values = Array.from(frame.fields[0].values);
+                    const fieldTypes = Array.from(frame.fields[1].values);
+                    const tableFields = values.map((item, index)=>{
                         return {
                             label: item,
                             Field: item,
@@ -429,9 +379,9 @@ function DiscoverHeader(props) {
                         };
                     });
                     setTableFields(tableFields);
-                    if (value) {
+                    if (values) {
                         var _options_;
-                        const options = value.filter((field, index)=>{
+                        const options = values.filter((field, index)=>{
                             return (0,utils_data/* isValidTimeFieldType 
*/.Q3)(fieldTypes[index].toUpperCase());
                         }).map((item)=>{
                             return {
@@ -459,16 +409,16 @@ function DiscoverHeader(props) {
         }).subscribe({
             next: ({ data, ok })=>{
                 if (ok) {
-                    var _data_results__data, _data_results_, 
_data_results__data1, _data_results_1, _data_results__data2, _data_results_2;
-                    const value = data === null || data === void 0 ? void 0 : 
(_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? void 
0 : (_data_results__data = _data_results_.data) === null || _data_results__data 
=== void 0 ? void 0 : _data_results__data.values[2];
-                    const columnNames = data === null || data === void 0 ? 
void 0 : (_data_results_1 = data.results[0]) === null || _data_results_1 === 
void 0 ? void 0 : (_data_results__data1 = _data_results_1.data) === null || 
_data_results__data1 === void 0 ? void 0 : _data_results__data1.values[4];
-                    const indexesTypes = data === null || data === void 0 ? 
void 0 : (_data_results_2 = data.results[0]) === null || _data_results_2 === 
void 0 ? void 0 : (_data_results__data2 = _data_results_2.data) === null || 
_data_results__data2 === void 0 ? void 0 : _data_results__data2.values[10];
-                    if (!value || value.length === 0) {
+                    const frame = 
(0,data_.toDataFrame)(data.results.getIndexes.frames[0]);
+                    const values = Array.from(frame.fields[2].values);
+                    const columnNames = Array.from(frame.fields[4].values);
+                    const indexesTypes = Array.from(frame.fields[10].values);
+                    if (!values || values.length === 0) {
                         setIndexes([]);
                         setCurrentIndex([]);
                         return;
                     }
-                    const tableIndexes = value === null || value === void 0 ? 
void 0 : value.map((item, index)=>{
+                    const tableIndexes = values === null || values === void 0 
? void 0 : values.map((item, index)=>{
                         return {
                             label: item,
                             value: item,
@@ -523,28 +473,23 @@ function DiscoverHeader(props) {
             setDiscoverCurrent(_object_spread_props(_object_spread({}, 
discoverCurrent), {
                 database: selectedDatabase.value
             }));
-            (0,metaservice/* getTables */.oI)({
+            (0,metaservice/* getTablesService */.Rw)({
                 selectdbDS,
                 database: selectedDatabase.value
             }).subscribe({
-                next: ({ data, ok })=>{
+                next: (resp)=>{
+                    const { data, ok } = resp;
                     if (ok) {
-                        var _data_results__data, _data_results_;
-                        const value = data === null || data === void 0 ? void 
0 : (_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? 
void 0 : (_data_results__data = _data_results_.data) === null || 
_data_results__data === void 0 ? void 0 : _data_results__data.values[0];
-                        if (value) {
-                            const options = value.map((item)=>{
-                                return {
-                                    label: item,
-                                    value: item
-                                };
-                            });
-                            setTables(options);
-                        }
+                        const frame = 
(0,data_.toDataFrame)(data.results.getTables.frames[0]);
+                        const values = Array.from(frame.fields[0].values);
+                        const options = values.map((item)=>({
+                                label: item,
+                                value: item
+                            }));
+                        setTables(options);
                     }
                 },
-                error: (err)=>{
-                    console.log('查询错误', err);
-                }
+                error: (err)=>console.log('查询错误', err)
             });
         }
     })), /*#__PURE__*/ external_react_default().createElement(ui_.Field, {
@@ -584,7 +529,7 @@ function DiscoverHeader(props) {
             props === null || props === void 0 ? void 0 : props.onQuerying();
         }
     }))), !searchFocus && /*#__PURE__*/ 
external_react_default().createElement((external_react_default()).Fragment, 
null, /*#__PURE__*/ external_react_default().createElement(ui_.Field, {
-        label: "时间字段"
+        label: "Time Field"
     }, /*#__PURE__*/ external_react_default().createElement(ui_.Select, {
         value: currentTimeField,
         options: timeFields,
@@ -600,9 +545,9 @@ function DiscoverHeader(props) {
                 });
             });
         },
-        placeholder: '时间字段'
+        placeholder: 'Time Field'
     })), /*#__PURE__*/ external_react_default().createElement(ui_.Field, {
-        label: "时间范围",
+        label: "Time Range",
         style: {
             marginLeft: 8,
             marginRight: 8
@@ -647,7 +592,7 @@ function DiscoverHeader(props) {
         },
         variant: "primary",
         className: "h-8",
-        icon: (props === null || props === void 0 ? void 0 : props.loading) ? 
"fa fa-spinner" : 'sync',
+        icon: (props === null || props === void 0 ? void 0 : props.loading) ? 
'fa fa-spinner' : 'sync',
         disabled: !currentTimeField
     }, `Query`)));
 }
@@ -810,7 +755,7 @@ function FilterContent({ onHide, dataFilterValue }) {
             showLabel: !!(dataFilterValue === null || dataFilterValue === void 
0 ? void 0 : dataFilterValue.label)
         }
     });
-    const field = watch('field');
+    // const field: any = watch('field');
     const operator = watch('operator');
     const showLabel = watch('showLabel');
     const getValue = (value)=>isNaN(+value) ? value : +value;
@@ -1057,7 +1002,7 @@ function DiscoverFilter() {
     const [dataFilterOpen, setDataFilterOpen] = 
(0,external_react_.useState)({});
     const discoverFilterRef = (0,external_react_.useRef)(null);
     const { t } = (0,es/* useTranslation */.Bd)();
-    const [loc, setLoc] = (0,react/* useAtom */.fp)(discover/* locationAtom 
*/.JT);
+    const [_loc, setLoc] = (0,react/* useAtom */.fp)(discover/* locationAtom 
*/.JT);
     const theme = (0,ui_.useTheme2)();
     return(//  className="mt-px rounded-b-sm bg-n8 p-4 pb-6"
     /*#__PURE__*/ 
external_react_default().createElement(DiscoverFilterWrapper, {
@@ -1627,9 +1572,9 @@ function filter_content_FilterContent() {
 function DiscoverSidebar() {
     const [selectedFields, setSelectedFields] = (0,react/* useAtom 
*/.fp)(discover/* selectedFieldsAtom */.Wg);
     const tableFields = (0,react/* useAtomValue */.md)(discover/* 
tableFieldsAtom */.D_);
-    const [searchable, setSearchable] = (0,react/* useAtom */.fp)(discover/* 
searchableAtom */.Mb);
-    const [aggregatable, setAggregatable] = (0,react/* useAtom 
*/.fp)(discover/* aggregatableAtom */.UR);
-    const [fieldType, setFieldType] = (0,react/* useAtom */.fp)(discover/* 
fieldTypeAtom */.m5);
+    const [searchable, _setSearchable] = (0,react/* useAtom */.fp)(discover/* 
searchableAtom */.Mb);
+    const [aggregatable, _setAggregatable] = (0,react/* useAtom 
*/.fp)(discover/* aggregatableAtom */.UR);
+    const [fieldType, _setFieldType] = (0,react/* useAtom */.fp)(discover/* 
fieldTypeAtom */.m5);
     const [searchValue, setSearchValue] = (0,external_react_.useState)('');
     const indexes = (0,react/* useAtomValue */.md)(discover/* indexesAtom 
*/.Eq);
     const theme = (0,ui_.useTheme2)();
@@ -1643,6 +1588,7 @@ function DiscoverSidebar() {
         if (aggregatable === utils_data/* AggregatableEnum */.SY.NO) {
             return (0,utils_data/* getFieldType */.Re)(field.Type) !== 
'NUMBER';
         }
+        return false;
     }).filter((field)=>{
         if (searchable === utils_data/* SearchableEnum */.Yp.ANY) {
             return true;
@@ -1653,6 +1599,7 @@ function DiscoverSidebar() {
         if (searchable === utils_data/* SearchableEnum */.Yp.NO) {
             return !indexes.some((index)=>field.Field === index.Field);
         }
+        return false;
     }).filter((field)=>{
         if (fieldType === utils_data/* FieldTypeEnum */.wI.ANY) {
             return true;
@@ -1856,9 +1803,9 @@ function DiscoverHistogram() {
     if (false) // removed by dead control flow
 {}
     const tableTotalCount = (0,react/* useAtomValue */.md)(discover/* 
tableTotalCountAtom */.HC);
-    const [timeRange, setTimeRange] = (0,react/* useAtom */.fp)(discover/* 
timeRangeAtom */.U9);
-    const [pageSize, setPageSize] = (0,react/* useAtom */.fp)(discover/* 
pageSizeAtom */.Ol);
-    const [page, setPage] = (0,react/* useAtom */.fp)(discover/* pageAtom 
*/.fs);
+    const [_timeRange, setTimeRange] = (0,react/* useAtom */.fp)(discover/* 
timeRangeAtom */.U9);
+    const [_pageSize, setPageSize] = (0,react/* useAtom */.fp)(discover/* 
pageSizeAtom */.Ol);
+    const setPage = (0,react/* useSetAtom */.Xr)(discover/* pageAtom */.fs);
     (0,external_react_.useEffect)(()=>{
         const v = (0,constants/* getAutoInterval 
*/.Vy)(currentDate).interval_value;
         setInterval_value(v);
@@ -1883,7 +1830,7 @@ function DiscoverHistogram() {
     }
     const options = {
         title: {
-            subtext: `${`时间间隔`}: ${timeInterval}`,
+            subtext: `${`Time Interval`}: ${timeInterval}`,
             left: 'right',
             top: 12
         },
@@ -2029,13 +1976,14 @@ function DiscoverHistogram() {
                     }
                 });
                 chart.getEchartsInstance().on('brushEnd', handler);
+                return ()=>{
+                    if (chart.ele) {
+                        chart.getEchartsInstance().off('brushEnd', handler);
+                    }
+                };
             }
-            return ()=>{
-                if (chart.ele) {
-                    chart.getEchartsInstance().off('brushEnd', handler);
-                }
-            };
         }
+        return undefined;
     // eslint-disable-next-line react-hooks/exhaustive-deps
     }, [
         tableDataCharts
@@ -2992,8 +2940,270 @@ function SurroundingDiscoverFilter(props) {
 
 // EXTERNAL MODULE: ../node_modules/lodash-es/sortBy.js + 7 modules
 var sortBy = __webpack_require__(5092);
-// EXTERNAL MODULE: ./services/discover.ts
-var services_discover = __webpack_require__(7626);
+;// ./services/sql.ts
+function getQueryTableResultSQL(params) {
+    const indexesStatement = params.indexesStatement;
+    let statement = `SELECT * FROM \`${params.database}\`.\`${params.table}\` 
WHERE`;
+    if (indexesStatement && params.search_type === 'Search') {
+        statement += ` (${indexesStatement}) AND`;
+    }
+    // timeField 加上反引号
+    statement += ` (\`${params.timeField}\` BETWEEN '${params.startDate}' AND 
'${params.endDate}') `;
+    statement = params.data_filters.reduce((prev, curr)=>{
+        return addSqlFilter(prev, curr);
+    }, statement);
+    if (params.search_type === 'SQL' && params.search_value) {
+        statement = statement + ` AND ${params.search_value}`;
+    }
+    // ORDER BY 的 timeField 也加反引号
+    statement = statement + ` ORDER BY \`${params.timeField}\` DESC LIMIT 
${+params.page_size} OFFSET ${(+(params === null || params === void 0 ? void 0 
: params.page) - 1) * params.page_size} `;
+    return statement;
+}
+function getQueryTableChartsSQL(params) {
+    const indexes = params.indexes;
+    console.log(params);
+    let statement = `SELECT 
${params.interval}_FLOOR(table_per_time.T,${params.interval_value}) as 
TT,sum(table_per_time.cnt) FROM (SELECT 
${params.interval}_FLOOR(${params.timeField}) as T,count(*) as cnt FROM 
\`${params.database}\`.\`${params.table}\` WHERE`;
+    if (indexes && params.search_type === 'Search') {
+        statement += ` (${indexes}) AND`;
+    }
+    statement += ` (\`${params.timeField}\` between '${params.startDate}' AND 
'${params.endDate}') `;
+    if (params.data_filters.length > 0) {
+        statement = params.data_filters.reduce((prev, curr)=>{
+            return addSqlFilter(prev, curr);
+        }, statement);
+    }
+    if (params.search_type === 'SQL' && params.search_value) {
+        statement = statement + ` ` + `AND ${params.search_value}`;
+    }
+    statement = statement + ` ` + `GROUP BY T ORDER BY T) as table_per_time 
GROUP BY TT ORDER BY TT`;
+    return statement;
+}
+function getQueryTableResultCountSQL(params) {
+    const indexes = params.indexes;
+    let statement = `SELECT SUM(table_per_time.cnt) AS total_count
+        FROM (
+          SELECT ${params.interval}_FLOOR(${params.timeField}) as T, COUNT(*) 
as cnt
+          FROM \`${params.database}\`.\`${params.table}\`
+          WHERE`;
+    if (indexes && params.search_type === 'Search') {
+        statement += ` (${indexes}) AND`;
+    }
+    statement += ` (\`${params.timeField}\` between '${params.startDate}' AND 
'${params.endDate}')`;
+    if (params.data_filters.length > 0) {
+        statement = params.data_filters.reduce((prev, curr)=>{
+            return addSqlFilter(prev, curr);
+        }, statement);
+    }
+    if (params.search_type === 'SQL' && params.search_value) {
+        statement = statement + ` ` + `AND ${params.search_value}`;
+    }
+    statement = statement + ` ` + `GROUP BY T) AS table_per_time;`;
+    return statement;
+}
+function getSurroundingSQL(params) {
+    let statement = `SELECT * FROM \`${params.database}\`.\`${params.table}\` 
WHERE`;
+    statement += ` (${params.timeField} ${params.operator} '${params.time}')`;
+    statement = params.data_filters.reduce((prev, curr)=>{
+        return addSqlFilter(prev, curr);
+    }, statement);
+    const orderSymbol = params.operator === '<' ? 'DESC' : 'ASC';
+    statement = statement + ` ` + `ORDER BY \`${params.timeField}\` 
${orderSymbol} LIMIT ${+params.pageSize}`;
+    return statement;
+}
+function getFilterSQL({ fieldName, operator, value }) {
+    const valueString = value.map((e)=>{
+        if (typeof e === 'string') {
+            return `'${e}'`;
+        } else {
+            return e;
+        }
+    });
+    const transformedFieldName = transformFieldPath(fieldName);
+    if (operator === '=' || operator === '!=' || operator === 'like' || 
operator === 'not like' || operator === 'match_all' || operator === 'match_any' 
|| operator === 'match_phrase') {
+        return `${transformedFieldName} ${operator} ${valueString[0]}`;
+    }
+    if (operator === 'is null' || operator === 'is not null') {
+        return `${transformedFieldName} ${operator}`;
+    }
+    if (operator === 'between' || operator === 'not between') {
+        return `${transformedFieldName} ${operator} ${valueString[0]} AND 
${valueString[1]}`;
+    }
+    if (operator === 'in' || operator === 'not in') {
+        return `${transformedFieldName} ${operator} (${valueString})`;
+    }
+    return '';
+}
+function addSqlFilter(sql, dataFilterValue) {
+    let result = sql;
+    if (!sql.toUpperCase().includes('WHERE')) {
+        result += ' WHERE';
+    } else {
+        result += ' AND';
+    }
+    result += ` (${getFilterSQL(dataFilterValue)})`;
+    return result;
+}
+function transformFieldPath(fieldPath) {
+    const parts = fieldPath.split('.');
+    return parts[0] + parts.slice(1).map((part)=>`['${part}']`).join('');
+}
+
+;// ./services/discover.ts
+function _object_without_properties(source, excluded) {
+    if (source == null) return {};
+    var target = _object_without_properties_loose(source, excluded);
+    var key, i;
+    if (Object.getOwnPropertySymbols) {
+        var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
+        for(i = 0; i < sourceSymbolKeys.length; i++){
+            key = sourceSymbolKeys[i];
+            if (excluded.indexOf(key) >= 0) continue;
+            if (!Object.prototype.propertyIsEnumerable.call(source, key)) 
continue;
+            target[key] = source[key];
+        }
+    }
+    return target;
+}
+function _object_without_properties_loose(source, excluded) {
+    if (source == null) return {};
+    var target = {};
+    var sourceKeys = Object.keys(source);
+    var key, i;
+    for(i = 0; i < sourceKeys.length; i++){
+        key = sourceKeys[i];
+        if (excluded.indexOf(key) >= 0) continue;
+        target[key] = source[key];
+    }
+    return target;
+}
+
+
+function getTableDataService(payload) {
+    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
+        "selectdbDS"
+    ]);
+    const QueryTableResultSQL = getQueryTableResultSQL(rest);
+    const response = (0,runtime_.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getTableData',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: QueryTableResultSQL,
+                    format: 'table'
+                }
+            ]
+        },
+        credentials: 'include'
+    });
+    return response;
+}
+function getTableDataChartsService(payload) {
+    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
+        "selectdbDS"
+    ]);
+    const QueryTableChartsSQL = getQueryTableChartsSQL(rest);
+    const response = (0,runtime_.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getTableDataCharts',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: QueryTableChartsSQL,
+                    format: 'table'
+                }
+            ]
+        },
+        credentials: 'include'
+    });
+    return response;
+}
+function getTopDataService(payload) {
+    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
+        "selectdbDS"
+    ]);
+    const QueryTableResultSQL = getQueryTableResultSQL(rest);
+    const response = (0,runtime_.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getTableTopData',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: QueryTableResultSQL,
+                    format: 'table'
+                }
+            ]
+        },
+        credentials: 'include'
+    });
+    return response;
+}
+function getTableDataCountService(payload) {
+    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
+        "selectdbDS"
+    ]);
+    const QueryTableResultCountSQL = getQueryTableResultCountSQL(rest);
+    const response = (0,runtime_.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getTableCountData',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: QueryTableResultCountSQL,
+                    format: 'table'
+                }
+            ]
+        },
+        credentials: 'include'
+    });
+    return response;
+}
+function getSurroundingDataService(payload) {
+    const { selectdbDS } = payload, rest = _object_without_properties(payload, 
[
+        "selectdbDS"
+    ]);
+    const surroundingSQL = getSurroundingSQL(rest);
+    const response = (0,runtime_.getBackendSrv)().fetch({
+        url: '/api/ds/query',
+        method: 'POST',
+        data: {
+            queries: [
+                {
+                    refId: 'getSurroundingData',
+                    datasource: {
+                        type: 'mysql',
+                        uid: selectdbDS.uid
+                    },
+                    rawSql: surroundingSQL,
+                    format: 'table'
+                }
+            ]
+        },
+        credentials: 'include'
+    });
+    return response;
+}
+
 // EXTERNAL MODULE: external "rxjs"
 var external_rxjs_ = __webpack_require__(1269);
 ;// ./utils/utils.ts
@@ -3309,12 +3519,12 @@ function generateTableDataUID(items) {
 
 function SurroundingContentTableActions({ fieldName, fieldValue }) {
     console.log(fieldName, fieldValue);
-    const [selectedSurroundingFields, setSelectedSurroundingFields] = 
(0,react/* useAtom */.fp)(discover/* surroundingSelectedFieldsAtom */.gj);
+    // const [selectedSurroundingFields, setSelectedSurroundingFields] = 
useAtom(surroundingSelectedFieldsAtom);
     const [surroundingDataFilter, setSurroundingDataFilter] = (0,react/* 
useAtom */.fp)(discover/* surroundingDataFilterAtom */.wc);
     const tableFields = (0,react/* useAtomValue */.md)(discover/* 
tableFieldsAtom */.D_);
     const fieldType = tableFields.find((field)=>field.Field === 
fieldName).Type;
-    const hasField = selectedSurroundingFields.some((item)=>item.Field === 
fieldName);
-    const filterValue = typeof fieldValue === 'object' ? 
JSON.stringify(fieldValue) : fieldValue;
+    // const hasField = selectedSurroundingFields.some((item: any) => 
item.Field === fieldName);
+    // const filterValue = typeof fieldValue === 'object' ? 
JSON.stringify(fieldValue) : fieldValue;
     return /*#__PURE__*/ 
external_react_default().createElement((external_react_default()).Fragment, 
null, /*#__PURE__*/ external_react_default().createElement("div", {
         className: "icons",
         style: {
@@ -3465,6 +3675,7 @@ function surrounding_logs_object_spread_props(target, 
source) {
 
 
 
+// import dayjs from 'dayjs';
 
 
 
@@ -3518,14 +3729,14 @@ function SurroundingLogs() {
             time
         });
         console.log(params.time);
-        return (0,external_rxjs_.lastValueFrom)((0,services_discover/* 
getSurroundingDataService */.oq)(surrounding_logs_object_spread({
+        return 
(0,external_rxjs_.lastValueFrom)(getSurroundingDataService(surrounding_logs_object_spread({
             selectdbDS
         }, params)));
     }, {
         manual: true,
         onSuccess: (res, 
params)=>surrounding_logs_async_to_generator(function*() {
                 if (res.ok) {
-                    const rowsData = (0,utils_data/* convertColumnToRow 
*/.HL)(res.data);
+                    const rowsData = (0,utils_data/* convertColumnToRow 
*/.HL)(res.data.results.getSurroundingData.frames[0]);
                     const result = generateSurroundingResult(rowsData, 
currentTimeField);
                     let data = [
                         ...surroundingTableData
@@ -3564,14 +3775,14 @@ function SurroundingLogs() {
             operator: '<',
             time
         });
-        return (0,external_rxjs_.lastValueFrom)((0,services_discover/* 
getSurroundingDataService */.oq)(surrounding_logs_object_spread({
+        return 
(0,external_rxjs_.lastValueFrom)(getSurroundingDataService(surrounding_logs_object_spread({
             selectdbDS
         }, params)));
     }, {
         manual: true,
         onSuccess: (res, 
params)=>surrounding_logs_async_to_generator(function*() {
                 if (res.ok) {
-                    const rowsData = (0,utils_data/* convertColumnToRow 
*/.HL)(res.data);
+                    const rowsData = (0,utils_data/* convertColumnToRow 
*/.HL)(res.data.results.getSurroundingData.frames[0]);
                     const result = generateSurroundingResult(rowsData, 
currentTimeField);
                     let data = [
                         ...surroundingTableData
@@ -3603,10 +3814,10 @@ function SurroundingLogs() {
             operator: '>'
         });
         return Promise.all([
-            (0,external_rxjs_.lastValueFrom)((0,services_discover/* 
getSurroundingDataService */.oq)(surrounding_logs_object_spread({
+            
(0,external_rxjs_.lastValueFrom)(getSurroundingDataService(surrounding_logs_object_spread({
                 selectdbDS
             }, prevTimeParams))),
-            (0,external_rxjs_.lastValueFrom)((0,services_discover/* 
getSurroundingDataService */.oq)(surrounding_logs_object_spread({
+            
(0,external_rxjs_.lastValueFrom)(getSurroundingDataService(surrounding_logs_object_spread({
                 selectdbDS
             }, afterTimeParams)))
         ]);
@@ -3616,8 +3827,8 @@ function SurroundingLogs() {
         ],
         onSuccess: (res)=>surrounding_logs_async_to_generator(function*() {
                 if (res[0].ok && res[1].ok) {
-                    const rowsData1 = (0,utils_data/* convertColumnToRow 
*/.HL)(res[0].data);
-                    const rowsData2 = (0,utils_data/* convertColumnToRow 
*/.HL)(res[1].data);
+                    const rowsData1 = (0,utils_data/* convertColumnToRow 
*/.HL)(res[0].data.results.getSurroundingData.frames[0]);
+                    const rowsData2 = (0,utils_data/* convertColumnToRow 
*/.HL)(res[1].data.results.getSurroundingData.frames[0]);
                     const result1 = generateSurroundingResult(rowsData1, 
currentTimeField);
                     const result2 = generateSurroundingResult(rowsData2, 
currentTimeField);
                     const selectedResult = generateSurroundingResult([
@@ -4063,22 +4274,22 @@ function DiscoverContent({ fetchNextPage, getTraceData 
}) {
     const theme = (0,ui_.useTheme2)();
     const [fields, setFields] = (0,external_react_.useState)([]);
     const tableTotalCount = (0,react/* useAtomValue */.md)(discover/* 
tableTotalCountAtom */.HC);
-    const [tableData, setTableData] = (0,react/* useAtom */.fp)(discover/* 
tableDataAtom */.q3);
+    const [tableData, _setTableData] = (0,react/* useAtom */.fp)(discover/* 
tableDataAtom */.q3);
     const [selectedFields, setSelectedFields] = (0,react/* useAtom 
*/.fp)(discover/* selectedFieldsAtom */.Wg);
     const hasSelectedFields = selectedFields.length > 0;
     const currentTimeField = (0,react/* useAtomValue */.md)(discover/* 
currentTimeFieldAtom */.CA);
-    const [surroundingOpen, setSurroundingOpen] = 
(0,external_react_.useState)(false);
+    // const [surroundingOpen, setSurroundingOpen] = useState(false);
     const [selectedRow, setSelectedRow] = (0,react/* useAtom */.fp)(discover/* 
selectedRowAtom */.nn);
     const setSurroundingTableData = (0,react/* useSetAtom */.Xr)(discover/* 
surroundingTableDataAtom */.mj);
     const setSurroundingDataFilter = (0,react/* useSetAtom */.Xr)(discover/* 
surroundingDataFilterAtom */.wc);
     const setSelectedSurroundingFields = (0,react/* useSetAtom 
*/.Xr)(discover/* surroundingSelectedFieldsAtom */.gj);
     const setBeforeCount = (0,react/* useSetAtom */.Xr)(discover/* 
beforeCountAtom */.cn);
     const setAfterCount = (0,react/* useSetAtom */.Xr)(discover/* 
afterCountAtom */.f5);
-    const [pageSize, setPageSize] = (0,react/* useAtom */.fp)(discover/* 
pageSizeAtom */.Ol);
+    const [pageSize, _setPageSize] = (0,react/* useAtom */.fp)(discover/* 
pageSizeAtom */.Ol);
     const [page, setPage] = (0,react/* useAtom */.fp)(discover/* pageAtom 
*/.fs);
     const [drawerOpen, setDrawerOpen] = (0,external_react_.useState)(false);
     const [surroundingLogsOpen, setSurroundingLogsOpen] = 
(0,external_react_.useState)(false);
-    const [fieldKeyBg, setFieldKeyBg] = 
(0,external_react_.useState)('#3f3f4f');
+    const [_fieldKeyBg, setFieldKeyBg] = 
(0,external_react_.useState)('#3f3f4f');
     (0,external_react_.useEffect)(()=>{
         if (theme.isDark) {
             setFieldKeyBg('#3f3f4f');
@@ -4449,6 +4660,8 @@ function DiscoverContent({ fetchNextPage, getTraceData }) 
{
     }, /*#__PURE__*/ external_react_default().createElement(SurroundingLogs, 
null)));
 }
 
+// EXTERNAL MODULE: ./services/traces.ts + 1 modules
+var traces = __webpack_require__(3764);
 ;// ./pages/PageDiscover.tsx
 function PageDiscover_asyncGeneratorStep(gen, resolve, reject, _next, _throw, 
key, arg) {
     try {
@@ -4547,6 +4760,8 @@ function PageDiscover_object_spread_props(target, source) 
{
 
 
 
+
+
 function PageDiscover() {
     const [page, setPage] = (0,react/* useAtom */.fp)(discover/* pageAtom 
*/.fs);
     const pageSize = (0,react/* useAtomValue */.md)(discover/* pageSizeAtom 
*/.Ol);
@@ -4580,7 +4795,7 @@ function PageDiscover() {
             getTableDataCount();
         } else {
             setTableDataCharts([]);
-            setTableTotalCount(NaN);
+            setTableTotalCount(0);
             setTableData([]);
             setTopData([]);
         }
@@ -4623,7 +4838,7 @@ function PageDiscover() {
         if (searchValue) {
             payload.search_value = searchType === 'Search' ? (0,utils_data/* 
encodeBase64 */.WG)(searchValue) : searchValue;
         }
-        (0,services_discover/* getTableDataService 
*/.EF)(PageDiscover_object_spread({
+        getTableDataService(PageDiscover_object_spread({
             selectdbDS
         }, payload)).subscribe({
             next: ({ data, ok })=>PageDiscover_async_to_generator(function*() {
@@ -4631,7 +4846,7 @@ function PageDiscover() {
                             getTableData: false
                         }));
                     if (ok) {
-                        const rowsData = (0,utils_data/* convertColumnToRow 
*/.HL)(data);
+                        const rowsData = (0,utils_data/* convertColumnToRow 
*/.HL)(data.results.getTableData.frames[0]);
                         const resData = (0,utils_data/* 
generateHighlightedResults */.F9)({
                             search_value: searchValue,
                             indexes: currentIndexes || []
@@ -4667,6 +4882,7 @@ function PageDiscover() {
             startDate: (_currentDate_ = currentDate[0]) === null || 
_currentDate_ === void 0 ? void 0 : _currentDate_.format(constants/* 
FORMAT_DATE */.fU),
             endDate: currentDate[1].format(constants/* FORMAT_DATE */.fU),
             cluster: '',
+            data_filters: [],
             // cluster: shouldUseClusterParam() ? currentCluster : '',
             sort: 'DESC',
             interval: timeInterval,
@@ -4680,7 +4896,7 @@ function PageDiscover() {
         if (searchValue) {
             payload.search_value = searchType === 'Search' ? (0,utils_data/* 
encodeBase64 */.WG)(searchValue) : searchValue;
         }
-        (0,services_discover/* getTableDataChartsService 
*/.Rp)(PageDiscover_object_spread({
+        getTableDataChartsService(PageDiscover_object_spread({
             selectdbDS
         }, payload)).subscribe({
             next: ({ data, ok })=>{
@@ -4688,17 +4904,18 @@ function PageDiscover() {
                         getTableDataCharts: false
                     }));
                 if (ok) {
-                    var _data_results__data, _data_results_, 
_data_results__data1, _data_results_1;
-                    const value = data === null || data === void 0 ? void 0 : 
(_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? void 
0 : (_data_results__data = _data_results_.data) === null || _data_results__data 
=== void 0 ? void 0 : _data_results__data.values[0];
-                    if (!value || value.length === 0) {
+                    var _frame_fields_, _frame_fields_1;
+                    const frame = 
(0,data_.toDataFrame)(data.results.getTableDataCharts.frames[0]);
+                    const times = Array.from((frame === null || frame === void 
0 ? void 0 : (_frame_fields_ = frame.fields[0]) === null || _frame_fields_ === 
void 0 ? void 0 : _frame_fields_.values) || []);
+                    const values = Array.from((frame === null || frame === 
void 0 ? void 0 : (_frame_fields_1 = frame.fields[1]) === null || 
_frame_fields_1 === void 0 ? void 0 : _frame_fields_1.values) || []);
+                    if (!times || times.length === 0 || !values || 
values.length === 0) {
                         setTableDataCharts([]);
                         return;
                     }
-                    const tableDataCharts = data === null || data === void 0 ? 
void 0 : (_data_results_1 = data.results[0]) === null || _data_results_1 === 
void 0 ? void 0 : (_data_results__data1 = _data_results_1.data) === null || 
_data_results__data1 === void 0 ? void 0 : 
_data_results__data1.values[0].map((item, index)=>{
-                        var _data_results__data, _data_results_;
+                    const tableDataCharts = times.map((item, index)=>{
                         return {
                             TT: item,
-                            'sum(cnt)': data === null || data === void 0 ? 
void 0 : (_data_results_ = data.results[0]) === null || _data_results_ === void 
0 ? void 0 : (_data_results__data = _data_results_.data) === null || 
_data_results__data === void 0 ? void 0 : _data_results__data.values[1][index]
+                            'sum(cnt)': values[index]
                         };
                     });
                     const chartsData = (0,utils_data/* getChartsData 
*/.Wd)(tableDataCharts, currentDate);
@@ -4744,13 +4961,12 @@ function PageDiscover() {
         if (searchValue) {
             payload.search_value = searchType === 'Search' ? (0,utils_data/* 
encodeBase64 */.WG)(searchValue) : searchValue;
         }
-        (0,services_discover/* getTopDataService 
*/.N)(PageDiscover_object_spread({
+        getTopDataService(PageDiscover_object_spread({
             selectdbDS
         }, payload)).subscribe({
             next: ({ data, ok })=>{
                 if (ok) {
-                    const rowsData = (0,utils_data/* 
convertColumnToRowViaFieldsType */.ml)(data, tableFields);
-                    console.log('rowsData', rowsData);
+                    const rowsData = (0,utils_data/* 
convertColumnToRowViaFieldsType */.ml)(data.results.getTableTopData.frames[0], 
tableFields);
                     setTopData(rowsData);
                 }
             },
@@ -4779,6 +4995,7 @@ function PageDiscover() {
             // cluster: shouldUseClusterParam() ? currentCluster : '',
             sort: 'DESC',
             interval: timeInterval,
+            data_filters: [],
             interval_value: timeIntervalValue,
             search_type: searchType,
             indexes: indexesStatement
@@ -4789,13 +5006,13 @@ function PageDiscover() {
         if (searchValue) {
             payload.search_value = searchType === 'Search' ? (0,utils_data/* 
encodeBase64 */.WG)(searchValue) : searchValue;
         }
-        (0,services_discover/* getTableDataCountService 
*/.$g)(PageDiscover_object_spread({
+        getTableDataCountService(PageDiscover_object_spread({
             selectdbDS
         }, payload)).subscribe({
             next: ({ data, ok })=>{
                 if (ok) {
-                    var _data_results__data, _data_results_;
-                    const total_count = data === null || data === void 0 ? 
void 0 : (_data_results_ = data.results[0]) === null || _data_results_ === void 
0 ? void 0 : (_data_results__data = _data_results_.data) === null || 
_data_results__data === void 0 ? void 0 : _data_results__data.values[0];
+                    const frame = 
(0,data_.toDataFrame)(data.results.getTableCountData.frames[0]);
+                    const total_count = frame.fields[0].values[0];
                     if (!total_count) {
                         setTableTotalCount(0);
                         return;
@@ -4814,7 +5031,7 @@ function PageDiscover() {
         let payload = {
             catalog: currentCatalog,
             database: currentDatabase,
-            table: 'otel_traces',
+            table: currentTable || 'otel_traces',
             timeField: currentTimeField,
             startDate: (_currentDate_ = currentDate[0]) === null || 
_currentDate_ === void 0 ? void 0 : _currentDate_.format(constants/* 
FORMAT_DATE */.fU),
             endDate: currentDate[1].format(constants/* FORMAT_DATE */.fU),
@@ -4837,7 +5054,7 @@ function PageDiscover() {
         if (searchValue) {
             payload.search_value = (0,utils_data/* encodeBase64 
*/.WG)(searchValue);
         }
-        (0,services_discover/* getTableDataTraceService 
*/.hA)(PageDiscover_object_spread({
+        (0,traces/* getTableDataTraceService 
*/.hA)(PageDiscover_object_spread({
             selectdbDS
         }, payload)).subscribe({
             next: ({ data, ok })=>{
@@ -4860,7 +5077,7 @@ function PageDiscover() {
             getTopData();
         } else {
             setTableDataCharts([]);
-            setTableTotalCount(NaN);
+            setTableTotalCount(0);
         }
     // eslint-disable-next-line react-hooks/exhaustive-deps
     }, [
@@ -4936,7 +5153,38 @@ function PageDiscover() {
 }
 
 
+/***/ }),
+
+/***/ 5611:
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */   b: () => (/* binding */ testIds)
+/* harmony export */ });
+const testIds = {
+    appConfig: {
+        apiKey: 'data-testid ac-api-key',
+        apiUrl: 'data-testid ac-api-url',
+        submit: 'data-testid ac-submit-form'
+    },
+    pageOne: {
+        container: 'data-testid pg-one-container',
+        navigateToFour: 'data-testid navigate-to-four'
+    },
+    pageTwo: {
+        container: 'data-testid pg-two-container'
+    },
+    pageThree: {
+        container: 'data-testid pg-three-container'
+    },
+    pageFour: {
+        container: 'data-testid pg-four-container',
+        navigateBack: 'data-testid navigate-back'
+    }
+};
+
+
 /***/ })
 
 }]);
-//# sourceMappingURL=892.js.map?_cache=320114a5eb201b6077e7
\ No newline at end of file
+//# sourceMappingURL=301.js.map?_cache=5b7e7587736f022bf0b0
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/301.js.map 
b/src/grafana/plugins/doris-app/301.js.map
new file mode 100644
index 0000000..33eab26
--- /dev/null
+++ b/src/grafana/plugins/doris-app/301.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"301.js?_cache=5b7e7587736f022bf0b0","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAmC;AACE;AAE9B,MAAME,uBAAuBD,yCAAMA,CAACE,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsB/C,CAAC,CAAC;AAEK,MAAMC,2BAA2BH,yCAAMA,CAACE,GAAG,CAAC;;;;;;;;;;AAUnD,CAAC,CAAC;AAEK,MAAME,gBAAgBL,YAAG,CAAC;;;;;;;;;;;;AAYjC,CAAC,CAAC;;;;;;;;;;;ACnD6C;AACW;AAChC;AACgH;AACtC;AACjE;AAGpB,SAASsB;IACpB,MAAM,EAAEC,CAAC,EAAE,GAAGjB,6BAAcA;IAC5B,MAAM,CAACkB,YAAYC,cAAc,GAAGlB,yBAAOA,CAACO,+BAAcA;IAC1D,MAAMY,iBAAiBjB,4B
 [...]
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/462.js 
b/src/grafana/plugins/doris-app/462.js
index eb26227..c4d9ecc 100644
--- a/src/grafana/plugins/doris-app/462.js
+++ b/src/grafana/plugins/doris-app/462.js
@@ -16,7 +16,7 @@ __webpack_require__.r(__webpack_exports__);
 
 
 
-const Discover = /*#__PURE__*/ 
react__WEBPACK_IMPORTED_MODULE_0___default().lazy(()=>Promise.all(/* import() 
*/[__webpack_require__.e(632), __webpack_require__.e(723), 
__webpack_require__.e(181), 
__webpack_require__.e(892)]).then(__webpack_require__.bind(__webpack_require__, 
9892)));
+const Discover = /*#__PURE__*/ 
react__WEBPACK_IMPORTED_MODULE_0___default().lazy(()=>Promise.all(/* import() 
*/[__webpack_require__.e(632), __webpack_require__.e(723), 
__webpack_require__.e(181), 
__webpack_require__.e(301)]).then(__webpack_require__.bind(__webpack_require__, 
1301)));
 const PageTrace = /*#__PURE__*/ 
react__WEBPACK_IMPORTED_MODULE_0___default().lazy(()=>Promise.all(/* import() 
*/[__webpack_require__.e(632), __webpack_require__.e(181), 
__webpack_require__.e(600)]).then(__webpack_require__.bind(__webpack_require__, 
2600)));
 // const PageDashboard = React.lazy(() => import('../../pages/PageDashboard'));
 function App(_props) {
@@ -308,4 +308,4 @@ function translationDateIntervalType(type) {
 /***/ })
 
 }]);
-//# sourceMappingURL=462.js.map?_cache=f147cca08cc3ed76dfe3
\ No newline at end of file
+//# sourceMappingURL=462.js.map?_cache=17b5ab6b000cf855c5db
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/462.js.map 
b/src/grafana/plugins/doris-app/462.js.map
index 63e2df0..14c9823 100644
--- a/src/grafana/plugins/doris-app/462.js.map
+++ b/src/grafana/plugins/doris-app/462.js.map
@@ -1 +1 @@
-{"version":3,"file":"462.js?_cache=f147cca08cc3ed76dfe3","mappings":";;;;;;;;;;;;;;;AAA0B;AACuB;AAER;AACzC,MAAMI,yBAAWJ,iDAAU,CAAC,IAAM,qMAAO;AACzC,MAAMM,0BAAYN,iDAAU,CAAC,IAAM,yKAAO;AAC1C,+EAA+E;AAE/E,SAASO,IAAIC,MAAoB;IAC7B,qBACI,2DAACN,oDAAMA,sBACH,2DAACD,mDAAKA;QAACQ,MAAMN,wDAAMA,CAACC,QAAQ;QAAEM,uBAAS,2DAACN;sBACxC,2DAACH,mDAAKA;QAACQ,MAAM,GAAGN,wDAAMA,CAACQ,MAAM,EAAE;QAAED,uBAAS,2DAACJ;sBAE3C,2DAACL,mDAAKA;QAACQ,MAAK;QAAIC,uBAAS,2DAACN;;AAGtC;AAEA,iEAAeG,GAAGA,EAAC;;;;;;;;;;;;;;;;;
 [...]
\ No newline at end of file
+{"version":3,"file":"462.js?_cache=17b5ab6b000cf855c5db","mappings":";;;;;;;;;;;;;;;AAA0B;AACuB;AAER;AACzC,MAAMI,yBAAWJ,iDAAU,CAAC,IAAM,qMAAO;AACzC,MAAMM,0BAAYN,iDAAU,CAAC,IAAM,yKAAO;AAC1C,+EAA+E;AAE/E,SAASO,IAAIC,MAAoB;IAC7B,qBACI,2DAACN,oDAAMA,sBACH,2DAACD,mDAAKA;QAACQ,MAAMN,wDAAMA,CAACC,QAAQ;QAAEM,uBAAS,2DAACN;sBACxC,2DAACH,mDAAKA;QAACQ,MAAM,GAAGN,wDAAMA,CAACQ,MAAM,EAAE;QAAED,uBAAS,2DAACJ;sBAE3C,2DAACL,mDAAKA;QAACQ,MAAK;QAAIC,uBAAS,2DAACN;;AAGtC;AAEA,iEAAeG,GAAGA,EAAC;;;;;;;;;;;;;;;;;
 [...]
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/600.js 
b/src/grafana/plugins/doris-app/600.js
index a856866..eadda9e 100644
--- a/src/grafana/plugins/doris-app/600.js
+++ b/src/grafana/plugins/doris-app/600.js
@@ -403,46 +403,55 @@ var trace_detail = __webpack_require__(1885);
 
 
 
-const TraceView = (props)=>{
-    var _props_traces_;
+const TraceView = ({ traces: propTraces, onSortByChange })=>{
+    var _propTraces_;
     const theme = (0,ui_.useTheme2)();
     const [page, setPage] = (0,react/* useAtom */.fp)(discover/* pageAtom 
*/.fs);
     const pageSize = (0,react/* useAtomValue */.md)(discover/* pageSizeAtom 
*/.Ol);
-    const total = ((_props_traces_ = props.traces[0]) === null || 
_props_traces_ === void 0 ? void 0 : _props_traces_.total) || 0;
-    const traces = props.traces || [];
+    const total = ((_propTraces_ = propTraces[0]) === null || _propTraces_ === 
void 0 ? void 0 : _propTraces_.total) || 0;
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+    const traces = propTraces || [];
     const [sort, setSort] = (0,react/* useAtom */.fp)(store_traces/* 
currentSortAtom */.fy);
     const [drawerOpen, setDrawerOpen] = 
external_react_default().useState(false);
     const [traceId, setTraceId] = external_react_default().useState('');
-    const getOption = ()=>{
+    // 预处理 series 数据,计算 symbolSize
+    const seriesData = (0,external_react_.useMemo)(()=>{
+        return traces.map((s)=>({
+                name: `${s.root_service}:${s.operation}`,
+                spans: s.spans,
+                value: s.trace_duration_ms,
+                trace_id: s.trace_id,
+                symbolSize: Math.max(12, Math.min(30, s.spans || 1))
+            }));
+    }, [
+        traces
+    ]);
+    const option = (0,external_react_.useMemo)(()=>{
         return {
             tooltip: {
                 trigger: 'item',
                 padding: 0,
                 borderWidth: 0,
                 backgroundColor: theme.isLight ? '#ffffff' : 'rgba(63, 63, 69, 
0.64)',
-                onClick: (params)=>{
-                    setTraceId(params.data.trace_id);
-                    setDrawerOpen(true);
-                },
                 formatter: function(params) {
                     const html = `<div
-                                       style="
-                                          padding: 8px;
-                                          min-width: 120px;
-                                          border-radius: 6px;
-                                          backdrop-filter: blur(12px);
-                                          color: ${theme.isLight ? '#1F1F26' : 
'#EFEFF0'};
-                                        ">
-                                      <div style="padding-bottom: 4px; 
border-bottom: 1px solid ${theme.isLight ? '#DFDFE0' : '#3F3F45'};">${[
+                       style="
+                          padding: 8px;
+                          min-width: 120px;
+                          border-radius: 6px;
+                          backdrop-filter: blur(12px);
+                          color: ${theme.isLight ? '#1F1F26' : '#EFEFF0'};
+                        ">
+                      <div style="padding-bottom: 4px; border-bottom: 1px 
solid ${theme.isLight ? '#DFDFE0' : '#3F3F45'};">${[
                         params.name
                     ]}</div>
-                                      <div style="padding-top:4px;display: 
flex;justify-content: space-between;"><span>Durations:</span><span 
style="font-family:DIN Alternate;font-size:14;font-weight:500;">${[
+                      <div style="padding-top:4px;display: 
flex;justify-content: space-between;"><span>Durations:</span><span 
style="font-family:DIN Alternate;font-size:14;font-weight:500;">${[
                         `${params.value} ms` || 'No Data'
                     ]}</span></div>
-                                      <div style="padding-top:4px;display: 
flex;justify-content: space-between;"><span>Spans:</span><span 
style="font-family:DIN Alternate;font-size:14;font-weight:500;">${[
+                      <div style="padding-top:4px;display: 
flex;justify-content: space-between;"><span>Spans:</span><span 
style="font-family:DIN Alternate;font-size:14;font-weight:500;">${[
                         params.data.spans || 'No Data'
                     ]}</span></div>
-                                  </div>`;
+                  </div>`;
                     return html;
                 }
             },
@@ -452,10 +461,6 @@ const TraceView = (props)=>{
                 data: traces.map((s)=>s.time),
                 axisLabel: {
                     color: theme.colors.text.primary
-                },
-                axisLine: {
-                    lineStyle: {
-                    }
                 }
             },
             yAxis: {
@@ -472,24 +477,17 @@ const TraceView = (props)=>{
             },
             series: [
                 {
-                    symbolSize: (value, params)=>{
-                        // 使用 spans 数量决定点的大小,设一个基本缩放,例如:
-                        const trace = traces[params.dataIndex];
-                        return Math.max(12, Math.min(30, trace.spans || 1)); 
// 控制在6~30之间
-                    },
-                    data: traces.map((s)=>{
-                        return {
-                            name: `${s.root_service}:${s.operation}`,
-                            spans: s.spans,
-                            value: s.trace_duration_ms,
-                            trace_id: s.trace_id
-                        };
-                    }),
-                    type: 'scatter'
+                    type: 'scatter',
+                    data: seriesData,
+                    symbolSize: (data)=>data.symbolSize
                 }
             ]
         };
-    };
+    }, [
+        seriesData,
+        traces,
+        theme
+    ]);
     const onEvents = {
         click: (params)=>{
             setTraceId(params.data.trace_id);
@@ -510,8 +508,8 @@ const TraceView = (props)=>{
                     height: 300px;
                 `
     }, /*#__PURE__*/ external_react_default().createElement(esm/* default 
*/.A, {
-        option: getOption(),
-        notMerge: true,
+        option: option,
+        notMerge: false,
         lazyUpdate: true,
         style: {
             height: '100%'
@@ -556,7 +554,7 @@ const TraceView = (props)=>{
         onChange: (option)=>{
             setPage(1);
             setSort(option.value);
-            props === null || props === void 0 ? void 0 : 
props.onSortByChange(option.value);
+            onSortByChange(option.value);
         }
     }))), /*#__PURE__*/ external_react_default().createElement("div", {
         className: (0,css_.css)`
@@ -574,10 +572,8 @@ const TraceView = (props)=>{
                     `
     }, /*#__PURE__*/ external_react_default().createElement("div", null, 
traces.length, " Traces, "), /*#__PURE__*/ 
external_react_default().createElement("div", null, "Total ", total)), 
/*#__PURE__*/ external_react_default().createElement(ui_.Pagination, {
         currentPage: page,
-        numberOfPages: Math.floor(total / pageSize) || 1,
-        onNavigate: (toPage)=>{
-            setPage(toPage);
-        }
+        numberOfPages: Math.ceil(total / pageSize) || 1,
+        onNavigate: (toPage)=>setPage(toPage)
     })), /*#__PURE__*/ external_react_default().createElement("div", {
         className: (0,css_.css)`
                     display: flex;
@@ -662,6 +658,8 @@ var utils_data = __webpack_require__(6700);
 var constants = __webpack_require__(2351);
 // EXTERNAL MODULE: ./services/metaservice.ts
 var metaservice = __webpack_require__(8161);
+// EXTERNAL MODULE: external "@grafana/data"
+var data_ = __webpack_require__(7781);
 ;// ./components/traces/traces-header/index.tsx
 'use client';
 function _define_property(obj, key, value) {
@@ -728,16 +726,17 @@ function _object_spread_props(target, source) {
 
 
 
+
 function TracesHeader() {
     // const catalogs = useAtomValue(catalogAtom);
     const setIndexes = (0,react/* useSetAtom */.Xr)(discover/* indexesAtom 
*/.Eq);
     const [discoverCurrent, setDiscoverCurrent] = (0,react/* useAtom 
*/.fp)(discover/* discoverCurrentAtom */.WN);
     if (false) // removed by dead control flow
 {}
-    const [loc, setLoc] = (0,react/* useAtom */.fp)(discover/* locationAtom 
*/.JT);
+    const setLoc = (0,react/* useSetAtom */.Xr)(discover/* locationAtom */.JT);
     const setTableFields = (0,react/* useSetAtom */.Xr)(discover/* 
tableFieldsAtom */.D_);
     const [timeFields, setTimeFields] = (0,react/* useAtom */.fp)(discover/* 
timeFieldsAtom */.Gg);
-    const [currentDate, setCurrentDate] = (0,react/* useAtom */.fp)(discover/* 
currentDateAtom */.Zb);
+    const [_currentDate, setCurrentDate] = (0,react/* useAtom 
*/.fp)(discover/* currentDateAtom */.Zb);
     const currentTimeField = (0,react/* useAtomValue */.md)(discover/* 
currentTimeFieldAtom */.CA);
     const [currentIndex, setCurrentIndex] = (0,react/* useAtom 
*/.fp)(discover/* currentIndexAtom */.TY);
     const searchFocus = (0,react/* useAtomValue */.md)(discover/* 
searchFocusAtom */.MM);
@@ -746,7 +745,7 @@ function TracesHeader() {
     const [currentTable, setCurrentTable] = (0,react/* useAtom 
*/.fp)(store_traces/* currentTraceTableAtom */.AZ);
     const [databases, setDatabases] = (0,react/* useAtom */.fp)(discover/* 
databasesAtom */.SK);
     const [tables, setTables] = (0,react/* useAtom */.fp)(discover/* 
tablesAtom */.b9);
-    const [datasources, setDataSource] = (0,react/* useAtom */.fp)(discover/* 
datasourcesAtom */.ui);
+    const [_datasources, setDataSource] = (0,react/* useAtom */.fp)(discover/* 
datasourcesAtom */.ui);
     const setDisabledOptions = (0,react/* useSetAtom */.Xr)(discover/* 
disabledOptionsAtom */.IH);
     const selectdbDS = (0,react/* useAtomValue */.md)(discover/* 
selectedDatasourceAtom */.SW);
     (0,external_react_.useEffect)(()=>{
@@ -769,38 +768,29 @@ function TracesHeader() {
     ]);
     const theme = (0,ui_.useTheme2)();
     (0,external_react_.useEffect)(()=>{
-        if (selectdbDS) {
-            const res = (0,metaservice/* getDatabases */.Hm)(selectdbDS);
-            res.subscribe({
-                next: ({ data, ok })=>{
-                    if (ok) {
-                        var _data_results__data, _data_results_;
-                        const value = data === null || data === void 0 ? void 
0 : (_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? 
void 0 : (_data_results__data = _data_results_.data) === null || 
_data_results__data === void 0 ? void 0 : _data_results__data.values[0];
-                        if (value) {
-                            const options = value.map((item)=>{
-                                return {
-                                    label: item,
-                                    value: item
-                                };
-                            });
-                            setDatabases(options);
-                        }
-                    }
-                },
-                error: (err)=>{
-                    console.log('查询错误', err);
-                }
-            });
+        if (!selectdbDS) {
+            return;
         }
-    // eslint-disable-next-line react-hooks/exhaustive-deps
+        const subscription = (0,metaservice/* getDatabases 
*/.Hm)(selectdbDS).subscribe({
+            next: (resp)=>{
+                const { data, ok } = resp;
+                if (ok) {
+                    const frame = 
(0,data_.toDataFrame)(data.results.getDatabases.frames[0]);
+                    const values = Array.from(frame.fields[0].values);
+                    const options = values.map((item)=>({
+                            label: item,
+                            value: item
+                        }));
+                    setDatabases(options);
+                }
+            },
+            error: (err)=>console.log('查询错误', err)
+        });
+        return ()=>subscription.unsubscribe();
     }, [
-        selectdbDS
+        selectdbDS,
+        setDatabases
     ]);
-    // useEffect(() => {
-    //     if (startTime && endTime) {
-    //         setCurrentDate([dayjs(startTime), dayjs(endTime)]);
-    //     }
-    // }, [startTime, endTime, setCurrentDate]);
     function getFields(selectedTable) {
         (0,metaservice/* getFieldsService */.H1)({
             selectdbDS,
@@ -809,10 +799,11 @@ function TracesHeader() {
         }).subscribe({
             next: ({ data, ok })=>{
                 if (ok) {
-                    var _data_results__data, _data_results_, 
_data_results__data1, _data_results_1, _data_results__data2, _data_results_2;
-                    const value = data === null || data === void 0 ? void 0 : 
(_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? void 
0 : (_data_results__data = _data_results_.data) === null || _data_results__data 
=== void 0 ? void 0 : _data_results__data.values[0];
-                    const fieldTypes = data === null || data === void 0 ? void 
0 : (_data_results_1 = data.results[0]) === null || _data_results_1 === void 0 
? void 0 : (_data_results__data1 = _data_results_1.data) === null || 
_data_results__data1 === void 0 ? void 0 : _data_results__data1.values[1];
-                    const tableFields = data === null || data === void 0 ? 
void 0 : (_data_results_2 = data.results[0]) === null || _data_results_2 === 
void 0 ? void 0 : (_data_results__data2 = _data_results_2.data) === null || 
_data_results__data2 === void 0 ? void 0 : 
_data_results__data2.values[0].map((item, index)=>{
+                    const frame = 
(0,data_.toDataFrame)(data.results.getFields.frames[0]);
+                    console.log('frame', frame);
+                    const values = Array.from(frame.fields[0].values);
+                    const fieldTypes = Array.from(frame.fields[1].values);
+                    const tableFields = values.map((item, index)=>{
                         return {
                             label: item,
                             Field: item,
@@ -821,9 +812,9 @@ function TracesHeader() {
                         };
                     });
                     setTableFields(tableFields);
-                    if (value) {
+                    if (values) {
                         var _options_;
-                        const options = value.filter((field, index)=>{
+                        const options = values.filter((field, index)=>{
                             return (0,utils_data/* isValidTimeFieldType 
*/.Q3)(fieldTypes[index].toUpperCase());
                         }).map((item)=>{
                             return {
@@ -851,16 +842,16 @@ function TracesHeader() {
         }).subscribe({
             next: ({ data, ok })=>{
                 if (ok) {
-                    var _data_results__data, _data_results_, 
_data_results__data1, _data_results_1, _data_results__data2, _data_results_2;
-                    const value = data === null || data === void 0 ? void 0 : 
(_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? void 
0 : (_data_results__data = _data_results_.data) === null || _data_results__data 
=== void 0 ? void 0 : _data_results__data.values[2];
-                    const columnNames = data === null || data === void 0 ? 
void 0 : (_data_results_1 = data.results[0]) === null || _data_results_1 === 
void 0 ? void 0 : (_data_results__data1 = _data_results_1.data) === null || 
_data_results__data1 === void 0 ? void 0 : _data_results__data1.values[4];
-                    const indexesTypes = data === null || data === void 0 ? 
void 0 : (_data_results_2 = data.results[0]) === null || _data_results_2 === 
void 0 ? void 0 : (_data_results__data2 = _data_results_2.data) === null || 
_data_results__data2 === void 0 ? void 0 : _data_results__data2.values[10];
-                    if (!value || value.length === 0) {
+                    const frame = 
(0,data_.toDataFrame)(data.results.getIndexes.frames[0]);
+                    const values = Array.from(frame.fields[2].values);
+                    const columnNames = Array.from(frame.fields[4].values);
+                    const indexesTypes = Array.from(frame.fields[10].values);
+                    if (!values || values.length === 0) {
                         setIndexes([]);
                         setCurrentIndex([]);
                         return;
                     }
-                    const tableIndexes = value === null || value === void 0 ? 
void 0 : value.map((item, index)=>{
+                    const tableIndexes = values === null || values === void 0 
? void 0 : values.map((item, index)=>{
                         return {
                             label: item,
                             value: item,
@@ -914,28 +905,23 @@ function TracesHeader() {
             setDiscoverCurrent(_object_spread_props(_object_spread({}, 
discoverCurrent), {
                 database: selectedDatabase.value
             }));
-            (0,metaservice/* getTables */.oI)({
+            (0,metaservice/* getTablesService */.Rw)({
                 selectdbDS,
                 database: selectedDatabase.value
             }).subscribe({
-                next: ({ data, ok })=>{
+                next: (resp)=>{
+                    const { data, ok } = resp;
                     if (ok) {
-                        var _data_results__data, _data_results_;
-                        const value = data === null || data === void 0 ? void 
0 : (_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? 
void 0 : (_data_results__data = _data_results_.data) === null || 
_data_results__data === void 0 ? void 0 : _data_results__data.values[0];
-                        if (value) {
-                            const options = value.map((item)=>{
-                                return {
-                                    label: item,
-                                    value: item
-                                };
-                            });
-                            setTables(options);
-                        }
+                        const frame = 
(0,data_.toDataFrame)(data.results.getTables.frames[0]);
+                        const values = Array.from(frame.fields[0].values);
+                        const options = values.map((item)=>({
+                                label: item,
+                                value: item
+                            }));
+                        setTables(options);
                     }
                 },
-                error: (err)=>{
-                    console.log('查询错误', err);
-                }
+                error: (err)=>console.log('查询错误', err)
             });
         }
     })), /*#__PURE__*/ external_react_default().createElement(ui_.Field, {
@@ -956,7 +942,7 @@ function TracesHeader() {
             getIndexes(selectedTable);
         }
     }))), !searchFocus && /*#__PURE__*/ 
external_react_default().createElement((external_react_default()).Fragment, 
null, /*#__PURE__*/ external_react_default().createElement(ui_.Field, {
-        label: "时间字段"
+        label: "Time Field"
     }, /*#__PURE__*/ external_react_default().createElement(ui_.Select, {
         value: currentTimeField,
         options: timeFields,
@@ -972,9 +958,9 @@ function TracesHeader() {
                 });
             });
         },
-        placeholder: '时间字段'
+        placeholder: 'Time Field'
     })), /*#__PURE__*/ external_react_default().createElement(ui_.Field, {
-        label: "时间范围",
+        label: "Time Range",
         style: {
             marginLeft: 8,
             marginRight: 8
@@ -1002,8 +988,8 @@ function TracesHeader() {
     }))));
 }
 
-// EXTERNAL MODULE: ./services/discover.ts
-var services_discover = __webpack_require__(7626);
+// EXTERNAL MODULE: ./services/traces.ts + 1 modules
+var services_traces = __webpack_require__(3764);
 ;// ./pages/PageTrace.tsx
 function PageTrace_define_property(obj, key, value) {
     if (key in obj) {
@@ -1070,6 +1056,7 @@ function PageTrace_object_spread_props(target, source) {
 
 
 
+
 function PageTrace() {
     const theme = (0,ui_.useTheme2)();
     const currentTimeField = (0,react/* useAtomValue */.md)(discover/* 
currentTimeFieldAtom */.CA);
@@ -1108,7 +1095,7 @@ function PageTrace() {
             page_size: pageSize,
             service_name: currentService.value,
             operation: currentOperation.value,
-            sort_by: sort
+            sortBy: sort
         };
         if (minDuration) {
             console.log('minDuration', minDuration);
@@ -1121,13 +1108,13 @@ function PageTrace() {
         if (tags && tags.length > 0) {
             payload.tags = tags;
         }
-        (0,services_discover/* getTracesService 
*/.Cy)(PageTrace_object_spread({
+        (0,services_traces/* getTracesService */.Cy)(PageTrace_object_spread({
             selectdbDS
         }, payload)).subscribe({
             next: ({ data, ok })=>{
                 setLoading(false);
                 if (ok) {
-                    const rowsData = (0,utils_data/* convertColumnToRow 
*/.HL)(data);
+                    const rowsData = (0,utils_data/* convertColumnToRow 
*/.HL)(data.results.getTraces.frames[0]);
                     // console.log('查询结果', rowsData);
                     const formateData = rowsData.map((item)=>{
                         var _item_trace_duration_ms;
@@ -1174,27 +1161,25 @@ function PageTrace() {
             endDate: currentDate[1].format(constants/* FORMAT_DATE */.fU),
             cluster: ''
         };
-        (0,services_discover/* getTracesServicesService 
*/.Cq)(PageTrace_object_spread({
+        (0,services_traces/* getServiceListService 
*/.FC)(PageTrace_object_spread({
             selectdbDS
         }, payload)).subscribe({
             next: ({ data, ok })=>{
                 setLoading(false);
                 if (ok) {
-                    if (ok) {
-                        var _data_results__data, _data_results_;
-                        const value = data === null || data === void 0 ? void 
0 : (_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? 
void 0 : (_data_results__data = _data_results_.data) === null || 
_data_results__data === void 0 ? void 0 : _data_results__data.values[0];
-                        if (value) {
-                            const options = value.map((item)=>{
-                                return {
-                                    label: item,
-                                    value: item
-                                };
-                            });
-                            setTracesServices([
-                                constants/* DEFAULT_SERVICE */.aR,
-                                ...options
-                            ]);
-                        }
+                    const frame = 
(0,data_.toDataFrame)(data.results.getServiceList.frames[0]);
+                    const values = Array.from(frame.fields[0].values);
+                    if (values) {
+                        const options = values.map((item)=>{
+                            return {
+                                label: item,
+                                value: item
+                            };
+                        });
+                        setTracesServices([
+                            constants/* DEFAULT_SERVICE */.aR,
+                            ...options
+                        ]);
                     }
                 }
             },
@@ -1221,34 +1206,34 @@ function PageTrace() {
             timeField: currentTimeField,
             startDate: (_currentDate_ = currentDate[0]) === null || 
_currentDate_ === void 0 ? void 0 : _currentDate_.format(constants/* 
FORMAT_DATE */.fU),
             endDate: currentDate[1].format(constants/* FORMAT_DATE */.fU),
-            serviceName: currentService.value,
+            service_name: currentService.value,
             cluster: ''
         };
-        (0,services_discover/* getTraceOperationsService 
*/.H7)(PageTrace_object_spread({
+        (0,services_traces/* getOperationListService 
*/.jo)(PageTrace_object_spread({
             selectdbDS
         }, payload)).subscribe({
             next: ({ data, ok })=>{
                 setLoading(false);
                 if (ok) {
-                    if (ok) {
-                        var _data_results__data, _data_results_;
-                        const value = data === null || data === void 0 ? void 
0 : (_data_results_ = data.results[0]) === null || _data_results_ === void 0 ? 
void 0 : (_data_results__data = _data_results_.data) === null || 
_data_results__data === void 0 ? void 0 : _data_results__data.values[0];
-                        if (value) {
-                            const options = value.map((item)=>{
-                                return {
-                                    label: item,
-                                    value: item
-                                };
-                            });
-                            setTraceOperations([
-                                constants/* DEFAULT_OPERATION */.UB,
-                                ...options
-                            ]);
-                        } else {
-                            setTraceOperations([
-                                constants/* DEFAULT_OPERATION */.UB
-                            ]);
-                        }
+                    // const frame = 
toDataFrame(data.results.getOperationList.frames[0]);
+                    // const values = Array.from(frame.fields[0].values);
+                    // const values = frame.data.values
+                    const values = 
data.results.getOperationList.frames[0].data.values[0];
+                    if (values) {
+                        const options = values.map((item)=>{
+                            return {
+                                label: item,
+                                value: item
+                            };
+                        });
+                        setTraceOperations([
+                            constants/* DEFAULT_OPERATION */.UB,
+                            ...options
+                        ]);
+                    } else {
+                        setTraceOperations([
+                            constants/* DEFAULT_OPERATION */.UB
+                        ]);
                     }
                 }
             },
@@ -1271,7 +1256,6 @@ function PageTrace() {
     (0,external_react_.useEffect)(()=>{
         if (currentTimeField && currentTable && currentCatalog && 
currentDatabase && currentDate) {
             getTraces();
-            getTracesServices();
         }
     // eslint-disable-next-line react-hooks/exhaustive-deps
     }, [
@@ -1281,6 +1265,16 @@ function PageTrace() {
         currentDate,
         sort
     ]);
+    (0,external_react_.useEffect)(()=>{
+        if (currentTimeField && currentTable && currentCatalog && 
currentDatabase && currentDate) {
+            getTracesServices();
+        }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+    }, [
+        currentTimeField,
+        currentDate,
+        sort
+    ]);
     (0,external_react_.useEffect)(()=>{
         if (currentTimeField && currentTable && currentCatalog && 
currentDatabase && currentService) {
             getTracesOperations();
@@ -1349,4 +1343,4 @@ function PageTrace() {
 /***/ })
 
 }]);
-//# sourceMappingURL=600.js.map?_cache=ec61aa919838c06e8070
\ No newline at end of file
+//# sourceMappingURL=600.js.map?_cache=da9ca1a564051d04d4f3
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/600.js.map 
b/src/grafana/plugins/doris-app/600.js.map
index 532e724..a955c39 100644
--- a/src/grafana/plugins/doris-app/600.js.map
+++ b/src/grafana/plugins/doris-app/600.js.map
@@ -1 +1 @@
-{"version":3,"file":"600.js?_cache=ec61aa919838c06e8070","mappings":";;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;;AAE6E;AAC7E;;;AC5BA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEwC;AACxC;;;ACpBA;AACA;AACA;AACA;AACA;AACA;;AAEkD;AACK;AACW;;AAElE,aAAa,8BAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,UAAU,iCAAa;AAC1B;AACA;AACA;AACA,SAA
 [...]
\ No newline at end of file
+{"version":3,"file":"600.js?_cache=da9ca1a564051d04d4f3","mappings":";;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;;AAE6E;AAC7E;;;AC5BA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEwC;AACxC;;;ACpBA;AACA;AACA;AACA;AACA;AACA;;AAEkD;AACK;AACW;;AAElE,aAAa,8BAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,UAAU,iCAAa;AAC1B;AACA;AACA;AACA,SAA
 [...]
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/892.js.map 
b/src/grafana/plugins/doris-app/892.js.map
deleted file mode 100644
index 19c3eec..0000000
--- a/src/grafana/plugins/doris-app/892.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"892.js?_cache=320114a5eb201b6077e7","mappings":";;;;;;;;;AAAO,MAAMA,UAAU;IACrBC,WAAW;QACTC,QAAQ;QACRC,QAAQ;QACRC,QAAQ;IACV;IACAC,SAAS;QACPC,WAAW;QACXC,gBAAgB;IAClB;IACAC,SAAS;QACPF,WAAW;IACb;IACAG,WAAW;QACTH,WAAW;IACb;IACAI,UAAU;QACRJ,WAAW;QACXK,cAAc;IAChB;AACF,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBiC;AACE;AAE9B,MAAMG,uBAAuBD,yCAAMA,CAACE,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsB/C,CAAC,CAAC;AAEK,MAAMC,2BAA2BH,yCAAMA,CAACE,GAAG,CAAC;;;;;;;;;;AAUnD,CAAC,CAAC;AAEK,MAAME,gBA
 [...]
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/gpx_doris-app_darwin_amd64 
b/src/grafana/plugins/doris-app/gpx_doris-app_darwin_amd64
index edfdd53..7fd1a3b 100755
Binary files a/src/grafana/plugins/doris-app/gpx_doris-app_darwin_amd64 and 
b/src/grafana/plugins/doris-app/gpx_doris-app_darwin_amd64 differ
diff --git a/src/grafana/plugins/doris-app/gpx_doris-app_darwin_arm64 
b/src/grafana/plugins/doris-app/gpx_doris-app_darwin_arm64
index de3a4d2..29565d3 100755
Binary files a/src/grafana/plugins/doris-app/gpx_doris-app_darwin_arm64 and 
b/src/grafana/plugins/doris-app/gpx_doris-app_darwin_arm64 differ
diff --git a/src/grafana/plugins/doris-app/gpx_doris-app_linux_amd64 
b/src/grafana/plugins/doris-app/gpx_doris-app_linux_amd64
index 44899d1..42d5ff9 100755
Binary files a/src/grafana/plugins/doris-app/gpx_doris-app_linux_amd64 and 
b/src/grafana/plugins/doris-app/gpx_doris-app_linux_amd64 differ
diff --git a/src/grafana/plugins/doris-app/gpx_doris-app_linux_arm 
b/src/grafana/plugins/doris-app/gpx_doris-app_linux_arm
index 617a852..57de697 100755
Binary files a/src/grafana/plugins/doris-app/gpx_doris-app_linux_arm and 
b/src/grafana/plugins/doris-app/gpx_doris-app_linux_arm differ
diff --git a/src/grafana/plugins/doris-app/gpx_doris-app_linux_arm64 
b/src/grafana/plugins/doris-app/gpx_doris-app_linux_arm64
index df8d186..b266c54 100755
Binary files a/src/grafana/plugins/doris-app/gpx_doris-app_linux_arm64 and 
b/src/grafana/plugins/doris-app/gpx_doris-app_linux_arm64 differ
diff --git a/src/grafana/plugins/doris-app/gpx_doris-app_windows_amd64.exe 
b/src/grafana/plugins/doris-app/gpx_doris-app_windows_amd64.exe
index 2a26cc3..edf41cc 100755
Binary files a/src/grafana/plugins/doris-app/gpx_doris-app_windows_amd64.exe 
and b/src/grafana/plugins/doris-app/gpx_doris-app_windows_amd64.exe differ
diff --git a/src/grafana/plugins/doris-app/module.js 
b/src/grafana/plugins/doris-app/module.js
index bce9c04..8b0fd03 100644
--- a/src/grafana/plugins/doris-app/module.js
+++ b/src/grafana/plugins/doris-app/module.js
@@ -1192,7 +1192,7 @@ module.exports = domAPI;
 /******/               // This function allow to reference async chunks
 /******/               __webpack_require__.u = (chunkId) => {
 /******/                       // return url for filenames based on template
-/******/                       return "" + chunkId + ".js?_cache=" + 
{"35":"6d86e876a981760ae4a1","181":"6d914ab9f7dffb39d3ea","202":"960b652c09389756ed7b","462":"f147cca08cc3ed76dfe3","600":"ec61aa919838c06e8070","632":"20f9d65c2526bb592e0a","723":"cd85aac21ae242f5f0f2","892":"320114a5eb201b6077e7"}[chunkId]
 + "";
+/******/                       return "" + chunkId + ".js?_cache=" + 
{"35":"6d86e876a981760ae4a1","181":"199c7bc22e9b0ba4a085","202":"960b652c09389756ed7b","301":"5b7e7587736f022bf0b0","462":"17b5ab6b000cf855c5db","600":"da9ca1a564051d04d4f3","632":"20f9d65c2526bb592e0a","723":"cd85aac21ae242f5f0f2"}[chunkId]
 + "";
 /******/               };
 /******/       })();
 /******/       
@@ -1282,7 +1282,7 @@ module.exports = domAPI;
 /******/       
 /******/       /* webpack/runtime/compat */
 /******/       
-/******/       __webpack_require__.sriHashes = 
{"35":"sha256-8TWj0IuqCnw+QkYOR4eAnmDEKCIKywuChqXPt3S4FV0=","181":"sha256-IM1K/Cb9j/MnX9kSi0A7YI62vASzL73wV8eaMH9bsDM=","202":"sha256-CN4kzTw1qZgwAinJ1/Yabb8xvpGp0KP+/BizIwiPgfQ=","462":"sha256-jqJTq+S8JwIHquoKfThhlhqu/x5cdIPi+9UwJm3a8t0=","600":"sha256-Czep+xD5J2dKAhHemIjsl+UVHvPyKUCreeUM/EtK3sQ=","632":"sha256-MW1oi1N0a/3ek7LCgIZcCVt3rVRNjLXJmSZD8oTGIZY=","723":"sha256-YDvp7Qjz8uu5Sk0fPOr2QrUrKd0OfhzUsNXFLgjBQwM=","892":"sha256-0z6USMK4DrA+ZvE+
 [...]
+/******/       __webpack_require__.sriHashes = 
{"35":"sha256-8TWj0IuqCnw+QkYOR4eAnmDEKCIKywuChqXPt3S4FV0=","181":"sha256-S9IjFpVV4huLTJA/PBBo8of9bxNErQykqWp0esRD3jg=","202":"sha256-CN4kzTw1qZgwAinJ1/Yabb8xvpGp0KP+/BizIwiPgfQ=","301":"sha256-HVEabGpMVI5Hq1gi79mK1ywt6FU5ynwCRlq8LR7VFnk=","462":"sha256-X497Yr1/vrDrkoN/fqxBo8tu4PppUUPy95D2K4MCI98=","600":"sha256-8fQLd/XtX6vKabiUbI2oAMD+ZI1fpIg4ulotNgeKMo0=","632":"sha256-MW1oi1N0a/3ek7LCgIZcCVt3rVRNjLXJmSZD8oTGIZY=","723":"sha256-YDvp7Qjz8uu5Sk0f
 [...]
 /******/       
 /******/       /* webpack/runtime/jsonp chunk loading */
 /******/       (() => {
diff --git a/src/grafana/plugins/doris-app/module.js.map 
b/src/grafana/plugins/doris-app/module.js.map
index 9ad894d..08fcc86 100644
--- a/src/grafana/plugins/doris-app/module.js.map
+++ b/src/grafana/plugins/doris-app/module.js.map
@@ -1 +1 @@
-{"version":3,"file":"module.js","mappings":";;;;;;;;AAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA,gDAAgD;AAChD;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sFAAsF,qBAAqB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV
 [...]
\ No newline at end of file
+{"version":3,"file":"module.js","mappings":";;;;;;;;AAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA,gDAAgD;AAChD;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,sFAAsF,qBAAqB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV
 [...]
\ No newline at end of file
diff --git a/src/grafana/plugins/doris-app/plugin.json 
b/src/grafana/plugins/doris-app/plugin.json
index d28b86c..37d4405 100644
--- a/src/grafana/plugins/doris-app/plugin.json
+++ b/src/grafana/plugins/doris-app/plugin.json
@@ -19,7 +19,7 @@
         },
         "screenshots": [],
         "version": "1.0.0",
-        "updated": "2025-08-18"
+        "updated": "2025-08-28"
     },
     "includes": [
         {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to