From f429fbf3cfdbd84c733aaa0f8c1e25afb35eb1c5 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Tue, 11 Mar 2025 14:30:52 -0400 Subject: [PATCH 1/4] chore(NODE-6843): send results to perf endpoint --- .evergreen/config.in.yml | 9 ++++ .evergreen/config.yml | 28 +++++----- .evergreen/generate_evergreen_tasks.js | 9 ++-- .evergreen/perf-send.sh | 9 ++++ .evergreen/perf_send.mjs | 73 ++++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 21 deletions(-) create mode 100644 .evergreen/perf-send.sh create mode 100644 .evergreen/perf_send.mjs diff --git a/.evergreen/config.in.yml b/.evergreen/config.in.yml index caa7f202e83..1a3adee09d2 100644 --- a/.evergreen/config.in.yml +++ b/.evergreen/config.in.yml @@ -108,6 +108,15 @@ functions: args: - .evergreen/run-tests.sh + "perf send": + - command: subprocess.exec + params: + working_dir: src + binary: bash + add_expansions_to_env: true + args: + - .evergreen/perf-send.sh + "run serverless tests": - command: timeout.update params: diff --git a/.evergreen/config.yml b/.evergreen/config.yml index 27c6ab3d078..d9f3b3a1f73 100644 --- a/.evergreen/config.yml +++ b/.evergreen/config.yml @@ -80,6 +80,14 @@ functions: binary: bash args: - .evergreen/run-tests.sh + perf send: + - command: subprocess.exec + params: + working_dir: src + binary: bash + add_expansions_to_env: true + args: + - .evergreen/perf-send.sh run serverless tests: - command: timeout.update params: @@ -1891,9 +1899,7 @@ tasks: - func: install dependencies - func: bootstrap mongo-orchestration - func: run spec driver benchmarks - - command: perf.send - params: - file: src/test/benchmarks/driver_bench/results.json + - func: perf send - name: run-spec-benchmark-tests-node-server-timeoutMS-120000 tags: - run-spec-benchmark-tests @@ -1912,9 +1918,7 @@ tasks: - func: install dependencies - func: bootstrap mongo-orchestration - func: run spec driver benchmarks - - command: perf.send - params: - file: src/test/benchmarks/driver_bench/results.json + - func: perf send - name: run-spec-benchmark-tests-node-server-timeoutMS-0 tags: - run-spec-benchmark-tests @@ -1933,9 +1937,7 @@ tasks: - func: install dependencies - func: bootstrap mongo-orchestration - func: run spec driver benchmarks - - command: perf.send - params: - file: src/test/benchmarks/driver_bench/results.json + - func: perf send - name: run-spec-benchmark-tests-node-server-monitorCommands-true tags: - run-spec-benchmark-tests @@ -1954,9 +1956,7 @@ tasks: - func: install dependencies - func: bootstrap mongo-orchestration - func: run spec driver benchmarks - - command: perf.send - params: - file: src/test/benchmarks/driver_bench/results.json + - func: perf send - name: run-spec-benchmark-tests-node-server-logging tags: - run-spec-benchmark-tests @@ -1975,9 +1975,7 @@ tasks: - func: install dependencies - func: bootstrap mongo-orchestration - func: run spec driver benchmarks - - command: perf.send - params: - file: src/test/benchmarks/driver_bench/results.json + - func: perf send - name: run-unit-tests-node-16 tags: - unit-tests diff --git a/.evergreen/generate_evergreen_tasks.js b/.evergreen/generate_evergreen_tasks.js index b4ff97688ee..87ac59b9086 100644 --- a/.evergreen/generate_evergreen_tasks.js +++ b/.evergreen/generate_evergreen_tasks.js @@ -765,12 +765,9 @@ function addPerformanceTasks() { ...[ 'install dependencies', 'bootstrap mongo-orchestration', - 'run spec driver benchmarks' - ].map(func => ({ func })), - { - command: 'perf.send', - params: { file: 'src/test/benchmarks/driver_bench/results.json' } - } + 'run spec driver benchmarks', + 'perf send' + ].map(func => ({ func })) ] }); diff --git a/.evergreen/perf-send.sh b/.evergreen/perf-send.sh new file mode 100644 index 00000000000..2f5d567b642 --- /dev/null +++ b/.evergreen/perf-send.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -euox pipefail + +source $DRIVERS_TOOLS/.evergreen/init-node-and-npm-env.sh + +TARGET_FILE=${TARGET_FILE:-src/test/benchmarks/driver_bench/results.json} + +node src/.evergreen/perf_send.mjs $TARGET_FILE diff --git a/.evergreen/perf_send.mjs b/.evergreen/perf_send.mjs new file mode 100644 index 00000000000..9d71c4aeb2e --- /dev/null +++ b/.evergreen/perf_send.mjs @@ -0,0 +1,73 @@ +import fs from 'fs/promises'; +import util from 'util'; + +const API_PATH = 'https://performance-monitoring-api.corp.mongodb.com/raw_perf_results'; + +const resultFile = process.argv[2]; +if (resultFile == null) { + throw new Error('Must specify result file'); +} + +// Get expansions +const { + execution, + requester, + project, + task_id, + task_name, + revision_order_id, + build_variant: variant, + version_id: version +} = process.env; + +const orderSplit = revision_order_id?.split('_'); +const order = Number(orderSplit ? orderSplit[orderSplit.length - 1] : undefined); + +if (!Number.isInteger(order)) throw new Error(`Failed to parse integer from order, revision_order_id=${revision_order_id}`); + +const results = JSON.parse(await fs.readFile(resultFile, 'utf8')); + +// FIXME(NODE-6838): We are using dummy dates here just to be able to successfully post our results +for (const r of results) { + r.created_at = new Date().toISOString(); + r.completed_at = new Date().toISOString(); +} + +const body = { + id: { + project, + version, + variant, + order, + task_name, + task_id, + execution, + mainline: requester === 'commit' + }, + results +}; + +console.log('POST', util.inspect(body, { depth: Infinity })); + +const resp = await fetch(API_PATH, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + accept: 'application/json' + }, + body: JSON.stringify(body) +}); + +const responseText = await resp.text(); +let jsonResponse = null; +try { + jsonResponse = JSON.parse(responseText) +} catch (cause) { + console.log('Failed to parse json response', cause); +} + +console.log(resp.statusText, util.inspect(jsonResponse ?? responseText, { depth: Infinity })); + +if (jsonResponse.message == null) throw new Error("Didn't get success message"); + +console.log(jsonResponse.message); From 91b7e0cc3e08db3a247ecb36c0c2afcf5ad4e3de Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Tue, 11 Mar 2025 14:45:42 -0400 Subject: [PATCH 2/4] chore: remove print --- .evergreen/perf_send.mjs | 2 -- 1 file changed, 2 deletions(-) diff --git a/.evergreen/perf_send.mjs b/.evergreen/perf_send.mjs index 9d71c4aeb2e..2bad40671e7 100644 --- a/.evergreen/perf_send.mjs +++ b/.evergreen/perf_send.mjs @@ -47,8 +47,6 @@ const body = { results }; -console.log('POST', util.inspect(body, { depth: Infinity })); - const resp = await fetch(API_PATH, { method: 'POST', headers: { From 1a1ff6d0fd158501766908d50db1b4f2af207091 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Tue, 11 Mar 2025 18:59:53 -0400 Subject: [PATCH 3/4] fix: paths --- .evergreen/perf-send.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.evergreen/perf-send.sh b/.evergreen/perf-send.sh index 2f5d567b642..a3c7f234b82 100644 --- a/.evergreen/perf-send.sh +++ b/.evergreen/perf-send.sh @@ -4,6 +4,6 @@ set -euox pipefail source $DRIVERS_TOOLS/.evergreen/init-node-and-npm-env.sh -TARGET_FILE=${TARGET_FILE:-src/test/benchmarks/driver_bench/results.json} +TARGET_FILE=$(realpath "${TARGET_FILE:-./test/benchmarks/driver_bench/results.json}") -node src/.evergreen/perf_send.mjs $TARGET_FILE +node ./.evergreen/perf_send.mjs $TARGET_FILE From e36ad503719d31cbd40df9d8d09446aef8367920 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 12 Mar 2025 14:53:10 -0400 Subject: [PATCH 4/4] chore: comments --- .evergreen/perf_send.mjs | 8 -------- test/benchmarks/driver_bench/src/driver.mts | 4 ++++ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.evergreen/perf_send.mjs b/.evergreen/perf_send.mjs index 2bad40671e7..5a3379df419 100644 --- a/.evergreen/perf_send.mjs +++ b/.evergreen/perf_send.mjs @@ -27,12 +27,6 @@ if (!Number.isInteger(order)) throw new Error(`Failed to parse integer from orde const results = JSON.parse(await fs.readFile(resultFile, 'utf8')); -// FIXME(NODE-6838): We are using dummy dates here just to be able to successfully post our results -for (const r of results) { - r.created_at = new Date().toISOString(); - r.completed_at = new Date().toISOString(); -} - const body = { id: { project, @@ -67,5 +61,3 @@ try { console.log(resp.statusText, util.inspect(jsonResponse ?? responseText, { depth: Infinity })); if (jsonResponse.message == null) throw new Error("Didn't get success message"); - -console.log(jsonResponse.message); diff --git a/test/benchmarks/driver_bench/src/driver.mts b/test/benchmarks/driver_bench/src/driver.mts index 488d56a1afd..434c5b9d51b 100644 --- a/test/benchmarks/driver_bench/src/driver.mts +++ b/test/benchmarks/driver_bench/src/driver.mts @@ -145,6 +145,8 @@ export type MetricInfo = { test_name: string; args: Record; }; + created_at: string; + completed_at: string; metrics: Metric[]; }; @@ -161,6 +163,8 @@ export function metrics(test_name: string, result: number, tags?: string[]): Met ]) ) }, + created_at: new Date().toISOString(), + completed_at: new Date().toISOString(), // FIXME(NODE-6781): For now all of our metrics are of throughput so their improvement_direction is up, metrics: [ {