Ver Fonte

Benchmarking Updates (#3680)

* Benchmark test

* Lighthouse posthog

---------

Co-authored-by: Alek Petuskey <alekpetuskey@Aleks-MacBook-Pro.local>
Alek Petuskey há 10 meses atrás
pai
commit
0a8b8a89b4

+ 17 - 30
.github/workflows/benchmarks.yml

@@ -18,7 +18,6 @@ env:
   PYTHONIOENCODING: 'utf8'
   PYTHONIOENCODING: 'utf8'
   TELEMETRY_ENABLED: false
   TELEMETRY_ENABLED: false
   NODE_OPTIONS: '--max_old_space_size=4096'
   NODE_OPTIONS: '--max_old_space_size=4096'
-  DATABASE_URL: ${{ secrets.DATABASE_URL }}
   PR_TITLE: ${{ github.event.pull_request.title }}
   PR_TITLE: ${{ github.event.pull_request.title }}
 
 
 jobs:
 jobs:
@@ -62,17 +61,16 @@ jobs:
         run: |
         run: |
           # Check that npm is home
           # Check that npm is home
           npm -v
           npm -v
-          poetry run bash scripts/benchmarks/benchmarks.sh ./reflex-web prod
+          poetry run bash benchmarks/lighthouse.sh ./reflex-web prod
         env:
         env:
           LHCI_GITHUB_APP_TOKEN: $
           LHCI_GITHUB_APP_TOKEN: $
       - name: Run Benchmarks
       - name: Run Benchmarks
         # Only run if the database creds are available in this context.
         # Only run if the database creds are available in this context.
-        if: ${{ env.DATABASE_URL }}
-        run: poetry run python scripts/benchmarks/lighthouse_score_upload.py "$GITHUB_SHA" ./integration/benchmarks/.lighthouseci
+        run: poetry run python benchmarks/benchmark_lighthouse.py "$GITHUB_SHA" ./integration/benchmarks/.lighthouseci
         env:
         env:
           GITHUB_SHA: ${{ github.sha }}
           GITHUB_SHA: ${{ github.sha }}
 
 
-  simple-apps-benchmarks:
+  simple-apps-benchmarks: # This app tests the compile times of various compoonents and pages
     if: github.event.pull_request.merged == true
     if: github.event.pull_request.merged == true
     env:
     env:
       OUTPUT_FILE: benchmarks.json
       OUTPUT_FILE: benchmarks.json
@@ -116,8 +114,6 @@ jobs:
           python-version: ${{ matrix.python-version }}
           python-version: ${{ matrix.python-version }}
           run-poetry-install: true
           run-poetry-install: true
           create-venv-at-path: .venv
           create-venv-at-path: .venv
-      - name: Install additional dependencies for DB access
-        run: poetry run uv pip install psycopg2-binary
       - name: Run benchmark tests
       - name: Run benchmark tests
         env:
         env:
           APP_HARNESS_HEADLESS: 1
           APP_HARNESS_HEADLESS: 1
@@ -126,16 +122,14 @@ jobs:
           poetry run pytest -v benchmarks/ --benchmark-json=${{ env.OUTPUT_FILE }} -s
           poetry run pytest -v benchmarks/ --benchmark-json=${{ env.OUTPUT_FILE }} -s
       - name: Upload benchmark results
       - name: Upload benchmark results
         # Only run if the database creds are available in this context.
         # Only run if the database creds are available in this context.
-        if: ${{ env.DATABASE_URL }}
         run:
         run:
-          poetry run python scripts/benchmarks/simple_app_benchmark_upload.py --os "${{ matrix.os }}"
+          poetry run python benchmarks/benchmark_compile_times.py --os "${{ matrix.os }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
-          --benchmark-json "${{ env.OUTPUT_FILE }}"
-          --db-url "${{ env.DATABASE_URL }}" --branch-name "${{ github.head_ref || github.ref_name }}"
-          --event-type "${{ github.event_name }}" --actor "${{ github.actor }}" --pr-id "${{ github.event.pull_request.id }}"
+          --benchmark-json "${{ env.OUTPUT_FILE }}" --branch-name "${{ github.head_ref || github.ref_name }}"
+          --event-type "${{ github.event_name }}" --pr-id "${{ github.event.pull_request.id }}"
 
 
-  reflex-build-size:
-    if: github.event.pull_request.merged == true
+  reflex-dist-size: # This job is used to calculate the size of the Reflex distribution (wheel file)
+    if: github.event.pull_request.merged == true  
     timeout-minutes: 30
     timeout-minutes: 30
     strategy:
     strategy:
       # Prioritize getting more information out of the workflow (even if something fails)
       # Prioritize getting more information out of the workflow (even if something fails)
@@ -148,22 +142,19 @@ jobs:
           python-version: 3.11.5
           python-version: 3.11.5
           run-poetry-install: true
           run-poetry-install: true
           create-venv-at-path: .venv
           create-venv-at-path: .venv
-      - name: Install additional dependencies for DB access
-        run: poetry run uv pip install psycopg2-binary
       - name: Build reflex
       - name: Build reflex
         run: |
         run: |
           poetry build
           poetry build
       - name: Upload benchmark results
       - name: Upload benchmark results
         # Only run if the database creds are available in this context.
         # Only run if the database creds are available in this context.
-        if: ${{ env.DATABASE_URL }}
         run:
         run:
-          poetry run python scripts/benchmarks/benchmark_reflex_size.py --os ubuntu-latest
+          poetry run python benchmarks/benchmark_package_size.py --os ubuntu-latest
           --python-version 3.11.5 --commit-sha "${{ github.sha }}" --pr-id "${{ github.event.pull_request.id }}"
           --python-version 3.11.5 --commit-sha "${{ github.sha }}" --pr-id "${{ github.event.pull_request.id }}"
-          --db-url "${{ env.DATABASE_URL }}" --branch-name "${{ github.head_ref || github.ref_name }}"
-          --measurement-type "reflex-build" --path ./dist
+          --branch-name "${{ github.head_ref || github.ref_name }}"
+          --path ./dist
 
 
-  reflex-plus-dependency-size:
-    if: github.event.pull_request.merged == true
+  reflex-venv-size: # This job calculates the total size of Reflex and its dependencies
+    if: github.event.pull_request.merged == true  
     timeout-minutes: 30
     timeout-minutes: 30
     strategy:
     strategy:
       # Prioritize getting more information out of the workflow (even if something fails)
       # Prioritize getting more information out of the workflow (even if something fails)
@@ -197,14 +188,10 @@ jobs:
         run: |
         run: |
           poetry run pip install uv
           poetry run pip install uv
 
 
-      - name: Install additional dependencies for DB access
-        run: poetry run uv pip install psycopg2-binary
-
-      - if: ${{ env.DATABASE_URL }}
-        name: calculate and upload size
+      - name: calculate and upload size
         run:
         run:
-          poetry run python scripts/benchmarks/benchmark_reflex_size.py --os "${{ matrix.os }}"
+          poetry run python benchmarks/benchmark_package_size.py --os "${{ matrix.os }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
-          --pr-id "${{ github.event.pull_request.id }}" --db-url "${{ env.DATABASE_URL }}"
+          --pr-id "${{ github.event.pull_request.id }}" 
           --branch-name "${{ github.head_ref || github.ref_name }}"
           --branch-name "${{ github.head_ref || github.ref_name }}"
-          --measurement-type "reflex-package" --path ./.venv
+          --path ./.venv

+ 10 - 15
.github/workflows/integration_tests.yml

@@ -30,7 +30,6 @@ env:
   PYTHONIOENCODING: 'utf8'
   PYTHONIOENCODING: 'utf8'
   TELEMETRY_ENABLED: false
   TELEMETRY_ENABLED: false
   NODE_OPTIONS: '--max_old_space_size=4096'
   NODE_OPTIONS: '--max_old_space_size=4096'
-  DATABASE_URL: ${{ secrets.DATABASE_URL }}
   PR_TITLE: ${{ github.event.pull_request.title }}
   PR_TITLE: ${{ github.event.pull_request.title }}
 
 
 jobs:
 jobs:
@@ -100,27 +99,25 @@ jobs:
           npm -v
           npm -v
           poetry run bash scripts/integration.sh ./reflex-examples/counter dev
           poetry run bash scripts/integration.sh ./reflex-examples/counter dev
       - name: Measure and upload .web size
       - name: Measure and upload .web size
-        if: ${{ env.DATABASE_URL}}
         run:
         run:
-          poetry run python scripts/benchmarks/benchmark_reflex_size.py --os "${{ matrix.os }}"
+          poetry run python benchmarks/benchmark_web_size.py --os "${{ matrix.os }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
-          --pr-id "${{ github.event.pull_request.id }}" --db-url "${{ env.DATABASE_URL }}"
+          --pr-id "${{ github.event.pull_request.id }}"
           --branch-name "${{ github.head_ref || github.ref_name }}"
           --branch-name "${{ github.head_ref || github.ref_name }}"
-          --measurement-type "counter-app-dot-web" --path ./reflex-examples/counter/.web
+          --path ./reflex-examples/counter/.web
+          --app-name "counter"
       - name: Install hyperfine
       - name: Install hyperfine
         run: cargo install hyperfine
         run: cargo install hyperfine
       - name: Benchmark imports
       - name: Benchmark imports
         working-directory: ./reflex-examples/counter
         working-directory: ./reflex-examples/counter
         run: hyperfine --warmup 3 "export POETRY_VIRTUALENVS_PATH=../../.venv; poetry run python counter/counter.py" --show-output --export-json "${{ env.OUTPUT_FILE }}" --shell bash
         run: hyperfine --warmup 3 "export POETRY_VIRTUALENVS_PATH=../../.venv; poetry run python counter/counter.py" --show-output --export-json "${{ env.OUTPUT_FILE }}" --shell bash
       - name: Upload Benchmarks
       - name: Upload Benchmarks
-        if : ${{ env.DATABASE_URL }}
         run:
         run:
-          poetry run python scripts/benchmarks/benchmark_imports.py --os "${{ matrix.os }}"
+          poetry run python benchmarks/benchmark_imports.py --os "${{ matrix.os }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
           --benchmark-json "./reflex-examples/counter/${{ env.OUTPUT_FILE }}"
           --benchmark-json "./reflex-examples/counter/${{ env.OUTPUT_FILE }}"
-          --db-url "${{ env.DATABASE_URL }}" --branch-name "${{ github.head_ref || github.ref_name }}"
-          --event-type "${{ github.event_name }}" --actor "${{ github.actor }}" --pr-id "${{ github.event.pull_request.id }}"
-
+          --branch-name "${{ github.head_ref || github.ref_name }}" --pr-id "${{ github.event.pull_request.id }}"
+          --app-name "counter"
 
 
 
 
 
 
@@ -164,10 +161,8 @@ jobs:
           npm -v
           npm -v
           poetry run bash scripts/integration.sh ./reflex-web prod
           poetry run bash scripts/integration.sh ./reflex-web prod
       - name: Measure and upload .web size
       - name: Measure and upload .web size
-        if: ${{ env.DATABASE_URL}}
         run:
         run:
-          poetry run python scripts/benchmarks/benchmark_reflex_size.py --os "${{ matrix.os }}"
+          poetry run python benchmarks/benchmark_web_size.py --os "${{ matrix.os }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
           --python-version "${{ matrix.python-version }}" --commit-sha "${{ github.sha }}"
-          --pr-id "${{ github.event.pull_request.id }}"
-          --db-url "${{ env.DATABASE_URL }}" --branch-name "${{ github.head_ref || github.ref_name }}"
-          --measurement-type "reflex-web-dot-web" --path ./reflex-web/.web
+          --pr-id "${{ github.event.pull_request.id }}" --branch-name "${{ github.head_ref || github.ref_name }}"
+          --app-name "reflex-web" --path ./reflex-web/.web

+ 16 - 49
scripts/benchmarks/simple_app_benchmark_upload.py → benchmarks/benchmark_compile_times.py

@@ -1,13 +1,12 @@
-"""Runs the benchmarks and inserts the results into the database."""
+"""Extracts the compile times from the JSON files in the specified directory and inserts them into the database."""
 
 
 from __future__ import annotations
 from __future__ import annotations
 
 
 import argparse
 import argparse
 import json
 import json
 import os
 import os
-from datetime import datetime
 
 
-import psycopg2
+from utils import send_data_to_posthog
 
 
 
 
 def extract_stats_from_json(json_file: str) -> list[dict]:
 def extract_stats_from_json(json_file: str) -> list[dict]:
@@ -51,7 +50,6 @@ def extract_stats_from_json(json_file: str) -> list[dict]:
 
 
 
 
 def insert_benchmarking_data(
 def insert_benchmarking_data(
-    db_connection_url: str,
     os_type_version: str,
     os_type_version: str,
     python_version: str,
     python_version: str,
     performance_data: list[dict],
     performance_data: list[dict],
@@ -59,52 +57,33 @@ def insert_benchmarking_data(
     pr_title: str,
     pr_title: str,
     branch_name: str,
     branch_name: str,
     event_type: str,
     event_type: str,
-    actor: str,
     pr_id: str,
     pr_id: str,
 ):
 ):
     """Insert the benchmarking data into the database.
     """Insert the benchmarking data into the database.
 
 
     Args:
     Args:
-        db_connection_url: The URL to connect to the database.
         os_type_version: The OS type and version to insert.
         os_type_version: The OS type and version to insert.
         python_version: The Python version to insert.
         python_version: The Python version to insert.
         performance_data: The performance data of reflex web to insert.
         performance_data: The performance data of reflex web to insert.
         commit_sha: The commit SHA to insert.
         commit_sha: The commit SHA to insert.
         pr_title: The PR title to insert.
         pr_title: The PR title to insert.
         branch_name: The name of the branch.
         branch_name: The name of the branch.
-        event_type: Type of github event(push, pull request, etc)
-        actor: Username of the user that triggered the run.
+        event_type: Type of github event(push, pull request, etc).
         pr_id: Id of the PR.
         pr_id: Id of the PR.
     """
     """
-    # Serialize the JSON data
-    simple_app_performance_json = json.dumps(performance_data)
-
-    # Get the current timestamp
-    current_timestamp = datetime.now()
-
-    # Connect to the database and insert the data
-    with psycopg2.connect(db_connection_url) as conn, conn.cursor() as cursor:
-        insert_query = """
-            INSERT INTO simple_app_benchmarks (os, python_version, commit_sha, time, pr_title, branch_name, event_type, actor, performance, pr_id)
-            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s);
-            """
-        cursor.execute(
-            insert_query,
-            (
-                os_type_version,
-                python_version,
-                commit_sha,
-                current_timestamp,
-                pr_title,
-                branch_name,
-                event_type,
-                actor,
-                simple_app_performance_json,
-                pr_id,
-            ),
-        )
-        # Commit the transaction
-        conn.commit()
+    # Prepare the event data
+    properties = {
+        "os": os_type_version,
+        "python_version": python_version,
+        "distinct_id": commit_sha,
+        "pr_title": pr_title,
+        "branch_name": branch_name,
+        "event_type": event_type,
+        "performance": performance_data,
+        "pr_id": pr_id,
+    }
+
+    send_data_to_posthog("simple_app_benchmark", properties)
 
 
 
 
 def main():
 def main():
@@ -124,11 +103,6 @@ def main():
         "--benchmark-json",
         "--benchmark-json",
         help="The JSON file containing the benchmark results.",
         help="The JSON file containing the benchmark results.",
     )
     )
-    parser.add_argument(
-        "--db-url",
-        help="The URL to connect to the database.",
-        required=True,
-    )
     parser.add_argument(
     parser.add_argument(
         "--pr-title",
         "--pr-title",
         help="The PR title to insert into the database.",
         help="The PR title to insert into the database.",
@@ -143,11 +117,6 @@ def main():
         help="The github event type",
         help="The github event type",
         required=True,
         required=True,
     )
     )
-    parser.add_argument(
-        "--actor",
-        help="Username of the user that triggered the run.",
-        required=True,
-    )
     parser.add_argument(
     parser.add_argument(
         "--pr-id",
         "--pr-id",
         help="ID of the PR.",
         help="ID of the PR.",
@@ -162,7 +131,6 @@ def main():
     cleaned_benchmark_results = extract_stats_from_json(args.benchmark_json)
     cleaned_benchmark_results = extract_stats_from_json(args.benchmark_json)
     # Insert the data into the database
     # Insert the data into the database
     insert_benchmarking_data(
     insert_benchmarking_data(
-        db_connection_url=args.db_url,
         os_type_version=args.os,
         os_type_version=args.os,
         python_version=args.python_version,
         python_version=args.python_version,
         performance_data=cleaned_benchmark_results,
         performance_data=cleaned_benchmark_results,
@@ -170,7 +138,6 @@ def main():
         pr_title=pr_title,
         pr_title=pr_title,
         branch_name=args.branch_name,
         branch_name=args.branch_name,
         event_type=args.event_type,
         event_type=args.event_type,
-        actor=args.actor,
         pr_id=args.pr_id,
         pr_id=args.pr_id,
     )
     )
 
 

+ 19 - 52
scripts/benchmarks/benchmark_imports.py → benchmarks/benchmark_imports.py

@@ -1,13 +1,12 @@
-"""Runs the benchmarks and inserts the results into the database."""
+"""Extract and upload benchmarking data to PostHog."""
 
 
 from __future__ import annotations
 from __future__ import annotations
 
 
 import argparse
 import argparse
 import json
 import json
 import os
 import os
-from datetime import datetime
 
 
-import psycopg2
+from utils import send_data_to_posthog
 
 
 
 
 def extract_stats_from_json(json_file: str) -> dict:
 def extract_stats_from_json(json_file: str) -> dict:
@@ -34,59 +33,39 @@ def extract_stats_from_json(json_file: str) -> dict:
 
 
 
 
 def insert_benchmarking_data(
 def insert_benchmarking_data(
-    db_connection_url: str,
     os_type_version: str,
     os_type_version: str,
     python_version: str,
     python_version: str,
     performance_data: dict,
     performance_data: dict,
     commit_sha: str,
     commit_sha: str,
     pr_title: str,
     pr_title: str,
     branch_name: str,
     branch_name: str,
-    event_type: str,
-    actor: str,
     pr_id: str,
     pr_id: str,
+    app_name: str,
 ):
 ):
     """Insert the benchmarking data into the database.
     """Insert the benchmarking data into the database.
 
 
     Args:
     Args:
-        db_connection_url: The URL to connect to the database.
         os_type_version: The OS type and version to insert.
         os_type_version: The OS type and version to insert.
         python_version: The Python version to insert.
         python_version: The Python version to insert.
         performance_data: The imports performance data to insert.
         performance_data: The imports performance data to insert.
         commit_sha: The commit SHA to insert.
         commit_sha: The commit SHA to insert.
         pr_title: The PR title to insert.
         pr_title: The PR title to insert.
         branch_name: The name of the branch.
         branch_name: The name of the branch.
-        event_type: Type of github event(push, pull request, etc)
-        actor: Username of the user that triggered the run.
         pr_id: Id of the PR.
         pr_id: Id of the PR.
+        app_name: The name of the app being measured.
     """
     """
-    # Serialize the JSON data
-    simple_app_performance_json = json.dumps(performance_data)
-    # Get the current timestamp
-    current_timestamp = datetime.now()
-
-    # Connect to the database and insert the data
-    with psycopg2.connect(db_connection_url) as conn, conn.cursor() as cursor:
-        insert_query = """
-            INSERT INTO import_benchmarks (os, python_version, commit_sha, time, pr_title, branch_name, event_type, actor, performance, pr_id)
-            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s);
-            """
-        cursor.execute(
-            insert_query,
-            (
-                os_type_version,
-                python_version,
-                commit_sha,
-                current_timestamp,
-                pr_title,
-                branch_name,
-                event_type,
-                actor,
-                simple_app_performance_json,
-                pr_id,
-            ),
-        )
-        # Commit the transaction
-        conn.commit()
+    properties = {
+        "os": os_type_version,
+        "python_version": python_version,
+        "distinct_id": commit_sha,
+        "pr_title": pr_title,
+        "branch_name": branch_name,
+        "pr_id": pr_id,
+        "performance": performance_data,
+        "app_name": app_name,
+    }
+
+    send_data_to_posthog("import_benchmark", properties)
 
 
 
 
 def main():
 def main():
@@ -106,11 +85,6 @@ def main():
         "--benchmark-json",
         "--benchmark-json",
         help="The JSON file containing the benchmark results.",
         help="The JSON file containing the benchmark results.",
     )
     )
-    parser.add_argument(
-        "--db-url",
-        help="The URL to connect to the database.",
-        required=True,
-    )
     parser.add_argument(
     parser.add_argument(
         "--pr-title",
         "--pr-title",
         help="The PR title to insert into the database.",
         help="The PR title to insert into the database.",
@@ -121,13 +95,8 @@ def main():
         required=True,
         required=True,
     )
     )
     parser.add_argument(
     parser.add_argument(
-        "--event-type",
-        help="The github event type",
-        required=True,
-    )
-    parser.add_argument(
-        "--actor",
-        help="Username of the user that triggered the run.",
+        "--app-name",
+        help="The name of the app measured.",
         required=True,
         required=True,
     )
     )
     parser.add_argument(
     parser.add_argument(
@@ -143,15 +112,13 @@ def main():
     cleaned_benchmark_results = extract_stats_from_json(args.benchmark_json)
     cleaned_benchmark_results = extract_stats_from_json(args.benchmark_json)
     # Insert the data into the database
     # Insert the data into the database
     insert_benchmarking_data(
     insert_benchmarking_data(
-        db_connection_url=args.db_url,
         os_type_version=args.os,
         os_type_version=args.os,
         python_version=args.python_version,
         python_version=args.python_version,
         performance_data=cleaned_benchmark_results,
         performance_data=cleaned_benchmark_results,
         commit_sha=args.commit_sha,
         commit_sha=args.commit_sha,
         pr_title=pr_title,
         pr_title=pr_title,
         branch_name=args.branch_name,
         branch_name=args.branch_name,
-        event_type=args.event_type,
-        actor=args.actor,
+        app_name=args.app_name,
         pr_id=args.pr_id,
         pr_id=args.pr_id,
     )
     )
 
 

+ 12 - 42
scripts/benchmarks/lighthouse_score_upload.py → benchmarks/benchmark_lighthouse.py

@@ -1,52 +1,31 @@
-"""Runs the benchmarks and inserts the results into the database."""
+"""Extracts the Lighthouse scores from the JSON files in the specified directory and inserts them into the database."""
 
 
 from __future__ import annotations
 from __future__ import annotations
 
 
 import json
 import json
 import os
 import os
 import sys
 import sys
-from datetime import datetime
 
 
-import psycopg2
+from utils import send_data_to_posthog
 
 
 
 
 def insert_benchmarking_data(
 def insert_benchmarking_data(
-    db_connection_url: str,
     lighthouse_data: dict,
     lighthouse_data: dict,
     commit_sha: str,
     commit_sha: str,
-    pr_title: str,
 ):
 ):
     """Insert the benchmarking data into the database.
     """Insert the benchmarking data into the database.
 
 
     Args:
     Args:
-        db_connection_url: The URL to connect to the database.
         lighthouse_data: The Lighthouse data to insert.
         lighthouse_data: The Lighthouse data to insert.
         commit_sha: The commit SHA to insert.
         commit_sha: The commit SHA to insert.
-        pr_title: The PR title to insert.
     """
     """
-    # Serialize the JSON data
-    lighthouse_json = json.dumps(lighthouse_data)
-
-    # Get the current timestamp
-    current_timestamp = datetime.now()
-
-    # Connect to the database and insert the data
-    with psycopg2.connect(db_connection_url) as conn, conn.cursor() as cursor:
-        insert_query = """
-            INSERT INTO benchmarks (lighthouse, commit_sha, pr_title, time)
-            VALUES (%s, %s, %s, %s);
-            """
-        cursor.execute(
-            insert_query,
-            (
-                lighthouse_json,
-                commit_sha,
-                pr_title,
-                current_timestamp,
-            ),
-        )
-        # Commit the transaction
-        conn.commit()
+    properties = {
+        "distinct_id": commit_sha,
+        "lighthouse_data": lighthouse_data,
+    }
+
+    # Send the data to PostHog
+    send_data_to_posthog("lighthouse_benchmark", properties)
 
 
 
 
 def get_lighthouse_scores(directory_path: str) -> dict:
 def get_lighthouse_scores(directory_path: str) -> dict:
@@ -67,7 +46,7 @@ def get_lighthouse_scores(directory_path: str) -> dict:
                 with open(file_path, "r") as file:
                 with open(file_path, "r") as file:
                     data = json.load(file)
                     data = json.load(file)
                     # Extract scores and add them to the dictionary with the filename as key
                     # Extract scores and add them to the dictionary with the filename as key
-                    scores[data["finalUrl"].replace("http://localhost:3000/", "")] = {
+                    scores[data["finalUrl"].replace("http://localhost:3000/", "/")] = {
                         "performance_score": data["categories"]["performance"]["score"],
                         "performance_score": data["categories"]["performance"]["score"],
                         "accessibility_score": data["categories"]["accessibility"][
                         "accessibility_score": data["categories"]["accessibility"][
                             "score"
                             "score"
@@ -76,11 +55,9 @@ def get_lighthouse_scores(directory_path: str) -> dict:
                             "score"
                             "score"
                         ],
                         ],
                         "seo_score": data["categories"]["seo"]["score"],
                         "seo_score": data["categories"]["seo"]["score"],
-                        "pwa_score": data["categories"]["pwa"]["score"],
                     }
                     }
     except Exception as e:
     except Exception as e:
-        print(e)
-        return {"error": "Error parsing JSON files"}
+        return {"error": e}
 
 
     return scores
     return scores
 
 
@@ -91,18 +68,11 @@ def main():
     commit_sha = sys.argv[1]
     commit_sha = sys.argv[1]
     json_dir = sys.argv[2]
     json_dir = sys.argv[2]
 
 
-    # Get the PR title and database URL from the environment variables
-    pr_title = os.environ.get("PR_TITLE")
-    db_url = os.environ.get("DATABASE_URL")
-
-    if db_url is None or pr_title is None:
-        sys.exit("Missing environment variables")
-
     # Get the Lighthouse scores
     # Get the Lighthouse scores
     lighthouse_scores = get_lighthouse_scores(json_dir)
     lighthouse_scores = get_lighthouse_scores(json_dir)
 
 
     # Insert the data into the database
     # Insert the data into the database
-    insert_benchmarking_data(db_url, lighthouse_scores, commit_sha, pr_title)
+    insert_benchmarking_data(lighthouse_scores, commit_sha)
 
 
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":

+ 23 - 94
scripts/benchmarks/benchmark_reflex_size.py → benchmarks/benchmark_package_size.py

@@ -1,53 +1,9 @@
-"""Checks the size of a specific directory and uploads result."""
+"""Checks the size of a specific directory and uploads result to Posthog."""
 
 
 import argparse
 import argparse
 import os
 import os
-import subprocess
-from datetime import datetime
 
 
-import psycopg2
-
-
-def get_directory_size(directory):
-    """Get the size of a directory in bytes.
-
-    Args:
-        directory: The directory to check.
-
-    Returns:
-        The size of the dir in bytes.
-    """
-    total_size = 0
-    for dirpath, _, filenames in os.walk(directory):
-        for f in filenames:
-            fp = os.path.join(dirpath, f)
-            total_size += os.path.getsize(fp)
-    return total_size
-
-
-def get_python_version(venv_path, os_name):
-    """Get the python version of python in a virtual env.
-
-    Args:
-        venv_path: Path to virtual environment.
-        os_name: Name of os.
-
-    Returns:
-        The python version.
-    """
-    python_executable = (
-        os.path.join(venv_path, "bin", "python")
-        if "windows" not in os_name
-        else os.path.join(venv_path, "Scripts", "python.exe")
-    )
-    try:
-        output = subprocess.check_output(
-            [python_executable, "--version"], stderr=subprocess.STDOUT
-        )
-        python_version = output.decode("utf-8").strip().split()[1]
-        return ".".join(python_version.split(".")[:-1])
-    except subprocess.CalledProcessError:
-        return None
+from utils import get_directory_size, get_python_version, send_data_to_posthog
 
 
 
 
 def get_package_size(venv_path, os_name):
 def get_package_size(venv_path, os_name):
@@ -64,6 +20,7 @@ def get_package_size(venv_path, os_name):
         ValueError: when venv does not exist or python version is None.
         ValueError: when venv does not exist or python version is None.
     """
     """
     python_version = get_python_version(venv_path, os_name)
     python_version = get_python_version(venv_path, os_name)
+    print("Python version:", python_version)
     if python_version is None:
     if python_version is None:
         raise ValueError("Error: Failed to determine Python version.")
         raise ValueError("Error: Failed to determine Python version.")
 
 
@@ -86,61 +43,45 @@ def get_package_size(venv_path, os_name):
 
 
 
 
 def insert_benchmarking_data(
 def insert_benchmarking_data(
-    db_connection_url: str,
     os_type_version: str,
     os_type_version: str,
     python_version: str,
     python_version: str,
-    measurement_type: str,
     commit_sha: str,
     commit_sha: str,
     pr_title: str,
     pr_title: str,
     branch_name: str,
     branch_name: str,
     pr_id: str,
     pr_id: str,
     path: str,
     path: str,
 ):
 ):
-    """Insert the benchmarking data into the database.
+    """Insert the benchmarking data into PostHog.
 
 
     Args:
     Args:
-        db_connection_url: The URL to connect to the database.
         os_type_version: The OS type and version to insert.
         os_type_version: The OS type and version to insert.
         python_version: The Python version to insert.
         python_version: The Python version to insert.
-        measurement_type: The type of metric to measure.
         commit_sha: The commit SHA to insert.
         commit_sha: The commit SHA to insert.
         pr_title: The PR title to insert.
         pr_title: The PR title to insert.
         branch_name: The name of the branch.
         branch_name: The name of the branch.
         pr_id: The id of the PR.
         pr_id: The id of the PR.
         path: The path to the dir or file to check size.
         path: The path to the dir or file to check size.
     """
     """
-    if measurement_type == "reflex-package":
-        size = get_package_size(path, os_type_version)
-    else:
+    if "./dist" in path:
         size = get_directory_size(path)
         size = get_directory_size(path)
+    else:
+        size = get_package_size(path, os_type_version)
 
 
-    # Get the current timestamp
-    current_timestamp = datetime.now()
-
-    # Connect to the database and insert the data
-    with psycopg2.connect(db_connection_url) as conn, conn.cursor() as cursor:
-        insert_query = """
-            INSERT INTO size_benchmarks (os, python_version, commit_sha, created_at, pr_title, branch_name, pr_id, measurement_type, size)
-            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s);
-            """
-        cursor.execute(
-            insert_query,
-            (
-                os_type_version,
-                python_version,
-                commit_sha,
-                current_timestamp,
-                pr_title,
-                branch_name,
-                pr_id,
-                measurement_type,
-                round(
-                    size / (1024 * 1024), 3
-                ),  # save size in mb and round to 3 places.
-            ),
-        )
-        # Commit the transaction
-        conn.commit()
+    # Prepare the event data
+    properties = {
+        "path": path,
+        "os": os_type_version,
+        "python_version": python_version,
+        "distinct_id": commit_sha,
+        "pr_title": pr_title,
+        "branch_name": branch_name,
+        "pr_id": pr_id,
+        "size_mb": round(
+            size / (1024 * 1024), 3
+        ),  # save size in MB and round to 3 places
+    }
+
+    send_data_to_posthog("package_size", properties)
 
 
 
 
 def main():
 def main():
@@ -155,11 +96,6 @@ def main():
     parser.add_argument(
     parser.add_argument(
         "--commit-sha", help="The commit SHA to insert into the database."
         "--commit-sha", help="The commit SHA to insert into the database."
     )
     )
-    parser.add_argument(
-        "--db-url",
-        help="The URL to connect to the database.",
-        required=True,
-    )
     parser.add_argument(
     parser.add_argument(
         "--pr-title",
         "--pr-title",
         help="The PR title to insert into the database.",
         help="The PR title to insert into the database.",
@@ -174,14 +110,9 @@ def main():
         help="The pr id",
         help="The pr id",
         required=True,
         required=True,
     )
     )
-    parser.add_argument(
-        "--measurement-type",
-        help="The type of metric to be checked.",
-        required=True,
-    )
     parser.add_argument(
     parser.add_argument(
         "--path",
         "--path",
-        help="the current path to check size.",
+        help="The path to the vnenv.",
         required=True,
         required=True,
     )
     )
     args = parser.parse_args()
     args = parser.parse_args()
@@ -191,10 +122,8 @@ def main():
 
 
     # Insert the data into the database
     # Insert the data into the database
     insert_benchmarking_data(
     insert_benchmarking_data(
-        db_connection_url=args.db_url,
         os_type_version=args.os,
         os_type_version=args.os,
         python_version=args.python_version,
         python_version=args.python_version,
-        measurement_type=args.measurement_type,
         commit_sha=args.commit_sha,
         commit_sha=args.commit_sha,
         pr_title=pr_title,
         pr_title=pr_title,
         branch_name=args.branch_name,
         branch_name=args.branch_name,

+ 105 - 0
benchmarks/benchmark_web_size.py

@@ -0,0 +1,105 @@
+"""Checks the size of a specific directory and uploads result to Posthog."""
+
+import argparse
+import os
+
+from utils import get_directory_size, send_data_to_posthog
+
+
+def insert_benchmarking_data(
+    os_type_version: str,
+    python_version: str,
+    app_name: str,
+    commit_sha: str,
+    pr_title: str,
+    branch_name: str,
+    pr_id: str,
+    path: str,
+):
+    """Insert the benchmarking data into PostHog.
+
+    Args:
+        app_name: The name of the app being measured.
+        os_type_version: The OS type and version to insert.
+        python_version: The Python version to insert.
+        commit_sha: The commit SHA to insert.
+        pr_title: The PR title to insert.
+        branch_name: The name of the branch.
+        pr_id: The id of the PR.
+        path: The path to the dir or file to check size.
+    """
+    size = get_directory_size(path)
+
+    # Prepare the event data
+    properties = {
+        "app_name": app_name,
+        "os": os_type_version,
+        "python_version": python_version,
+        "distinct_id": commit_sha,
+        "pr_title": pr_title,
+        "branch_name": branch_name,
+        "pr_id": pr_id,
+        "size_mb": round(
+            size / (1024 * 1024), 3
+        ),  # save size in MB and round to 3 places
+    }
+
+    send_data_to_posthog("web-size", properties)
+
+
+def main():
+    """Runs the benchmarks and inserts the results."""
+    parser = argparse.ArgumentParser(description="Run benchmarks and process results.")
+    parser.add_argument(
+        "--os", help="The OS type and version to insert into the database."
+    )
+    parser.add_argument(
+        "--python-version", help="The Python version to insert into the database."
+    )
+    parser.add_argument(
+        "--commit-sha", help="The commit SHA to insert into the database."
+    )
+    parser.add_argument(
+        "--pr-title",
+        help="The PR title to insert into the database.",
+    )
+    parser.add_argument(
+        "--branch-name",
+        help="The current branch",
+        required=True,
+    )
+    parser.add_argument(
+        "--app-name",
+        help="The name of the app measured.",
+        required=True,
+    )
+    parser.add_argument(
+        "--pr-id",
+        help="The pr id",
+        required=True,
+    )
+    parser.add_argument(
+        "--path",
+        help="The current path to app to check.",
+        required=True,
+    )
+    args = parser.parse_args()
+
+    # Get the PR title from env or the args. For the PR merge or push event, there is no PR title, leaving it empty.
+    pr_title = args.pr_title or os.getenv("PR_TITLE", "")
+
+    # Insert the data into the database
+    insert_benchmarking_data(
+        app_name=args.app_name,
+        os_type_version=args.os,
+        python_version=args.python_version,
+        commit_sha=args.commit_sha,
+        pr_title=pr_title,
+        branch_name=args.branch_name,
+        pr_id=args.pr_id,
+        path=args.path,
+    )
+
+
+if __name__ == "__main__":
+    main()

+ 0 - 0
scripts/benchmarks/benchmarks.sh → benchmarks/lighthouse.sh


+ 73 - 0
benchmarks/utils.py

@@ -0,0 +1,73 @@
+"""Utility functions for the benchmarks."""
+
+import os
+import subprocess
+
+import httpx
+from httpx import HTTPError
+
+
+def get_python_version(venv_path, os_name):
+    """Get the python version of python in a virtual env.
+
+    Args:
+        venv_path: Path to virtual environment.
+        os_name: Name of os.
+
+    Returns:
+        The python version.
+    """
+    python_executable = (
+        os.path.join(venv_path, "bin", "python")
+        if "windows" not in os_name
+        else os.path.join(venv_path, "Scripts", "python.exe")
+    )
+    try:
+        output = subprocess.check_output(
+            [python_executable, "--version"], stderr=subprocess.STDOUT
+        )
+        python_version = output.decode("utf-8").strip().split()[1]
+        return ".".join(python_version.split(".")[:-1])
+    except subprocess.CalledProcessError:
+        return None
+
+
+def get_directory_size(directory):
+    """Get the size of a directory in bytes.
+
+    Args:
+        directory: The directory to check.
+
+    Returns:
+        The size of the dir in bytes.
+    """
+    total_size = 0
+    for dirpath, _, filenames in os.walk(directory):
+        for f in filenames:
+            fp = os.path.join(dirpath, f)
+            total_size += os.path.getsize(fp)
+    return total_size
+
+
+def send_data_to_posthog(event, properties):
+    """Send data to PostHog.
+
+    Args:
+        event: The event to send.
+        properties: The properties to send.
+
+    Raises:
+        HTTPError: When there is an error sending data to PostHog.
+    """
+    event_data = {
+        "api_key": "phc_JoMo0fOyi0GQAooY3UyO9k0hebGkMyFJrrCw1Gt5SGb",
+        "event": event,
+        "properties": properties,
+    }
+
+    with httpx.Client() as client:
+        response = client.post("https://app.posthog.com/capture/", json=event_data)
+        if response.status_code != 200:
+            raise HTTPError(
+                f"Error sending data to PostHog: {response.status_code} - {response.text}"
+            )