Просмотр исходного кода

Show process job metrics in AP Job tab

Signed-off-by: Sven Hwang <[email protected]>
Sven Hwang 3 лет назад
Родитель
Сommit
30bcc593df

+ 7 - 1
Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp

@@ -231,7 +231,13 @@ namespace AssetProcessor
                 // because sometimes jobs take a short cut from "started" -> "failed" or "started" -> "complete
                 // because sometimes jobs take a short cut from "started" -> "failed" or "started" -> "complete
                 // without going thru the RC.
                 // without going thru the RC.
                 // as such, all the code in this block should be crafted to work regardless of whether its double called.
                 // as such, all the code in this block should be crafted to work regardless of whether its double called.
-                AssetProcessor::StatsCapture::EndCaptureStat(statKey.toUtf8().constData());
+                AZStd::optional<AZStd::sys_time_t> operationDuration =
+                    AssetProcessor::StatsCapture::EndCaptureStat(statKey.toUtf8().constData());
+
+                if (operationDuration)
+                {
+                    Q_EMIT JobProcessDurationChanged(jobEntry, static_cast<unsigned int>(operationDuration.value()));
+                }
 
 
                 m_jobRunKeyToJobInfoMap.erase(jobEntry.m_jobRunKey);
                 m_jobRunKeyToJobInfoMap.erase(jobEntry.m_jobRunKey);
                 Q_EMIT SourceFinished(sourceUUID, legacySourceUUID);
                 Q_EMIT SourceFinished(sourceUUID, legacySourceUUID);

+ 1 - 0
Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.h

@@ -259,6 +259,7 @@ namespace AssetProcessor
         void JobRemoved(AzToolsFramework::AssetSystem::JobInfo jobInfo);
         void JobRemoved(AzToolsFramework::AssetSystem::JobInfo jobInfo);
 
 
         void JobComplete(JobEntry jobEntry, AzToolsFramework::AssetSystem::JobStatus status);
         void JobComplete(JobEntry jobEntry, AzToolsFramework::AssetSystem::JobStatus status);
+        void JobProcessDurationChanged(JobEntry jobEntry, unsigned int duration);
 
 
         //! Send a message when a new path dependency is resolved, so that downstream tools know the AssetId of the resolved dependency.
         //! Send a message when a new path dependency is resolved, so that downstream tools know the AssetId of the resolved dependency.
         void PathDependencyResolved(const AZ::Data::AssetId& assetId, const AzToolsFramework::AssetDatabase::ProductDependencyDatabaseEntry& entry);
         void PathDependencyResolved(const AZ::Data::AssetId& assetId, const AzToolsFramework::AssetDatabase::ProductDependencyDatabaseEntry& entry);

+ 18 - 0
Code/Tools/AssetProcessor/native/resourcecompiler/JobsModel.cpp

@@ -84,6 +84,8 @@ namespace AssetProcessor
                     return tr("Job Key");
                     return tr("Job Key");
                 case ColumnCompleted:
                 case ColumnCompleted:
                     return tr("Completed");
                     return tr("Completed");
+                case ColumnProcessDuration:
+                    return tr("Last Process Duration (ms)");
                 default:
                 default:
                     break;
                     break;
                 }
                 }
@@ -175,6 +177,8 @@ namespace AssetProcessor
                 {
                 {
                     return getItem(index.row())->m_completedTime.toString("hh:mm:ss.zzz MMM dd, yyyy");
                     return getItem(index.row())->m_completedTime.toString("hh:mm:ss.zzz MMM dd, yyyy");
                 }
                 }
+            case ColumnProcessDuration:
+                return getItem(index.row())->m_processDuration;
             default:
             default:
                 break;
                 break;
             }
             }
@@ -443,6 +447,20 @@ namespace AssetProcessor
         }
         }
     }
     }
 
 
+    void JobsModel::OnJobProcessDurationChanged(JobEntry jobEntry, unsigned int duration)
+    {
+        QueueElementID elementId(jobEntry.m_databaseSourceName, jobEntry.m_platformInfo.m_identifier.c_str(), jobEntry.m_jobKey);
+
+        if (auto iter = m_cachedJobsLookup.find(elementId); iter != m_cachedJobsLookup.end())
+        {
+            unsigned int jobIndex = iter.value();
+            CachedJobInfo* jobInfo = m_cachedJobs[jobIndex];
+            jobInfo->m_processDuration = aznumeric_cast<AZ::u32>(duration);
+            Q_EMIT dataChanged(
+                index(jobIndex, ColumnProcessDuration, QModelIndex()), index(jobIndex, ColumnProcessDuration, QModelIndex()));
+        }
+    }
+
     void JobsModel::OnSourceRemoved(QString sourceDatabasePath)
     void JobsModel::OnSourceRemoved(QString sourceDatabasePath)
     {
     {
         // when a source is removed, we need to eliminate all job entries for that source regardless of all other details of it.
         // when a source is removed, we need to eliminate all job entries for that source regardless of all other details of it.

+ 3 - 0
Code/Tools/AssetProcessor/native/resourcecompiler/JobsModel.h

@@ -44,6 +44,7 @@ namespace AssetProcessor
         AZ::u32 m_errorCount;
         AZ::u32 m_errorCount;
         unsigned int m_jobRunKey;
         unsigned int m_jobRunKey;
         AZ::Uuid m_builderGuid;
         AZ::Uuid m_builderGuid;
+        AZ::u32 m_processDuration; // in milliseconds
     };
     };
     /**
     /**
     * The JobsModel class contains list of jobs from both the Database and the RCController
     * The JobsModel class contains list of jobs from both the Database and the RCController
@@ -69,6 +70,7 @@ namespace AssetProcessor
             ColumnCompleted,
             ColumnCompleted,
             ColumnPlatform,
             ColumnPlatform,
             ColumnJobKey,
             ColumnJobKey,
+            ColumnProcessDuration,
             Max
             Max
         };
         };
 
 
@@ -90,6 +92,7 @@ namespace AssetProcessor
 
 
 public Q_SLOTS:
 public Q_SLOTS:
         void OnJobStatusChanged(JobEntry entry, AzToolsFramework::AssetSystem::JobStatus status);
         void OnJobStatusChanged(JobEntry entry, AzToolsFramework::AssetSystem::JobStatus status);
+        void OnJobProcessDurationChanged(JobEntry jobEntry, unsigned int duration);
         void OnJobRemoved(AzToolsFramework::AssetSystem::JobInfo jobInfo);
         void OnJobRemoved(AzToolsFramework::AssetSystem::JobInfo jobInfo);
         void OnSourceRemoved(QString sourceDatabasePath);
         void OnSourceRemoved(QString sourceDatabasePath);
         void OnFolderRemoved(QString folderPath);
         void OnFolderRemoved(QString folderPath);

+ 5 - 0
Code/Tools/AssetProcessor/native/ui/MainWindow.cpp

@@ -459,6 +459,11 @@ void MainWindow::Activate()
     connect(m_guiApplicationManager->GetAssetProcessorManager(), &AssetProcessor::AssetProcessorManager::JobRemoved, m_jobsModel, &AssetProcessor::JobsModel::OnJobRemoved);
     connect(m_guiApplicationManager->GetAssetProcessorManager(), &AssetProcessor::AssetProcessorManager::JobRemoved, m_jobsModel, &AssetProcessor::JobsModel::OnJobRemoved);
     connect(m_guiApplicationManager->GetAssetProcessorManager(), &AssetProcessor::AssetProcessorManager::SourceDeleted, m_jobsModel, &AssetProcessor::JobsModel::OnSourceRemoved);
     connect(m_guiApplicationManager->GetAssetProcessorManager(), &AssetProcessor::AssetProcessorManager::SourceDeleted, m_jobsModel, &AssetProcessor::JobsModel::OnSourceRemoved);
     connect(m_guiApplicationManager->GetAssetProcessorManager(), &AssetProcessor::AssetProcessorManager::SourceFolderDeleted, m_jobsModel, &AssetProcessor::JobsModel::OnFolderRemoved);
     connect(m_guiApplicationManager->GetAssetProcessorManager(), &AssetProcessor::AssetProcessorManager::SourceFolderDeleted, m_jobsModel, &AssetProcessor::JobsModel::OnFolderRemoved);
+    connect(
+        m_guiApplicationManager->GetAssetProcessorManager(),
+        &AssetProcessor::AssetProcessorManager::JobProcessDurationChanged,
+        m_jobsModel,
+        &AssetProcessor::JobsModel::OnJobProcessDurationChanged);
 
 
     connect(ui->jobTreeView, &AzQtComponents::TableView::customContextMenuRequested, this, &MainWindow::ShowJobViewContextMenu);
     connect(ui->jobTreeView, &AzQtComponents::TableView::customContextMenuRequested, this, &MainWindow::ShowJobViewContextMenu);
     connect(ui->jobContextLogTableView, &AzQtComponents::TableView::customContextMenuRequested, this, &MainWindow::ShowLogLineContextMenu);
     connect(ui->jobContextLogTableView, &AzQtComponents::TableView::customContextMenuRequested, this, &MainWindow::ShowLogLineContextMenu);