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

snlee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 3dac920bfc Show minion task runtime config details in UI (#9652)
3dac920bfc is described below

commit 3dac920bfc97f33ddbbd2c97d3fe771c1549482d
Author: Jayesh Choudhary <[email protected]>
AuthorDate: Tue Oct 25 23:25:20 2022 +0530

    Show minion task runtime config details in UI (#9652)
---
 .../resources/app/components/SimpleAccordion.tsx   | 12 ++++--
 .../src/main/resources/app/interfaces/types.d.ts   |  7 +++
 .../src/main/resources/app/pages/TaskDetail.tsx    | 50 +++++++++++++++++-----
 .../src/main/resources/app/requests/index.ts       |  5 ++-
 .../main/resources/app/utils/PinotMethodUtils.ts   | 10 ++++-
 5 files changed, 68 insertions(+), 16 deletions(-)

diff --git 
a/pinot-controller/src/main/resources/app/components/SimpleAccordion.tsx 
b/pinot-controller/src/main/resources/app/components/SimpleAccordion.tsx
index 2cdafa8eab..a8e6b3f22f 100644
--- a/pinot-controller/src/main/resources/app/components/SimpleAccordion.tsx
+++ b/pinot-controller/src/main/resources/app/components/SimpleAccordion.tsx
@@ -26,6 +26,7 @@ import Typography from '@material-ui/core/Typography';
 import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
 import SearchBar from './SearchBar';
 import { FormControlLabel, Switch, Tooltip } from '@material-ui/core';
+import clsx from 'clsx';
 
 const useStyles = makeStyles((theme: Theme) =>
   createStyles({
@@ -46,7 +47,8 @@ const useStyles = makeStyles((theme: Theme) =>
     },
     details: {
       flexDirection: 'column',
-      padding: '0'
+      padding: '0',
+      overflow: "auto"
     },
     formControl: {
       marginRight: 0,
@@ -68,7 +70,8 @@ type Props = {
     toggleChangeHandler: (event: React.ChangeEvent<HTMLInputElement>) => void;
     toggleName: string;
     toggleValue: boolean;
-  }
+  },
+  detailsContainerClass?: string
 };
 
 export default function SimpleAccordion({
@@ -79,7 +82,8 @@ export default function SimpleAccordion({
   handleSearch,
   recordCount,
   children,
-  accordionToggleObject
+  accordionToggleObject,
+  detailsContainerClass
 }: Props) {
   const classes = useStyles();
 
@@ -115,7 +119,7 @@ export default function SimpleAccordion({
           />
         }
       </AccordionSummary>
-      <AccordionDetails className={classes.details}>
+      <AccordionDetails className={clsx(classes.details, 
detailsContainerClass)}>
         {showSearchBox ?
           <SearchBar
             // searchOnRight={true}
diff --git a/pinot-controller/src/main/resources/app/interfaces/types.d.ts 
b/pinot-controller/src/main/resources/app/interfaces/types.d.ts
index 3efc88f04a..06ab023a3a 100644
--- a/pinot-controller/src/main/resources/app/interfaces/types.d.ts
+++ b/pinot-controller/src/main/resources/app/interfaces/types.d.ts
@@ -197,4 +197,11 @@ declare module 'Models' {
       tableName: string
     }
   }
+  
+  export interface TaskRuntimeConfig {
+    ConcurrentTasksPerWorker: string,
+    TaskTimeoutMs: string,
+    TaskExpireTimeMs: string,
+    MinionWorkerGroupTag: string
+  }
 }
diff --git a/pinot-controller/src/main/resources/app/pages/TaskDetail.tsx 
b/pinot-controller/src/main/resources/app/pages/TaskDetail.tsx
index a0eda167b5..f825cfbd05 100644
--- a/pinot-controller/src/main/resources/app/pages/TaskDetail.tsx
+++ b/pinot-controller/src/main/resources/app/pages/TaskDetail.tsx
@@ -22,6 +22,10 @@ import { get, each } from 'lodash';
 import { Grid, makeStyles } from '@material-ui/core';
 import PinotMethodUtils from '../utils/PinotMethodUtils';
 import CustomizedTables from '../components/Table';
+import { TaskRuntimeConfig } from 'Models';
+import AppLoader from '../components/AppLoader';
+import SimpleAccordion from '../components/SimpleAccordion';
+import CustomCodemirror from '../components/CustomCodemirror';
 
 const useStyles = makeStyles(() => ({
   gridContainer: {
@@ -56,6 +60,10 @@ const useStyles = makeStyles(() => ({
     border: '1px solid #BDCCD9',
     '& .CodeMirror': { height: 532 },
   },
+  runtimeConfigContainer: {
+    '& .CodeMirror': { fontSize: "1rem", height: "100%" },
+    maxHeight: 300
+  }
 }));
 
 const TaskDetail = (props) => {
@@ -65,10 +73,14 @@ const TaskDetail = (props) => {
   const [fetching, setFetching] = useState(true);
   const [taskDebugData, setTaskDebugData] = useState({});
   const [subtaskTableData, setSubtaskTableData] = useState({ columns: ['Task 
ID', 'Status', 'Start Time', 'Finish Time', 'Minion Host Name'], records: [] });
+  const [taskRuntimeConfig, setTaskRuntimeConfig] = useState<TaskRuntimeConfig 
| null>(null);
 
   const fetchData = async () => {
     setFetching(true);
-    const debugRes = await PinotMethodUtils.getTaskDebugData(taskID);
+    const [debugRes, runtimeConfig] = await Promise.all([
+      PinotMethodUtils.getTaskDebugData(taskID), 
+      PinotMethodUtils.getTaskRuntimeConfigData(taskID)
+    ]);
     const subtaskTableRecords = [];
     each(get(debugRes, 'data.subtaskInfos', {}), (subTask) => {
       subtaskTableRecords.push([
@@ -83,6 +95,8 @@ const TaskDetail = (props) => {
       return { ...prevState, records: subtaskTableRecords };
     });
     setTaskDebugData(debugRes.data);
+    setTaskRuntimeConfig(runtimeConfig)
+
     setFetching(false);
   };
 
@@ -90,6 +104,10 @@ const TaskDetail = (props) => {
     fetchData();
   }, []);
 
+  if(fetching) {
+    return <AppLoader />
+  }
+
   return (
     <Grid item xs className={classes.gridContainer}>
       <div className={classes.highlightBackground}>
@@ -112,17 +130,29 @@ const TaskDetail = (props) => {
         </Grid>
       </div>
       <Grid container spacing={2}>
+        {/* Runtime config - JSON */}
         <Grid item xs={12}>
-          {!fetching && (
-            <CustomizedTables
-              title="Sub Tasks"
-              data={subtaskTableData}
-              showSearchBox={true}
-              inAccordionFormat={true}
-              addLinks
-              
baseURL={`/task-queue/${taskType}/tables/${queueTableName}/task/${taskID}/sub-task/`}
+          <SimpleAccordion
+            headerTitle="Runtime Config"
+            showSearchBox={false}
+            detailsContainerClass={classes.runtimeConfigContainer}
+          >
+            <CustomCodemirror
+              data={taskRuntimeConfig}
             />
-          )}
+          </SimpleAccordion>
+        </Grid>
+      
+        {/* Sub task table */}
+        <Grid item xs={12}>
+          <CustomizedTables
+            title="Sub Tasks"
+            data={subtaskTableData}
+            showSearchBox={true}
+            inAccordionFormat={true}
+            addLinks
+            
baseURL={`/task-queue/${taskType}/tables/${queueTableName}/task/${taskID}/sub-task/`}
+          />
         </Grid>
       </Grid>
     </Grid>
diff --git a/pinot-controller/src/main/resources/app/requests/index.ts 
b/pinot-controller/src/main/resources/app/requests/index.ts
index a235c60996..8258e200ed 100644
--- a/pinot-controller/src/main/resources/app/requests/index.ts
+++ b/pinot-controller/src/main/resources/app/requests/index.ts
@@ -20,7 +20,7 @@
 import { AxiosResponse } from 'axios';
 import { TableData, Instances, Instance, Tenants, ClusterConfig, TableName, 
TableSize,
   IdealState, QueryTables, TableSchema, SQLResult, ClusterName, ZKGetList, 
ZKConfig, OperationResponse,
-  BrokerList, ServerList, UserList, TableList, UserObject, 
TaskProgressResponse, TableSegmentJobs
+  BrokerList, ServerList, UserList, TableList, UserObject, 
TaskProgressResponse, TableSegmentJobs, TaskRuntimeConfig
 } from 'Models';
 
 const headers = {
@@ -126,6 +126,9 @@ export const getMinionMeta = (tableName: string, taskType: 
string): Promise<Axio
 export const getTasks = (tableName: string, taskType: string): 
Promise<AxiosResponse<OperationResponse>> =>
   baseApi.get(`/tasks/${taskType}/${tableName}/state`, { headers: { 
...headers, Accept: 'application/json' } });
 
+export const getTaskRuntimeConfig = (taskName: string): 
Promise<AxiosResponse<TaskRuntimeConfig>> =>
+  baseApi.get(`/tasks/task/${taskName}/runtime/config`, { headers: { 
...headers, Accept: 'application/json' }});
+
 export const getTaskDebug = (taskName: string): 
Promise<AxiosResponse<OperationResponse>> =>
   baseApi.get(`/tasks/task/${taskName}/debug?verbosity=1`, { headers: { 
...headers, Accept: 'application/json' } });
 
diff --git a/pinot-controller/src/main/resources/app/utils/PinotMethodUtils.ts 
b/pinot-controller/src/main/resources/app/utils/PinotMethodUtils.ts
index 843cb05326..7cca8e5474 100644
--- a/pinot-controller/src/main/resources/app/utils/PinotMethodUtils.ts
+++ b/pinot-controller/src/main/resources/app/utils/PinotMethodUtils.ts
@@ -92,7 +92,8 @@ import {
   requestDeleteUser,
   requestUpdateUser,
   getTaskProgress,
-  getSegmentReloadStatus
+  getSegmentReloadStatus,
+  getTaskRuntimeConfig
 } from '../requests';
 import { baseApi } from './axios-config';
 import Utils from './Utils';
@@ -827,6 +828,12 @@ const getTasksList = async (tableName, taskType) => {
   return finalResponse;
 };
 
+const getTaskRuntimeConfigData = async (taskName: string) => {
+  const response = await getTaskRuntimeConfig(taskName);
+  
+  return response.data;
+}
+
 const getTaskDebugData = async (taskName) => {
   const debugRes = await getTaskDebug(taskName);
   return debugRes;
@@ -1117,6 +1124,7 @@ export default {
   fetchSegmentReloadStatus,
   getTaskTypeDebugData,
   getTableData,
+  getTaskRuntimeConfigData,
   getTaskInfo,
   stopAllTasks,
   resumeAllTasks,


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

Reply via email to