about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRaghul Nanth A <61490162+NanthR@users.noreply.github.com>2023-06-12 01:18:24 +0530
committerRaghul Nanth A <61490162+NanthR@users.noreply.github.com>2023-06-12 01:22:34 +0530
commitf15e026101a99487fd1debb87e6c879eb9b215c1 (patch)
tree443ffe6ea35a6125fb5a0681e1daf58736759c76
parentd567091f472a6c2b55262e25d092f1d43a7a4fae (diff)
downloadrust-f15e026101a99487fd1debb87e6c879eb9b215c1.tar.gz
rust-f15e026101a99487fd1debb87e6c879eb9b215c1.zip
ci(metrics): Run measurement functions in parallel
feat(xtask): Split metrics function
-rw-r--r--.github/workflows/metrics.yaml234
-rw-r--r--xtask/src/flags.rs29
-rw-r--r--xtask/src/metrics.rs76
3 files changed, 292 insertions, 47 deletions
diff --git a/.github/workflows/metrics.yaml b/.github/workflows/metrics.yaml
index 3fe2fc917a3..233af42f42c 100644
--- a/.github/workflows/metrics.yaml
+++ b/.github/workflows/metrics.yaml
@@ -11,20 +11,234 @@ env:
   RUSTUP_MAX_RETRIES: 10
 
 jobs:
-  metrics:
-    if: github.repository == 'rust-lang/rust-analyzer'
+  setup_cargo:
     runs-on: ubuntu-latest
+    steps:
+      - name: Install Rust toolchain
+        run: |
+          rustup update --no-self-update stable
+          rustup component add rustfmt rust-src
+      - name: Cache cargo
+        uses: actions/cache@v3
+        with:
+          path: |
+            ~/.cargo/bin/
+            ~/.cargo/registry/index/
+            ~/.cargo/registry/cache/
+            ~/.cargo/git/db/
+          key: ${{ runner.os }}-cargo-${{ github.sha }}
+
+  build_metrics:
+    runs-on: ubuntu-latest
+    needs: setup_cargo
 
     steps:
     - name: Checkout repository
       uses: actions/checkout@v3
 
-    - name: Install Rust toolchain
-      run: |
-        rustup update --no-self-update stable
-        rustup component add rustfmt rust-src
+    - name: Restore cargo cache
+      uses: actions/cache@v3
+      with:
+        path: |
+          ~/.cargo/bin/
+          ~/.cargo/registry/index/
+          ~/.cargo/registry/cache/
+          ~/.cargo/git/db/
+        key: ${{ runner.os }}-cargo-${{ github.sha }}
+
+
+    - name: Collect build metrics
+      run: cargo xtask metrics build
+
+    - name: Cache target
+      uses: actions/cache@v3
+      with:
+        path: target/
+        key: ${{ runner.os }}-target-${{ github.sha }}
+
+    - name: Upload build metrics
+      uses: actions/upload-artifact@v3
+      with:
+        name: build-${{ github.sha }}
+        path: target/build.json
+        if-no-files-found: error
+
+  self_metrics:
+    runs-on: ubuntu-latest
+    needs: [setup_cargo, build_metrics]
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v3
+
+    - name: Restore cargo cache
+      uses: actions/cache@v3
+      with:
+        path: |
+          ~/.cargo/bin/
+          ~/.cargo/registry/index/
+          ~/.cargo/registry/cache/
+          ~/.cargo/git/db/
+        key: ${{ runner.os }}-cargo-${{ github.sha }}
+
+    - name: Restore target cache
+      uses: actions/cache@v3
+      with:
+        path: target/
+        key: ${{ runner.os }}-target-${{ github.sha }}
 
-    - name: Collect metrics
-      run: cargo xtask metrics
-      env:
-        METRICS_TOKEN: ${{ secrets.METRICS_TOKEN }}
+    - name: Collect build metrics
+      run: cargo xtask metrics self
+
+    - name: Upload build metrics
+      uses: actions/upload-artifact@v3
+      with:
+        name: self-${{ github.sha }}
+        path: target/self.json
+        if-no-files-found: error
+
+  ripgrep_metrics:
+    runs-on: ubuntu-latest
+    needs: [setup_cargo, build_metrics]
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v3
+
+    - name: Restore cargo cache
+      uses: actions/cache@v3
+      with:
+        path: |
+          ~/.cargo/bin/
+          ~/.cargo/registry/index/
+          ~/.cargo/registry/cache/
+          ~/.cargo/git/db/
+        key: ${{ runner.os }}-cargo-${{ github.sha }}
+
+    - name: Restore target cache
+      uses: actions/cache@v3
+      with:
+        path: target/
+        key: ${{ runner.os }}-target-${{ github.sha }}
+
+    - name: Collect build metrics
+      run: cargo xtask metrics ripgrep
+
+    - name: Upload ripgrep metrics
+      uses: actions/upload-artifact@v3
+      with:
+        name: ripgrep-${{ github.sha }}
+        path: target/ripgrep.json
+        if-no-files-found: error
+
+  webrender_metrics:
+    runs-on: ubuntu-latest
+    needs: [setup_cargo, build_metrics]
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v3
+
+    - name: Restore cargo cache
+      uses: actions/cache@v3
+      with:
+        path: |
+          ~/.cargo/bin/
+          ~/.cargo/registry/index/
+          ~/.cargo/registry/cache/
+          ~/.cargo/git/db/
+        key: ${{ runner.os }}-cargo-${{ github.sha }}
+
+    - name: Restore target cache
+      uses: actions/cache@v3
+      with:
+        path: target/
+        key: ${{ runner.os }}-target-${{ github.sha }}
+
+    - name: Collect webrender metrics
+      run: cargo xtask metrics webrender
+
+    - name: Upload webrender metrics
+      uses: actions/upload-artifact@v3
+      with:
+        name: webrender-${{ github.sha }}
+        path: target/webrender.json
+        if-no-files-found: error
+
+  diesel_metrics:
+    runs-on: ubuntu-latest
+    needs: [setup_cargo, build_metrics]
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v3
+
+    - name: Restore cargo cache
+      uses: actions/cache@v3
+      with:
+        path: |
+          ~/.cargo/bin/
+          ~/.cargo/registry/index/
+          ~/.cargo/registry/cache/
+          ~/.cargo/git/db/
+        key: ${{ runner.os }}-cargo-${{ github.sha }}
+
+    - name: Restore target cache
+      uses: actions/cache@v3
+      with:
+        path: target/
+        key: ${{ runner.os }}-target-${{ github.sha }}
+
+    - name: Collect build metrics
+      run: cargo xtask metrics diesel
+
+    - name: Upload build metrics
+      uses: actions/upload-artifact@v3
+      with:
+        name: diesel-${{ github.sha }}
+        path: target/diesel.json
+        if-no-files-found: error
+
+
+
+  generate_final_metrics:
+    runs-on: ubuntu-latest
+    needs: [build_metrics, self_metrics, ripgrep_metrics, webrender_metrics, diesel_metrics]
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v3
+
+    - name: Download build metrics
+      uses: actions/download-artifact@v3
+      with:
+        name: build-${{ github.sha }}
+
+    - name: Download self metrics
+      uses: actions/download-artifact@v3
+      with:
+        name: self-${{ github.sha }}
+
+    - name: Download ripgrep metrics
+      uses: actions/download-artifact@v3
+      with:
+        name: ripgrep-${{ github.sha }}
+
+    - name: Download webrender metrics
+      uses: actions/download-artifact@v3
+      with:
+        name: webrender-${{ github.sha }}
+
+    - name: Download diesel metrics
+      uses: actions/download-artifact@v3
+      with:
+        name: diesel-${{ github.sha }}
+
+    - name: Combine json
+      run: |
+        git clone --depth 1 https://$METRICS_TOKEN@github.com/nanthR/metrics.git
+        jq -s ".[0] * .[1] * .[2] * .[3] * .[4]" build.json self.json ripgrep.json webrender.json diesel.json -c >> metrics/metrics.json
+        git -C metrics add .
+        git -C metrics -c user.name=Bot -c user.email=dummy@example.com commit --message 📈
+        git -C metrics push origin master
+    env:
+      METRICS_TOKEN: ${{ secrets.METRICS_TOKEN }}
diff --git a/xtask/src/flags.rs b/xtask/src/flags.rs
index 21004797014..47d0ea254bb 100644
--- a/xtask/src/flags.rs
+++ b/xtask/src/flags.rs
@@ -1,5 +1,7 @@
 #![allow(unreachable_pub)]
 
+use std::str::FromStr;
+
 use crate::install::{ClientOpt, Malloc, ServerOpt};
 
 xflags::xflags! {
@@ -42,7 +44,7 @@ xflags::xflags! {
             required changelog: String
         }
         cmd metrics {
-            optional --dry-run
+            optional measurement_type: MeasurementType
         }
         /// Builds a benchmark version of rust-analyzer and puts it into `./target`.
         cmd bb {
@@ -106,8 +108,31 @@ pub struct PublishReleaseNotes {
 }
 
 #[derive(Debug)]
+pub enum MeasurementType {
+    Build,
+    AnalyseSelf,
+    AnalyseRipgrep,
+    AnalyseWebRender,
+    AnalyseDiesel,
+}
+
+impl FromStr for MeasurementType {
+    type Err = String;
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        match s {
+            "build" => Ok(Self::Build),
+            "self" => Ok(Self::AnalyseSelf),
+            "ripgrep" => Ok(Self::AnalyseRipgrep),
+            "webrender" => Ok(Self::AnalyseWebRender),
+            "diesel" => Ok(Self::AnalyseDiesel),
+            _ => Err("Invalid option".to_string()),
+        }
+    }
+}
+
+#[derive(Debug)]
 pub struct Metrics {
-    pub dry_run: bool,
+    pub measurement_type: Option<MeasurementType>,
 }
 
 #[derive(Debug)]
diff --git a/xtask/src/metrics.rs b/xtask/src/metrics.rs
index b6f730dbf12..d51dfb183f8 100644
--- a/xtask/src/metrics.rs
+++ b/xtask/src/metrics.rs
@@ -1,6 +1,6 @@
 use std::{
     collections::BTreeMap,
-    env, fs,
+    fs,
     io::Write as _,
     path::Path,
     time::{Instant, SystemTime, UNIX_EPOCH},
@@ -9,16 +9,13 @@ use std::{
 use anyhow::{bail, format_err};
 use xshell::{cmd, Shell};
 
-use crate::flags;
+use crate::flags::{self, MeasurementType};
 
 type Unit = String;
 
 impl flags::Metrics {
     pub(crate) fn run(self, sh: &Shell) -> anyhow::Result<()> {
         let mut metrics = Metrics::new(sh)?;
-        if !self.dry_run {
-            sh.remove_path("./target/release")?;
-        }
         if !Path::new("./target/rustc-perf").exists() {
             sh.create_dir("./target/rustc-perf")?;
             cmd!(sh, "git clone https://github.com/rust-lang/rustc-perf.git ./target/rustc-perf")
@@ -32,38 +29,47 @@ impl flags::Metrics {
 
         let _env = sh.push_env("RA_METRICS", "1");
 
-        {
-            // https://github.com/rust-lang/rust-analyzer/issues/9997
-            let _d = sh.push_dir("target/rustc-perf/collector/benchmarks/webrender");
-            cmd!(sh, "cargo update -p url --precise 1.6.1").run()?;
-        }
-        metrics.measure_build(sh)?;
-        metrics.measure_analysis_stats_self(sh)?;
-        metrics.measure_analysis_stats(sh, "ripgrep")?;
-        metrics.measure_analysis_stats(sh, "webrender")?;
-        metrics.measure_analysis_stats(sh, "diesel/diesel")?;
-
-        if !self.dry_run {
-            let _d = sh.push_dir("target");
-            let metrics_token = env::var("METRICS_TOKEN").unwrap();
-            cmd!(
-                sh,
-                "git clone --depth 1 https://{metrics_token}@github.com/rust-analyzer/metrics.git"
-            )
-            .run()?;
-
-            {
-                let mut file =
-                    fs::File::options().append(true).open("target/metrics/metrics.json")?;
-                writeln!(file, "{}", metrics.json())?;
+        let filename = match self.measurement_type {
+            Some(ms) => match ms {
+                MeasurementType::Build => {
+                    metrics.measure_build(sh)?;
+                    "build.json"
+                }
+                MeasurementType::AnalyseSelf => {
+                    metrics.measure_analysis_stats_self(sh)?;
+                    "self.json"
+                }
+                MeasurementType::AnalyseRipgrep => {
+                    metrics.measure_analysis_stats(sh, "ripgrep")?;
+                    "ripgrep.json"
+                }
+                MeasurementType::AnalyseWebRender => {
+                    {
+                        // https://github.com/rust-lang/rust-analyzer/issues/9997
+                        let _d = sh.push_dir("target/rustc-perf/collector/benchmarks/webrender");
+                        cmd!(sh, "cargo update -p url --precise 1.6.1").run()?;
+                    }
+                    metrics.measure_analysis_stats(sh, "webrender")?;
+                    "webrender.json"
+                }
+                MeasurementType::AnalyseDiesel => {
+                    metrics.measure_analysis_stats(sh, "diesel/diesel")?;
+                    "diesel.json"
+                }
+            },
+            None => {
+                metrics.measure_build(sh)?;
+                metrics.measure_analysis_stats_self(sh)?;
+                metrics.measure_analysis_stats(sh, "ripgrep")?;
+                metrics.measure_analysis_stats(sh, "webrender")?;
+                metrics.measure_analysis_stats(sh, "diesel/diesel")?;
+                "all.json"
             }
+        };
 
-            let _d = sh.push_dir("metrics");
-            cmd!(sh, "git add .").run()?;
-            cmd!(sh, "git -c user.name=Bot -c user.email=dummy@example.com commit --message 📈")
-                .run()?;
-            cmd!(sh, "git push origin master").run()?;
-        }
+        let mut file =
+            fs::File::options().write(true).create(true).open(format!("target/{}", filename))?;
+        writeln!(file, "{}", metrics.json())?;
         eprintln!("{metrics:#?}");
         Ok(())
     }