From dba6798b48df401205e677817624497848f703aa Mon Sep 17 00:00:00 2001 From: Lukasz Jagiela Date: Thu, 3 Jul 2025 12:22:41 +0200 Subject: [PATCH] test: datadog performance tracking poc --- .github/workflows/ci.yml | 27 ++++++++-- packages/e2e-tests/package.json | 2 +- packages/e2e-tests/src/support/PidMonitor.ts | 4 +- packages/e2e-tests/tools/push_to_datadog.py | 54 ++++++++++++++++++++ 4 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 packages/e2e-tests/tools/push_to_datadog.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7683c698a4..d02cecdcf2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -386,6 +386,19 @@ jobs: needs: smokeTests if: always() steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install requests + - name: Download all smoke tests artifacts uses: actions/download-artifact@v4 with: @@ -428,11 +441,19 @@ jobs: with: name: test-artifacts path: | - ./packages/e2e-tests/screenshots - ./packages/e2e-tests/logs - ./packages/e2e-tests/reports + ./screenshots + ./logs + ./reports + ./metrics retention-days: 5 + - name: Push performance metrics to Datadog + working-directory: ./packages/e2e-tests/tools + env: + DATADOG_API_KEY: ${{ secrets.DATADOG_API_KEY }} + DD_SITE: us5.datadoghq.com + run: python push_to_datadog.py ../../../metrics + - run: | if [[ ${{ needs.smokeTests.result }} == "success" ]]; then exit 0 diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json index 9c092ebdbb..adedd401c4 100755 --- a/packages/e2e-tests/package.json +++ b/packages/e2e-tests/package.json @@ -10,7 +10,7 @@ "allure:generate": "yarn allure generate -c ./reports/allure/results -o ./reports/allure/report", "allure:open": "allure open ./reports/allure/report/", "build": "yarn exec echo 'No build required'", - "cleanup": "rm -rf logs node_modules reports screenshots", + "cleanup": "rm -rf logs node_modules reports screenshots metrics", "lint": "run -T eslint -c .eslintrc.cjs .", "lint:fix": "run -T eslint -c .eslintrc.cjs . --fix", "pack-chrome-extension": "node ./src/utils/packExtension.ts", diff --git a/packages/e2e-tests/src/support/PidMonitor.ts b/packages/e2e-tests/src/support/PidMonitor.ts index d0190330e4..92bb4df47d 100644 --- a/packages/e2e-tests/src/support/PidMonitor.ts +++ b/packages/e2e-tests/src/support/PidMonitor.ts @@ -9,7 +9,7 @@ import { Logger } from './logger'; const execAsync = promisify(exec); interface UsageData { - timestamp: string; + timestamp: number; cpu: number; memory: number; } @@ -81,7 +81,7 @@ class PidMonitor { try { const stats = await pidusage(this.pid); this._data.push({ - timestamp: new Date().toISOString(), + timestamp: Date.now(), cpu: stats.cpu, memory: stats.memory }); diff --git a/packages/e2e-tests/tools/push_to_datadog.py b/packages/e2e-tests/tools/push_to_datadog.py new file mode 100644 index 0000000000..147406b729 --- /dev/null +++ b/packages/e2e-tests/tools/push_to_datadog.py @@ -0,0 +1,54 @@ +import os +import json +import sys +import requests + +DATADOG_API_KEY = os.getenv("DATADOG_API_KEY") +DD_SITE = os.getenv("DD_SITE", "us5.datadoghq.com") +headers = { + "Content-Type": "application/json", + "DD-API-KEY": DATADOG_API_KEY +} + +if len(sys.argv) < 2: + print("Usage: python push_to_datadog.py ") + sys.exit(1) + +METRICS_DIR = sys.argv[1] + +def send_to_datadog(series_batch): + url = f"https://api.{DD_SITE}/api/v1/series" + res = requests.post(url, headers=headers, data=json.dumps({"series": series_batch})) + print(f"→ Sent {len(series_batch)} points. Status: {res.status_code}") + if res.status_code >= 300: + print(res.text) + +series = [] + +for filename in os.listdir(METRICS_DIR): + if filename.endswith(".json"): + path = os.path.join(METRICS_DIR, filename) + with open(path) as f: + content = json.load(f) + scenario = content["scenarioName"] + for point in content["data"]: + ts = int(point["timestamp"] / 1000) + series.append({ + "metric": "e2e.cpu_seconds_total", + "points": [[ts, point["cpu"]]], + "tags": [f"scenario:{scenario}", f"source_file:{filename}"], + "type": "gauge" + }) + series.append({ + "metric": "e2e.memory_rss_bytes", + "points": [[ts, point["memory"]]], + "tags": [f"scenario:{scenario}", f"source_file:{filename}"], + "type": "gauge" + }) + +print(f"Uploading {len(series)} points to Datadog in chunks...") + +CHUNK_SIZE = 400 +for i in range(0, len(series), CHUNK_SIZE): + chunk = series[i:i + CHUNK_SIZE] + send_to_datadog(chunk)