From 0f81cc84577943b3513e7b735fbed559d69a42e1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 13:09:13 +0000 Subject: [PATCH 1/2] Initial plan From 5b83abc1ee60fe7b4f15bd56fe4b6ea1389a018e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 13:17:23 +0000 Subject: [PATCH 2/2] auditThorSystemEvent: add stats overload and move Startup call next to recordGlobalMetrics Co-authored-by: jakesmith <902700+jakesmith@users.noreply.github.com> Agent-Logs-Url: https://github.com/hpcc-systems/HPCC-Platform/sessions/617fd6b8-d9ea-4e0a-ac6e-9e9b807c9718 --- thorlcr/master/thgraphmanager.cpp | 23 ++++++++++++++++++++++- thorlcr/master/thgraphmanager.hpp | 6 +++++- thorlcr/master/thmastermain.cpp | 6 ++---- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/thorlcr/master/thgraphmanager.cpp b/thorlcr/master/thgraphmanager.cpp index 568a8f990cb..40dbcb6174d 100644 --- a/thorlcr/master/thgraphmanager.cpp +++ b/thorlcr/master/thgraphmanager.cpp @@ -1376,11 +1376,20 @@ void publishPodNames(IWorkUnit *workunit, const char *graphName, const std::vect } } -static void auditThorSystemEventBuilder(std::string &msg, const char *eventName, std::initializer_list args) +static void auditThorSystemEventBuilder(std::string &msg, const char *eventName, std::initializer_list args, std::initializer_list statKinds, std::initializer_list statValues) { + dbgassertex(statKinds.size() == statValues.size()); msg += std::string(",Progress,Thor,") + eventName + "," + getComponentConfigSP()->queryProp("@name"); for (auto arg : args) msg += "," + std::string(arg); + auto kindIt = statKinds.begin(); + auto valueIt = statValues.begin(); + for (; kindIt != statKinds.end(); ++kindIt, ++valueIt) + { + StringBuffer sb; + formatStatistic(sb, *valueIt, *kindIt); + msg += std::string(",") + queryStatisticName(*kindIt) + "=" + sb.str(); + } if (isContainerized()) msg += std::string(",") + k8s::queryMyPodName() + "," + k8s::queryMyContainerName(); else @@ -1391,6 +1400,11 @@ static void auditThorSystemEventBuilder(std::string &msg, const char *eventName, } } +static void auditThorSystemEventBuilder(std::string &msg, const char *eventName, std::initializer_list args) +{ + auditThorSystemEventBuilder(msg, eventName, args, {}, {}); +} + void auditThorSystemEvent(const char *eventName) { std::string msg; @@ -1405,6 +1419,13 @@ void auditThorSystemEvent(const char *eventName, std::initializer_list statKinds, std::initializer_list statValues) +{ + std::string msg; + auditThorSystemEventBuilder(msg, eventName, {}, statKinds, statValues); + LOG(MCauditInfo, "%s", msg.c_str()); +} + void auditThorJobEvent(const char *eventName, const char *wuid, const char *graphName, const char *user) { std::string msg; diff --git a/thorlcr/master/thgraphmanager.hpp b/thorlcr/master/thgraphmanager.hpp index c3a50234c91..b948e427657 100644 --- a/thorlcr/master/thgraphmanager.hpp +++ b/thorlcr/master/thgraphmanager.hpp @@ -18,8 +18,11 @@ #ifndef _THGRAPHMANAGER_HPP #define _THGRAPHMANAGER_HPP -#include +#include #include +#include + +#include "jstats.h" class CSDSServerStatus; interface IException; @@ -52,6 +55,7 @@ void publishPodNames(IWorkUnit *workunit, const char *graphName, const std::vect void relayWuidException(IConstWorkUnit *wu, const IException *exception); void auditThorSystemEvent(const char *eventName); void auditThorSystemEvent(const char *eventName, std::initializer_list args); +void auditThorSystemEvent(const char *eventName, std::initializer_list statKinds, std::initializer_list statValues); void auditThorJobEvent(const char *eventName, const char *wuid, const char *graphName, const char *user); diff --git a/thorlcr/master/thmastermain.cpp b/thorlcr/master/thmastermain.cpp index e68a8e2586c..e91ff8f9025 100644 --- a/thorlcr/master/thmastermain.cpp +++ b/thorlcr/master/thmastermain.cpp @@ -1144,11 +1144,7 @@ int main( int argc, const char *argv[] ) throwStringExceptionV(0, "Failed to connect to all nodes"); PROGLOG("verified mp connection to rest of cluster"); - auditThorSystemEvent("Startup"); - auditStartLogged = true; - writeSentinelFile(sentinelFile); - #ifndef _CONTAINERIZED unsigned pinterval = globals->getPropInt("@system_monitor_interval",1000*60); if (pinterval) @@ -1164,6 +1160,8 @@ int main( int argc, const char *argv[] ) double expenseStart = calcCostNs(getThorManagerRate(), startupElapsedTimeNs) + calcCostNs(getThorWorkerRate(), workerWaitingTimeNs); cost_type costStart = money2cost_type(expenseStart); recordGlobalMetrics("Queue", { {"component", "thor" }, { "name", thorName } }, { StNumStarts, StTimeProvision, StTimeStart, StCostStart }, { 1ULL, workerProvisionTimeNs, startupElapsedTimeNs, costStart }); + auditThorSystemEvent("Startup", { StNumStarts, StTimeProvision, StTimeStart, StCostStart }, { 1ULL, workerProvisionTimeNs, startupElapsedTimeNs, costStart }); + auditStartLogged = true; // NB: workunit/graphName only set in one-shot mode (if isCloud()) thorMain(logHandler, workunit, graphName);