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

lidongdai pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 9963bfc612 [Workflow] Print WorkflowInstance detail/ TaskInstance 
detail when finished (#14677)
9963bfc612 is described below

commit 9963bfc612b30ab014f2a6b08790027fa6aed5fe
Author: Tengting Xu <[email protected]>
AuthorDate: Tue Aug 1 20:50:00 2023 +0800

    [Workflow] Print WorkflowInstance detail/ TaskInstance detail when finished 
(#14677)
    
    * [Workflow] Print WorkflowInstance detail/ TaskInstance detail when 
finished
    
    * [Workflow] minor fix
    
    * [Workflow] add ut
    
    * [Workflow] add header
    
    ---------
    
    Co-authored-by: tengting.xu <[email protected]>
---
 .../master/runner/WorkflowExecuteRunnable.java     |   6 +-
 .../server/master/utils/WorkflowInstanceUtils.java |  88 ++++++++++++++++
 .../master/utils/WorkflowInstanceUtilsTest.java    | 115 +++++++++++++++++++++
 3 files changed, 208 insertions(+), 1 deletion(-)

diff --git 
a/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/runner/WorkflowExecuteRunnable.java
 
b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/runner/WorkflowExecuteRunnable.java
index 70156c76df..389834d25d 100644
--- 
a/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/runner/WorkflowExecuteRunnable.java
+++ 
b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/runner/WorkflowExecuteRunnable.java
@@ -85,6 +85,7 @@ import 
org.apache.dolphinscheduler.server.master.rpc.MasterRpcClient;
 import 
org.apache.dolphinscheduler.server.master.runner.execute.DefaultTaskExecuteRunnable;
 import 
org.apache.dolphinscheduler.server.master.runner.execute.DefaultTaskExecuteRunnableFactory;
 import org.apache.dolphinscheduler.server.master.utils.TaskUtils;
+import org.apache.dolphinscheduler.server.master.utils.WorkflowInstanceUtils;
 import org.apache.dolphinscheduler.service.alert.ProcessAlertManager;
 import org.apache.dolphinscheduler.service.command.CommandService;
 import org.apache.dolphinscheduler.service.cron.CronUtils;
@@ -433,7 +434,8 @@ public class WorkflowExecuteRunnable implements 
IWorkflowExecuteRunnable {
                     taskInstance.getTaskCode(),
                     taskInstance.getState());
             this.updateProcessInstanceState();
-
+            // log the taskInstance in detail after task is finished
+            
log.info(WorkflowInstanceUtils.logTaskInstanceInDetail(taskInstance));
             sendTaskLogOnMasterToRemoteIfNeeded(taskInstance);
         } catch (Exception ex) {
             log.error("Task finish failed, get a exception, will remove this 
taskInstance from completeTaskSet", ex);
@@ -759,6 +761,8 @@ public class WorkflowExecuteRunnable implements 
IWorkflowExecuteRunnable {
             // release task group
             processService.releaseAllTaskGroup(workflowInstance.getId());
         }
+        // Log the workflowInstance in detail
+        
log.info(WorkflowInstanceUtils.logWorkflowInstanceInDetails(workflowInstance));
     }
 
     public void checkSerialProcess(ProcessDefinition processDefinition) {
diff --git 
a/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/utils/WorkflowInstanceUtils.java
 
b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/utils/WorkflowInstanceUtils.java
new file mode 100644
index 0000000000..e64f2acdde
--- /dev/null
+++ 
b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/utils/WorkflowInstanceUtils.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.server.master.utils;
+
+import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
+import org.apache.dolphinscheduler.dao.entity.TaskInstance;
+
+import lombok.experimental.UtilityClass;
+
+import com.google.common.base.Strings;
+
+@UtilityClass
+public class WorkflowInstanceUtils {
+
+    public static String logWorkflowInstanceInDetails(ProcessInstance 
workflowInstance) {
+        StringBuilder logBuilder = new StringBuilder();
+        // set the length for '*'
+        int horizontalLineLength = 80;
+        // Append the title and the centered "Workflow Instance Detail"
+        int titleLength = 40;
+        int leftSpaces = (horizontalLineLength - titleLength) / 2;
+        String centeredTitle = String.format("%" + leftSpaces + "s%s", "", 
"Workflow Instance Detail");
+        logBuilder.append("\n").append(Strings.repeat("*", 
horizontalLineLength)).append("\n")
+                .append(centeredTitle).append("\n")
+                .append(Strings.repeat("*", horizontalLineLength)).append("\n")
+                .append("Workflow Name:             
").append(workflowInstance.getProcessDefinition().getName())
+                .append("\n")
+                .append("Workflow Instance Name:    
").append(workflowInstance.getName()).append("\n")
+                .append("Command Type:              
").append(workflowInstance.getCommandType()).append("\n")
+                .append("State:                     
").append(workflowInstance.getState().getDesc()).append("\n")
+                .append("Host:                      
").append(workflowInstance.getHost()).append("\n")
+                .append("Is Sub Process:            
").append(workflowInstance.getIsSubProcess().getDescp())
+                .append("\n")
+                .append("Run Times:                 
").append(workflowInstance.getRunTimes()).append("\n")
+                .append("Max Try Times:             
").append(workflowInstance.getMaxTryTimes()).append("\n")
+                .append("Schedule Time:             
").append(workflowInstance.getScheduleTime()).append("\n")
+                .append("Dry Run:                   
").append(workflowInstance.getDryRun()).append("\n")
+                .append("Tenant:                    
").append(workflowInstance.getTenantCode()).append("\n")
+                .append("Restart Time:              
").append(workflowInstance.getRestartTime()).append("\n")
+                .append("Work Group:                
").append(workflowInstance.getWorkerGroup()).append("\n")
+                .append("Start Time:                
").append(workflowInstance.getStartTime()).append("\n")
+                .append("End Time:                  
").append(workflowInstance.getEndTime()).append("\n");
+        return logBuilder.toString();
+    }
+
+    public String logTaskInstanceInDetail(TaskInstance taskInstance) {
+        StringBuilder logBuilder = new StringBuilder();
+        // set the length for '*'
+        int horizontalLineLength = 80;
+        // Append the title and the centered "Task Instance Detail"
+        int titleLength = 40;
+        int leftSpaces = (horizontalLineLength - titleLength) / 2;
+        String centeredTitle = String.format("%" + leftSpaces + "s%s", "", 
"Task Instance Detail");
+        logBuilder.append("\n").append(Strings.repeat("*", 
horizontalLineLength)).append("\n")
+                .append(centeredTitle).append("\n")
+                .append(Strings.repeat("*", horizontalLineLength)).append("\n")
+                .append("Task Name:              
").append(taskInstance.getName()).append("\n")
+                .append("Workflow Instance Name: 
").append(taskInstance.getProcessInstance().getName()).append("\n")
+                .append("Task Execute Type:      
").append(taskInstance.getTaskExecuteType().getDesc()).append("\n")
+                .append("Execute State:          
").append(taskInstance.getState().getDesc()).append("\n")
+                .append("Host:                   
").append(taskInstance.getHost()).append("\n")
+                .append("Task Type:              
").append(taskInstance.getTaskType()).append("\n")
+                .append("Priority:               
").append(taskInstance.getTaskInstancePriority().getDescp())
+                .append("\n")
+                .append("Tenant:                 
").append(taskInstance.getProcessInstance().getTenantCode())
+                .append("\n")
+                .append("First Submit Time:      
").append(taskInstance.getFirstSubmitTime()).append("\n")
+                .append("Submit Time:            
").append(taskInstance.getSubmitTime()).append("\n")
+                .append("Start Time:             
").append(taskInstance.getStartTime()).append("\n")
+                .append("End Time:               
").append(taskInstance.getEndTime()).append("\n");
+        return logBuilder.toString();
+    }
+}
diff --git 
a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/utils/WorkflowInstanceUtilsTest.java
 
b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/utils/WorkflowInstanceUtilsTest.java
new file mode 100644
index 0000000000..d52c436add
--- /dev/null
+++ 
b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/utils/WorkflowInstanceUtilsTest.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.server.master.utils;
+
+import org.apache.dolphinscheduler.common.enums.CommandType;
+import org.apache.dolphinscheduler.common.enums.Flag;
+import org.apache.dolphinscheduler.common.enums.Priority;
+import org.apache.dolphinscheduler.common.enums.TaskExecuteType;
+import org.apache.dolphinscheduler.common.enums.WorkflowExecutionStatus;
+import org.apache.dolphinscheduler.dao.entity.ProcessDefinition;
+import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
+import org.apache.dolphinscheduler.dao.entity.TaskInstance;
+import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus;
+
+import java.sql.Date;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class WorkflowInstanceUtilsTest {
+
+    @Test
+    public void testLogWorkflowInstanceInDetails() {
+        ProcessDefinition processDefinition = new ProcessDefinition();
+        processDefinition.setName("test_workflow");
+
+        ProcessInstance workflowInstance = new ProcessInstance();
+        workflowInstance.setProcessDefinition(processDefinition);
+        workflowInstance.setName("test_workflow_20230801");
+        workflowInstance.setCommandType(CommandType.REPEAT_RUNNING);
+        workflowInstance.setState(WorkflowExecutionStatus.SUCCESS);
+        workflowInstance.setHost("127.0.0.1");
+        workflowInstance.setIsSubProcess(Flag.NO);
+        workflowInstance.setRunTimes(1);
+        workflowInstance.setMaxTryTimes(0);
+        workflowInstance.setScheduleTime(Date.valueOf("2023-08-01"));
+        workflowInstance.setDryRun(0);
+        workflowInstance.setTenantCode("default");
+        workflowInstance.setRestartTime(Date.valueOf("2023-08-01"));
+        workflowInstance.setWorkerGroup("default");
+        workflowInstance.setStartTime(Date.valueOf("2023-08-01"));
+        workflowInstance.setEndTime(Date.valueOf("2023-08-01"));
+        Assertions.assertEquals("\n"
+                + 
"********************************************************************************\n"
+                + "                    Workflow Instance Detail\n"
+                + 
"********************************************************************************\n"
+                + "Workflow Name:             test_workflow\n"
+                + "Workflow Instance Name:    test_workflow_20230801\n"
+                + "Command Type:              REPEAT_RUNNING\n"
+                + "State:                     success\n"
+                + "Host:                      127.0.0.1\n"
+                + "Is Sub Process:            no\n"
+                + "Run Times:                 1\n"
+                + "Max Try Times:             0\n"
+                + "Schedule Time:             2023-08-01\n"
+                + "Dry Run:                   0\n"
+                + "Tenant:                    default\n"
+                + "Restart Time:              2023-08-01\n"
+                + "Work Group:                default\n"
+                + "Start Time:                2023-08-01\n"
+                + "End Time:                  2023-08-01\n",
+                
WorkflowInstanceUtils.logWorkflowInstanceInDetails(workflowInstance));
+    }
+
+    @Test
+    public void testLogTaskInstanceInDetails() {
+        ProcessInstance processInstance = new ProcessInstance();
+        processInstance.setName("test_process");
+        processInstance.setTenantCode("default");
+
+        TaskInstance taskInstance = new TaskInstance();
+        taskInstance.setName("test_task");
+        taskInstance.setProcessInstance(processInstance);
+        taskInstance.setState(TaskExecutionStatus.SUCCESS);
+        taskInstance.setTaskExecuteType(TaskExecuteType.BATCH);
+        taskInstance.setHost("127.0.0.1");
+        taskInstance.setTaskType("SHELL");
+        taskInstance.setTaskInstancePriority(Priority.MEDIUM);
+        taskInstance.setFirstSubmitTime(Date.valueOf("2023-08-01"));
+        taskInstance.setSubmitTime(Date.valueOf("2023-08-01"));
+        taskInstance.setStartTime(Date.valueOf("2023-08-01"));
+        taskInstance.setEndTime(Date.valueOf("2023-08-01"));
+        Assertions.assertEquals("\n"
+                + 
"********************************************************************************\n"
+                + "                    Task Instance Detail\n"
+                + 
"********************************************************************************\n"
+                + "Task Name:              test_task\n"
+                + "Workflow Instance Name: test_process\n"
+                + "Task Execute Type:      batch\n"
+                + "Execute State:          success\n"
+                + "Host:                   127.0.0.1\n"
+                + "Task Type:              SHELL\n"
+                + "Priority:               medium\n"
+                + "Tenant:                 default\n"
+                + "First Submit Time:      2023-08-01\n"
+                + "Submit Time:            2023-08-01\n"
+                + "Start Time:             2023-08-01\n"
+                + "End Time:               2023-08-01\n", 
WorkflowInstanceUtils.logTaskInstanceInDetail(taskInstance));
+    }
+}

Reply via email to