Project homepage Mailing List  Warmcat.com  API Docs  Github Mirror 
    npro  
 Modern all-safe Rust Network Protocol library supporting h1, h2, h3, ws, wt sans-IO and with socket IO + tls
git clone https://npro.rs/repo/npro
 
root / src / power / p-ws-server.c
Author[]google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.c...> 2025-09-04 18:31 UTC
Committer[]Andy Green <andy@warmcat.com> 2025-09-05 08:53 UTC
Treecc5a379eea11bf8cacfd0d7599739a0a1348d023   Raw Patch
 
feat: Enhance build metrics with parallel, uuid, and time
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</span><div id=\"sai_arts\"></div>"; + "s</span><div id=\"sai_arts\"></div><div id=\"metrics-summary-" + san(t.t.uuid) + "\"></div>"; 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 = "<div class=\"metric-summary\">" + + "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 + + "</div>"; + 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 <signal.h> #include <sys/stat.h> #include <assert.h> +#include <fcntl.h> #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; }
Page fetched 0s ago, creation time: 27ms (vhost etag hits: 0%, cache hits: 0%)