= {
+ name: 'ApplicationName',
+ get header() {
+ return i18n('col_app');
+ },
+ render: ({row}) => {row.ApplicationName || '–'}
,
+ sortable: true,
+};
+
export const TOP_QUERIES_COLUMNS = [
cpuTimeUsColumn,
queryTextColumn,
@@ -109,3 +132,10 @@ export const TENANT_OVERVIEW_TOP_QUERUES_COLUMNS = [
oneLineQueryTextColumn,
cpuTimeUsColumn,
];
+
+export const RUNNING_QUERIES_COLUMNS = [
+ userSIDColumn,
+ queryStartColumn,
+ queryTextColumn,
+ applicationColumn,
+];
diff --git a/src/containers/Tenant/Diagnostics/TopQueries/i18n/en.json b/src/containers/Tenant/Diagnostics/TopQueries/i18n/en.json
index 7674260b1..43ef7d1c0 100644
--- a/src/containers/Tenant/Diagnostics/TopQueries/i18n/en.json
+++ b/src/containers/Tenant/Diagnostics/TopQueries/i18n/en.json
@@ -1,4 +1,10 @@
{
"no-data": "No data",
- "filter.text.placeholder": "Search by query text..."
+ "filter.text.placeholder": "Search by query text...",
+ "mode_top": "Top",
+ "mode_running": "Running",
+ "col_user": "User",
+ "col_start-time": "Start time",
+ "col_query-text": "Query text",
+ "col_app": "Application"
}
diff --git a/src/containers/Tenant/Diagnostics/TopQueries/i18n/index.ts b/src/containers/Tenant/Diagnostics/TopQueries/i18n/index.ts
index d4b0035c7..891dbe947 100644
--- a/src/containers/Tenant/Diagnostics/TopQueries/i18n/index.ts
+++ b/src/containers/Tenant/Diagnostics/TopQueries/i18n/index.ts
@@ -1,8 +1,7 @@
import {registerKeysets} from '../../../../../utils/i18n';
import en from './en.json';
-import ru from './ru.json';
const COMPONENT = 'ydb-diagnostics-top-queries';
-export default registerKeysets(COMPONENT, {ru, en});
+export default registerKeysets(COMPONENT, {en});
diff --git a/src/containers/Tenant/Diagnostics/TopQueries/i18n/ru.json b/src/containers/Tenant/Diagnostics/TopQueries/i18n/ru.json
deleted file mode 100644
index 90aeb4eda..000000000
--- a/src/containers/Tenant/Diagnostics/TopQueries/i18n/ru.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "no-data": "Нет данных",
- "filter.text.placeholder": "Искать по тексту запроса..."
-}
diff --git a/src/store/reducers/executeTopQueries/executeTopQueries.ts b/src/store/reducers/executeTopQueries/executeTopQueries.ts
index 6b096d421..5dceeb70d 100644
--- a/src/store/reducers/executeTopQueries/executeTopQueries.ts
+++ b/src/store/reducers/executeTopQueries/executeTopQueries.ts
@@ -66,7 +66,7 @@ export const topQueriesApi = api.injectEndpoints({
);
if (isQueryErrorResponse(response)) {
- return {error: response};
+ throw response;
}
const data = parseQueryAPIExecuteResponse(response);
@@ -87,6 +87,39 @@ export const topQueriesApi = api.injectEndpoints({
return false;
},
+ providesTags: ['All'],
+ }),
+ getRunningQueries: build.query({
+ queryFn: async (
+ {database, filters}: {database: string; filters?: TopQueriesFilters},
+ {signal},
+ ) => {
+ try {
+ const filterConditions = filters?.text ? `Query ILIKE '%${filters.text}%'` : '';
+ const queryText = `SELECT UserSID, QueryStartAt, Query as QueryText, ApplicationName from \`.sys/query_sessions\` WHERE ${filterConditions || 'true'} ORDER BY SessionStartAt limit 100`;
+
+ const response = await window.api.sendQuery(
+ {
+ query: queryText,
+ database,
+ action: 'execute-scan',
+ },
+ {signal, withRetries: true},
+ );
+
+ if (isQueryErrorResponse(response)) {
+ throw response;
+ }
+
+ return {data: response?.result?.filter((item) => item.QueryText !== queryText)};
+ } catch (error) {
+ return {error};
+ }
+ },
+ forceRefetch() {
+ return true;
+ },
+ providesTags: ['All'],
}),
}),
overrideExisting: 'throw',