Author: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Thu Sep 04 19:31:55 2025 +0100
feat: Enhance build metrics with parallel, uuid, and time
This commit introduces several enhancements to the build metrics system:
1. **Populate `parallel` column:** The `parallel` column in the
`build_metrics` table is now populated with the `SAI_PARALLEL` value
used by the builder. The builder logic is updated to use a `parallel`
value from the task description, defaulting to 1 if not specified.
2. **Add Task UUID and Unixtime:** The `task_uuid` and a builder-provided
`unixtime` are now stored in the `build_metrics` table. This allows
for better tracking and grouping of metrics for specific task runs.
3. **Display Metrics in UI:** The frontend is updated to display a
summary of build metrics for each step in the task-specific view.
The summary appears in the task info header and updates dynamically
as new metrics are received.
Note: The database schema for the `build_metrics` table has been updated.
If you have an existing `build-metrics.sqlite3` file, you will need to
remove it for the new schema to be applied on the next run.
diff --git a/assets/sai.js b/assets/sai.js
index ee428f5..d1b9363 100644
--- a/assets/sai.js
+++ b/assets/sai.js
@@ -656,7 +656,7 @@ function sai_taskinfo_render(t, now_ut)
agify(now_ut, t.t.started) + " ago, Dur: " +
(t.t.duration ? t.t.duration / 1000000 :
now_ut - t.t.started).toFixed(1) +
- "s
";
+ "s";
sai_arts = "";
}
@@ -1329,6 +1329,22 @@ function ws_open_sai()
}
break;
+ case "com.warmcat.sai.build-metric":
+ var summaryDiv = document.getElementById("metrics-summary-" + jso.task_uuid);
+ if (summaryDiv) {
+ var s = "" +
+ "Step Metrics: " +
+ "CPU: " + (jso.us_cpu_user / 1000000).toFixed(2) + "s user, " +
+ (jso.us_cpu_sys / 1000000).toFixed(2) + "s sys; " +
+ "Wallclock: " + (jso.wallclock_us / 1000000).toFixed(2) + "s; " +
+ "Mem: " + humanize(jso.peak_mem_rss) + "B; " +
+ "Stg: " + humanize(jso.stg_bytes) + "B; " +
+ "Parallel: " + jso.parallel +
+ "
";
+ summaryDiv.innerHTML += s;
+ }
+ break;
+
case "sai.warmcat.com.overview":
/*
* Sent with an array of e[] to start, but also
diff --git a/src/builder/b-nspawn.c b/src/builder/b-nspawn.c
index 9bcf177..c28eb4b 100644
--- a/src/builder/b-nspawn.c
+++ b/src/builder/b-nspawn.c
@@ -44,137 +44,6 @@ static char csep = '/';
static char csep = '\\';
#endif
-const char *git_helper_sh =
- "#!/bin/bash\n"
- "export PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin\n"
- "set -e\n"
- "echo \"git_helper_sh: starting\"\n"
- "OPERATION=$1\n"
- "shift\n"
- "if [ \"$OPERATION\" == \"mirror\" ]; then\n"
- " REMOTE_URL=$1\n"
- " REF=$2\n"
- " HASH=$3\n"
- " MIRROR_PATH=\"$HOME/git-mirror/$4\"\n"
- " for i in $(seq 1 60); do\n"
- " if [ -d \"$MIRROR_PATH/.git\" ]; then\n"
- " if git -C \"$MIRROR_PATH\" rev-parse -q --verify \"ref-$HASH\" > /dev/null; then\n"
- " exit 0\n"
- " fi\n"
- " fi\n"
- " if mkdir \"$MIRROR_PATH.lock\" 2>/dev/null; then\n"
- " trap 'rm -rf \"$MIRROR_PATH.lock\"' EXIT\n"
- " if [ -d \"$MIRROR_PATH/.git\" ]; then\n"
- " if git -C \"$MIRROR_PATH\" rev-parse -q --verify \"ref-$HASH\" > /dev/null; then\n"
- " exit 0\n"
- " fi\n"
- " fi\n"
- " mkdir -p \"$MIRROR_PATH\"\n"
- " if [ ! -d \"$MIRROR_PATH/.git\" ]; then\n"
- " git init --bare \"$MIRROR_PATH\"\n"
- " fi\n"
- " REFSPEC=\"$REF:ref-$HASH\"\n"
- " git -C \"$MIRROR_PATH\" fetch \"$REMOTE_URL\" \"+$REFSPEC\"\n"
- " exit 0\n"
- " fi\n"
- " echo \"git mirror locked, waiting...\"\n"
- " sleep 1\n"
- " done\n"
- " exit 1\n"
- "elif [ \"$OPERATION\" == \"checkout\" ]; then\n"
- " MIRROR_PATH=\"$HOME/git-mirror/$1\"\n"
- " BUILD_DIR=$2\n"
- " HASH=$3\n"
- " if [ ! -d \"$BUILD_DIR/.git\" ]; then\n"
- " rm -rf \"$BUILD_DIR\"\n"
- " mkdir -p \"$BUILD_DIR\"\n"
- " git -C \"$BUILD_DIR\" init\n"
- " fi\n"
- " if ! git -C \"$BUILD_DIR\" fetch \"$MIRROR_PATH\" \"ref-$HASH\"; then\n"
- " exit 2\n"
- " fi\n"
- " git -C \"$BUILD_DIR\" checkout -f \"$HASH\"\n"
- " git -C \"$BUILD_DIR\" clean -fdx\n"
- "else\n"
- " exit 1\n"
- "fi\n"
- "echo \">>> Git helper script finished.\"\n"
- "exit 0\n"
-;
-
-const char *git_helper_bat =
- "@echo on\n"
- "setlocal EnableDelayedExpansion\n"
- "echo \"git_helper_bat: starting\"\n"
- "set \"OPERATION=%~1\"\n"
- "echo \"OPERATION: !OPERATION!\"\n"
- "if /i \"!OPERATION!\"==\"mirror\" (\n"
- " set \"REMOTE_URL=%~2\"\n"
- " set \"REF=%~3\"\n"
- " set \"HASH=%~4\"\n"
- " set \"MIRROR_PATH=%HOME%\\\\git-mirror\\\\%~5\"\n"
- " echo \"REMOTE_URL: !REMOTE_URL!\"\n"
- " echo \"REF: !REF!\"\n"
- " echo \"HASH: !HASH!\"\n"
- " echo \"MIRROR_PATH: !MIRROR_PATH!\"\n"
- " :lock_wait\n"
- " mkdir \"!MIRROR_PATH!.lock\" 2>nul\n"
- " if errorlevel 1 (\n"
- " echo \"git mirror locked, waiting...\"\n"
- " timeout /t 1 /nobreak > nul\n"
- " goto :lock_wait\n"
- " )\n"
- " if exist \"!MIRROR_PATH!\\\\.git\" (\n"
- " git -C \"!MIRROR_PATH!\" rev-parse -q --verify \"ref-!HASH!\" > nul 2> nul\n"
- " if exist !MIRROR_PATH!\\\\.git if not errorlevel 1 (\n"
- " rmdir \"!MIRROR_PATH!.lock\"\n"
- " exit /b 0\n"
- " )\n"
- " )\n"
- " if not exist \"!MIRROR_PATH!\\\\.\" (\n"
- " mkdir \"!MIRROR_PATH!\"\n"
- " )\n"
- " if not exist \"!MIRROR_PATH!\\\\.git\" (\n"
- " git init --bare \"!MIRROR_PATH!\"\n"
- " if errorlevel 1 (\n"
- " rmdir \"!MIRROR_PATH!.lock\"\n"
- " exit /b 1\n"
- " )\n"
- " )\n"
- " set \"REFSPEC=!REF!:ref-!HASH!\"\n"
- " echo \"REFSPEC: !REFSPEC!\"\n"
- " git -C \"!MIRROR_PATH!\" fetch \"!REMOTE_URL!\" \"!REFSPEC!\" 2>&1\n"
- " if !ERRORLEVEL! neq 0 (\n"
- " echo \"git fetch failed with errorlevel !ERRORLEVEL!\"\n"
- " rmdir \"!MIRROR_PATH!.lock\"\n"
- " exit /b 1\n"
- " )\n"
- " rmdir \"!MIRROR_PATH!.lock\"\n"
- " exit /b 0\n"
- ")\n"
- "if /i \"!OPERATION!\"==\"checkout\" (\n"
- " set \"MIRROR_PATH=%HOME%\\\\git-mirror\\\\%~2\"\n"
- " set \"BUILD_DIR=%~3\"\n"
- " set \"HASH=%~4\"\n"
- " echo \"MIRROR_PATH: !MIRROR_PATH!\"\n"
- " echo \"BUILD_DIR: !BUILD_DIR!\"\n"
- " echo \"HASH: !HASH!\"\n"
- " if not exist \"!BUILD_DIR!\\\\.git\" (\n"
- " if exist \"!BUILD_DIR!\\\\\" rmdir /s /q \"!BUILD_DIR!\"\n"
- " mkdir \"!BUILD_DIR!\"\n"
- " git -C \"!BUILD_DIR!\" init\n"
- " if errorlevel 1 exit /b 1\n"
- " )\n"
- " git -C \"!BUILD_DIR!\" fetch \"!MIRROR_PATH!\" \"ref-!HASH!\"\n"
- " if errorlevel 1 exit /b 2\n"
- " git -C \"!BUILD_DIR!\" checkout -f \"!HASH!\"\n"
- " if errorlevel 1 exit /b 1\n"
- " echo \">>> Git helper script finished.\"\n"
- " exit /b 0\n"
- ")\n"
- "exit /b 1\n"
-;
-
extern struct lws_vhost *builder_vhost;
struct ws_capture_chunk *
@@ -418,11 +287,14 @@ sai_lsp_reap_cb(void *opaque, const lws_spawn_resource_us_t *res, siginfo_t *si,
lws_strncpy(m->builder_name, ns->sp->name, sizeof(m->builder_name));
lws_strncpy(m->project_name, ns->project_name, sizeof(m->project_name));
lws_strncpy(m->ref, ns->ref, sizeof(m->ref));
+ lws_strncpy(m->task_uuid, ns->task->uuid, sizeof(m->task_uuid));
+ m->unixtime = (uint64_t)time(NULL);
m->us_cpu_user = res->us_cpu_user;
m->us_cpu_sys = res->us_cpu_sys;
m->wallclock_us = us_wallclock;
m->peak_mem_rss = res->peak_mem_rss;
m->stg_bytes = du.size_in_bytes;
+ m->parallel = ns->task->parallel;
lws_dll2_add_tail(&m->list, &ns->spm->build_metric_list);
if (lws_ss_request_tx(ns->spm->ss))
@@ -649,7 +521,7 @@ saib_spawn_script(struct sai_nspawn *ns)
n = lws_snprintf(st, sizeof(st),
ns->current_step ? runscript_win_next : runscript_win_first,
ns->instance_ordinal,
- 1,
+ ns->task->parallel ? ns->task->parallel : 1,
respath, ns->slp_control.sockpath,
ns->slp[0].sockpath, ns->slp[1].sockpath, builder.home,
ns->inp, one_step);
@@ -667,7 +539,7 @@ saib_spawn_script(struct sai_nspawn *ns)
script_template,
builder.home, ns->fsm.ovname,
ns->project_name, ns->ref, ns->instance_ordinal,
- 1,
+ ns->task->parallel ? ns->task->parallel : 1,
respath, ns->slp_control.sockpath,
ns->slp[0].sockpath, ns->slp[1].sockpath,
builder.home, one_step);
@@ -711,7 +583,11 @@ saib_spawn_script(struct sai_nspawn *ns)
op->ns = ns;
ns->op = op;
+#if defined(WIN32)
+ op->spawn = _strdup(one_step);
+#else
op->spawn = strdup(one_step);
+#endif
op->start_time = lws_now_usecs();
info.opaque = op;
diff --git a/src/builder/b-task.c b/src/builder/b-task.c
index 58fa268..85a8a00 100644
--- a/src/builder/b-task.c
+++ b/src/builder/b-task.c
@@ -24,9 +24,143 @@
#include
#include
#include
+#include
#include "b-private.h"
+const char *git_helper_sh =
+ "#!/bin/bash\n"
+ "export PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin\n"
+ "set -e\n"
+ "echo \"git_helper_sh: starting\"\n"
+ "OPERATION=$1\n"
+ "shift\n"
+ "if [ \"$OPERATION\" == \"mirror\" ]; then\n"
+ " REMOTE_URL=$1\n"
+ " REF=$2\n"
+ " HASH=$3\n"
+ " MIRROR_PATH=\"$HOME/git-mirror/$4\"\n"
+ " for i in $(seq 1 60); do\n"
+ " if [ -d \"$MIRROR_PATH/.git\" ]; then\n"
+ " if git -C \"$MIRROR_PATH\" rev-parse -q --verify \"ref-$HASH\" > /dev/null; then\n"
+ " exit 0\n"
+ " fi\n"
+ " fi\n"
+ " if mkdir \"$MIRROR_PATH.lock\" 2>/dev/null; then\n"
+ " trap 'rm -rf \"$MIRROR_PATH.lock\"' EXIT\n"
+ " if [ -d \"$MIRROR_PATH/.git\" ]; then\n"
+ " if git -C \"$MIRROR_PATH\" rev-parse -q --verify \"ref-$HASH\" > /dev/null; then\n"
+ " exit 0\n"
+ " fi\n"
+ " fi\n"
+ " mkdir -p \"$MIRROR_PATH\"\n"
+ " if [ ! -d \"$MIRROR_PATH/.git\" ]; then\n"
+ " git init --bare \"$MIRROR_PATH\"\n"
+ " fi\n"
+ " REFSPEC=\"$REF:ref-$HASH\"\n"
+ " git -C \"$MIRROR_PATH\" fetch \"$REMOTE_URL\" \"+$REFSPEC\"\n"
+ " exit 0\n"
+ " fi\n"
+ " echo \"git mirror locked, waiting...\"\n"
+ " sleep 1\n"
+ " done\n"
+ " exit 1\n"
+ "elif [ \"$OPERATION\" == \"checkout\" ]; then\n"
+ " MIRROR_PATH=\"$HOME/git-mirror/$1\"\n"
+ " BUILD_DIR=$2\n"
+ " HASH=$3\n"
+ " if [ ! -d \"$BUILD_DIR/.git\" ]; then\n"
+ " rm -rf \"$BUILD_DIR\"\n"
+ " mkdir -p \"$BUILD_DIR\"\n"
+ " git -C \"$BUILD_DIR\" init\n"
+ " fi\n"
+ " if ! git -C \"$BUILD_DIR\" fetch \"$MIRROR_PATH\" \"ref-$HASH\"; then\n"
+ " exit 2\n"
+ " fi\n"
+ " git -C \"$BUILD_DIR\" checkout -f \"$HASH\"\n"
+ " git -C \"$BUILD_DIR\" clean -fdx\n"
+ "else\n"
+ " exit 1\n"
+ "fi\n"
+ "echo \">>> Git helper script finished.\"\n"
+ "exit 0\n"
+;
+
+const char *git_helper_bat =
+ "@echo on\n"
+ "setlocal EnableDelayedExpansion\n"
+ "echo \"git_helper_bat: starting\"\n"
+ "set \"OPERATION=%~1\"\n"
+ "echo \"OPERATION: !OPERATION!\"\n"
+ "if /i \"!OPERATION!\"==\"mirror\" (\n"
+ " set \"REMOTE_URL=%~2\"\n"
+ " set \"REF=%~3\"\n"
+ " set \"HASH=%~4\"\n"
+ " set \"MIRROR_PATH=%HOME%\\\\git-mirror\\\\%~5\"\n"
+ " echo \"REMOTE_URL: !REMOTE_URL!\"\n"
+ " echo \"REF: !REF!\"\n"
+ " echo \"HASH: !HASH!\"\n"
+ " echo \"MIRROR_PATH: !MIRROR_PATH!\"\n"
+ " :lock_wait\n"
+ " mkdir \"!MIRROR_PATH!.lock\" 2>nul\n"
+ " if errorlevel 1 (\n"
+ " echo \"git mirror locked, waiting...\"\n"
+ " timeout /t 1 /nobreak > nul\n"
+ " goto :lock_wait\n"
+ " )\n"
+ " if exist \"!MIRROR_PATH!\\\\.git\" (\n"
+ " git -C \"!MIRROR_PATH!\" rev-parse -q --verify \"ref-!HASH!\" > nul 2> nul\n"
+ " if exist !MIRROR_PATH!\\\\.git if not errorlevel 1 (\n"
+ " rmdir \"!MIRROR_PATH!.lock\"\n"
+ " exit /b 0\n"
+ " )\n"
+ " )\n"
+ " if not exist \"!MIRROR_PATH!\\\\.\" (\n"
+ " mkdir \"!MIRROR_PATH!\"\n"
+ " )\n"
+ " if not exist \"!MIRROR_PATH!\\\\.git\" (\n"
+ " git init --bare \"!MIRROR_PATH!\"\n"
+ " if errorlevel 1 (\n"
+ " rmdir \"!MIRROR_PATH!.lock\"\n"
+ " exit /b 1\n"
+ " )\n"
+ " )\n"
+ " set \"REFSPEC=!REF!:ref-!HASH!\"\n"
+ " echo \"REFSPEC: !REFSPEC!\"\n"
+ " git -C \"!MIRROR_PATH!\" fetch \"!REMOTE_URL!\" \"!REFSPEC!\" 2>&1\n"
+ " if !ERRORLEVEL! neq 0 (\n"
+ " echo \"git fetch failed with errorlevel !ERRORLEVEL!\"\n"
+ " rmdir \"!MIRROR_PATH!.lock\"\n"
+ " exit /b 1\n"
+ " )\n"
+ " rmdir \"!MIRROR_PATH!.lock\"\n"
+ " exit /b 0\n"
+ ")\n"
+ "if /i \"!OPERATION!\"==\"checkout\" (\n"
+ " set \"MIRROR_PATH=%HOME%\\\\git-mirror\\\\%~2\"\n"
+ " set \"BUILD_DIR=%~3\"\n"
+ " set \"HASH=%~4\"\n"
+ " echo \"MIRROR_PATH: !MIRROR_PATH!\"\n"
+ " echo \"BUILD_DIR: !BUILD_DIR!\"\n"
+ " echo \"HASH: !HASH!\"\n"
+ " if not exist \"!BUILD_DIR!\\\\.git\" (\n"
+ " if exist \"!BUILD_DIR!\\\\\" rmdir /s /q \"!BUILD_DIR!\"\n"
+ " mkdir \"!BUILD_DIR!\"\n"
+ " git -C \"!BUILD_DIR!\" init\n"
+ " if errorlevel 1 exit /b 1\n"
+ " )\n"
+ " git -C \"!BUILD_DIR!\" fetch \"!MIRROR_PATH!\" \"ref-!HASH!\"\n"
+ " if errorlevel 1 exit /b 2\n"
+ " git -C \"!BUILD_DIR!\" checkout -f \"!HASH!\"\n"
+ " if errorlevel 1 exit /b 1\n"
+ " echo \">>> Git helper script finished.\"\n"
+ " exit /b 0\n"
+ ")\n"
+ "exit /b 1\n"
+;
+
+
+
static int
saib_can_accept_task(sai_task_t *task, sai_plat_t *sp)
{
@@ -818,36 +952,41 @@ saib_ws_json_rx_builder(struct sai_plat_server *spm, const void *in, size_t len)
{
char script_path[512];
int fd;
-
+#if !defined(WIN32)
/* create git_helper.sh */
lws_snprintf(script_path, sizeof(script_path), "%s%cgit_helper.sh",
ns->inp, csep);
-#if defined(WIN32)
- if (_sopen_s(&fd, script_path, _O_CREAT | _O_TRUNC | _O_WRONLY,
- _SH_DENYNO, _S_IWRITE))
- fd = -1;
-#else
fd = open(script_path, O_CREAT | O_TRUNC | O_WRONLY, 0755);
-#endif
- if (fd >= 0) {
- write(fd, git_helper_sh, strlen(git_helper_sh));
- close(fd);
+ if (fd < 0) {
+ lwsl_warn("%s: failed to open git script for write %s\n", __func__, script_path);
+ goto bail;
}
+ if ((size_t)write(fd, git_helper_sh, strlen(git_helper_sh)) != strlen(git_helper_sh)) {
+ lwsl_warn("%s: failed to write git script %s\n", __func__, script_path);
+ close(fd);
+ goto bail;
+ }
+ close(fd);
+#else
/* create git_helper.bat */
lws_snprintf(script_path, sizeof(script_path), "%s%cgit_helper.bat",
ns->inp, csep);
-#if defined(WIN32)
if (_sopen_s(&fd, script_path, _O_CREAT | _O_TRUNC | _O_WRONLY,
_SH_DENYNO, _S_IWRITE))
fd = -1;
-#else
- fd = open(script_path, O_CREAT | O_TRUNC | O_WRONLY, 0644);
-#endif
- if (fd >= 0) {
- write(fd, git_helper_bat, strlen(git_helper_bat));
+ if (fd < 0) {
+ lwsl_warn("%s: failed to open git script for write %s\n", __func__, script_path);
+ goto bail;
+ }
+
+ if ((size_t)write(fd, git_helper_bat, (unsigned int)strlen(git_helper_bat)) != strlen(git_helper_bat)) {
+ lwsl_warn("%s: failed to write git script %s\n", __func__, script_path);
close(fd);
+ goto bail;
}
+ close(fd);
+#endif
}
saib_set_ns_state(ns, NSSTATE_EXECUTING_STEPS);
@@ -876,9 +1015,8 @@ saib_ws_json_rx_builder(struct sai_plat_server *spm, const void *in, size_t len)
* connected to about our change in task load status
*/
- if (saib_queue_task_status_update(sp, spm, NULL)) {
+ if (saib_queue_task_status_update(sp, spm, NULL))
goto bail;
- }
break;
diff --git a/src/common/include/private.h b/src/common/include/private.h
index 6087e96..e088f87 100644
--- a/src/common/include/private.h
+++ b/src/common/include/private.h
@@ -130,6 +130,7 @@ typedef struct {
unsigned int est_cpu_load_pct;
unsigned int est_disk_kib;
+ int parallel;
char told_ongoing;
} sai_task_t;
@@ -482,19 +483,23 @@ typedef struct sai_power_state {
typedef struct sai_build_metric {
lws_dll2_t list;
char key[65];
+ char task_uuid[65];
char builder_name[96];
char project_name[96];
char ref[96];
+ uint64_t unixtime;
uint64_t us_cpu_user;
uint64_t us_cpu_sys;
uint64_t wallclock_us;
uint64_t peak_mem_rss;
uint64_t stg_bytes;
+ int parallel;
} sai_build_metric_t;
typedef struct sai_build_metric_db {
lws_dll2_t list; /* for lws_struct */
char key[65];
+ char task_uuid[65];
uint64_t unixtime;
char builder_name[96];
char project_name[96];
@@ -504,6 +509,7 @@ typedef struct sai_build_metric_db {
uint64_t wallclock_us;
uint64_t peak_mem_rss;
uint64_t stg_bytes;
+ int parallel;
} sai_build_metric_db_t;
extern const lws_struct_map_t
@@ -518,7 +524,7 @@ extern const lws_struct_map_t
lsm_schema_map_ta[1],
lsm_schema_map_plat_simple[1],
lsm_event[10],
- lsm_task[26],
+ lsm_task[27],
lsm_log[7],
lsm_artifact[8],
lsm_plat_list[1],
@@ -534,7 +540,7 @@ extern const lws_struct_map_t
lsm_schema_build_metric[1],
lsm_schema_sq3_map_build_metric[1]
;
-extern const lws_struct_map_t lsm_build_metric[9];
+extern const lws_struct_map_t lsm_build_metric[12];
extern const lws_struct_map_t lsm_plat[8];
extern const lws_struct_map_t lsm_plat_for_json[11];
diff --git a/src/common/struct-metadata.c b/src/common/struct-metadata.c
index a36df7a..e5a79cd 100644
--- a/src/common/struct-metadata.c
+++ b/src/common/struct-metadata.c
@@ -34,14 +34,17 @@ const lws_struct_map_t lsm_load_report_members[] = {
const lws_struct_map_t lsm_build_metric[] = {
LSM_CARRAY (sai_build_metric_t, key, "key"),
+ LSM_CARRAY (sai_build_metric_t, task_uuid, "task_uuid"),
LSM_CARRAY (sai_build_metric_t, builder_name, "builder_name"),
LSM_CARRAY (sai_build_metric_t, project_name, "project_name"),
LSM_CARRAY (sai_build_metric_t, ref, "ref"),
+ LSM_UNSIGNED (sai_build_metric_t, unixtime, "unixtime"),
LSM_UNSIGNED (sai_build_metric_t, us_cpu_user, "us_cpu_user"),
LSM_UNSIGNED (sai_build_metric_t, us_cpu_sys, "us_cpu_sys"),
LSM_UNSIGNED (sai_build_metric_t, wallclock_us, "wallclock_us"),
LSM_UNSIGNED (sai_build_metric_t, peak_mem_rss, "peak_mem_rss"),
LSM_UNSIGNED (sai_build_metric_t, stg_bytes, "stg_bytes"),
+ LSM_SIGNED (sai_build_metric_t, parallel, "parallel"),
};
const lws_struct_map_t lsm_schema_build_metric[] = {
@@ -50,6 +53,7 @@ const lws_struct_map_t lsm_schema_build_metric[] = {
const lws_struct_map_t lsm_sq3_build_metric[] = {
LSM_CARRAY (sai_build_metric_db_t, key, "key"),
+ LSM_CARRAY (sai_build_metric_db_t, task_uuid, "task_uuid"),
LSM_UNSIGNED (sai_build_metric_db_t, unixtime, "unixtime"),
LSM_CARRAY (sai_build_metric_db_t, builder_name, "builder_name"),
LSM_CARRAY (sai_build_metric_db_t, project_name, "project_name"),
@@ -59,6 +63,7 @@ const lws_struct_map_t lsm_sq3_build_metric[] = {
LSM_UNSIGNED (sai_build_metric_db_t, wallclock_us, "wallclock_us"),
LSM_UNSIGNED (sai_build_metric_db_t, peak_mem_rss, "peak_mem_rss"),
LSM_UNSIGNED (sai_build_metric_db_t, stg_bytes, "stg_bytes"),
+ LSM_SIGNED (sai_build_metric_db_t, parallel, "parallel"),
};
const lws_struct_map_t lsm_schema_sq3_map_build_metric[] = {
@@ -166,6 +171,7 @@ const lws_struct_map_t lsm_task[] = {
LSM_UNSIGNED (sai_task_t, est_peak_mem_kib, "est_peak_mem_kib"),
LSM_UNSIGNED (sai_task_t, est_cpu_load_pct, "est_cpu_load_pct"),
LSM_UNSIGNED (sai_task_t, est_disk_kib, "est_disk_kib"),
+ LSM_SIGNED (sai_task_t, parallel, "parallel"),
};
const lws_struct_map_t lsm_schema_json_map_task[] = {
diff --git a/src/server/s-metrics-db.c b/src/server/s-metrics-db.c
index d338b96..75f7bcb 100644
--- a/src/server/s-metrics-db.c
+++ b/src/server/s-metrics-db.c
@@ -135,11 +135,12 @@ sais_metrics_db_add(struct vhd *vhd, const struct sai_build_metric *m)
memset(&dbm, 0, sizeof(dbm));
lws_strncpy(dbm.key, m->key, sizeof(dbm.key));
- dbm.unixtime = (uint64_t)time(NULL);
+ lws_strncpy(dbm.task_uuid, m->task_uuid, sizeof(dbm.task_uuid));
+ dbm.unixtime = m->unixtime;
lws_strncpy(dbm.builder_name, m->builder_name, sizeof(dbm.builder_name));
lws_strncpy(dbm.project_name, m->project_name, sizeof(dbm.project_name));
lws_strncpy(dbm.ref, m->ref, sizeof(dbm.ref));
- //dbm.parallel = m->parallel;
+ dbm.parallel = m->parallel;
dbm.us_cpu_user = m->us_cpu_user;
dbm.us_cpu_sys = m->us_cpu_sys;
dbm.wallclock_us = m->wallclock_us;
diff --git a/src/server/s-ws-builder.c b/src/server/s-ws-builder.c
index 0702730..9b1b7d0 100644
--- a/src/server/s-ws-builder.c
+++ b/src/server/s-ws-builder.c
@@ -1025,6 +1025,22 @@ bail:
case SAIM_WSSCH_BUILDER_METRIC:
metric = (const sai_build_metric_t *)pss->a.dest;
sais_metrics_db_add(vhd, metric);
+
+ {
+ uint8_t buf[2048];
+ size_t used = 0;
+ lws_struct_serialize_t *js = lws_struct_json_serialize_create(
+ lsm_schema_build_metric,
+ LWS_ARRAY_SIZE(lsm_schema_build_metric),
+ 0, (void *)metric);
+ if (js) {
+ int n = lws_struct_json_serialize(js, buf, sizeof(buf), &used);
+ if (n >= 0)
+ sais_websrv_broadcast(vhd->h_ss_websrv, (const char *)buf, used);
+ lws_struct_json_serialize_destroy(&js);
+ }
+ }
+
lwsac_free(&pss->a.ac);
break;
}