Skip to content

Commit fe0a2ac

Browse files
Merge remote-tracking branch 'origin/main' into 250-asap-planner-rs-auto-infer-metric-labels-from-prometheus
2 parents 86c6b99 + 5221041 commit fe0a2ac

24 files changed

Lines changed: 1986 additions & 770 deletions
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
name: PR Evaluation
2+
3+
# NOTE: GitHub-hosted runners are noisy. Latency numbers are indicative only.
4+
# For precise benchmarks, register a self-hosted runner once asap-tools infra
5+
# is decoupled from Cloudlab. See PDF eval guide Phase 3.
6+
7+
on:
8+
pull_request:
9+
branches:
10+
- main
11+
paths:
12+
- 'asap-query-engine/**'
13+
- 'asap-planner-rs/**'
14+
- 'asap-summary-ingest/**'
15+
- 'asap-quickstart/**'
16+
- '.github/workflows/accuracy_performance.yml'
17+
- 'benchmarks/**'
18+
workflow_dispatch:
19+
20+
permissions:
21+
contents: read
22+
packages: write
23+
pull-requests: write
24+
25+
jobs:
26+
# ---------------------------------------------------------------------------
27+
# Job 1: build images once from branch code and push with a SHA-based tag.
28+
# All downstream jobs pull these images instead of rebuilding.
29+
# ---------------------------------------------------------------------------
30+
build:
31+
name: Build CI images
32+
runs-on: ubuntu-latest
33+
outputs:
34+
image-tag: ${{ steps.tag.outputs.value }}
35+
36+
steps:
37+
- name: Checkout repository
38+
uses: actions/checkout@v4
39+
40+
- name: Set up Docker Buildx
41+
uses: docker/setup-buildx-action@v3
42+
43+
- name: Log in to GHCR
44+
uses: docker/login-action@v3
45+
with:
46+
registry: ghcr.io
47+
username: ${{ github.repository_owner }}
48+
password: ${{ secrets.GITHUB_TOKEN }}
49+
50+
- name: Compute image tag
51+
id: tag
52+
run: echo "value=sha-$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
53+
54+
- name: Build and push asap-planner-rs
55+
uses: docker/build-push-action@v6
56+
with:
57+
context: .
58+
file: asap-planner-rs/Dockerfile
59+
push: true
60+
tags: ghcr.io/projectasap/asap-planner-rs:${{ steps.tag.outputs.value }}
61+
cache-from: type=registry,ref=ghcr.io/projectasap/asap-planner-rs:buildcache
62+
cache-to: type=registry,ref=ghcr.io/projectasap/asap-planner-rs:buildcache,mode=max
63+
64+
- name: Build and push asap-summary-ingest
65+
uses: docker/build-push-action@v6
66+
with:
67+
context: asap-summary-ingest
68+
file: asap-summary-ingest/Dockerfile
69+
push: true
70+
tags: ghcr.io/projectasap/asap-summary-ingest:${{ steps.tag.outputs.value }}
71+
build-args: BASE_IMAGE=ghcr.io/projectasap/asap-base:latest
72+
73+
- name: Build and push asap-query-engine
74+
uses: docker/build-push-action@v6
75+
with:
76+
context: .
77+
file: asap-query-engine/Dockerfile
78+
push: true
79+
tags: ghcr.io/projectasap/asap-query-engine:${{ steps.tag.outputs.value }}
80+
cache-from: type=registry,ref=ghcr.io/projectasap/asap-query-engine:buildcache
81+
cache-to: type=registry,ref=ghcr.io/projectasap/asap-query-engine:buildcache,mode=max
82+
83+
# ---------------------------------------------------------------------------
84+
# Job 2: pull the images built above, deploy the full stack, and evaluate.
85+
# ---------------------------------------------------------------------------
86+
eval:
87+
name: Full-stack PR evaluation
88+
needs: build
89+
runs-on: ubuntu-latest
90+
timeout-minutes: 60
91+
env:
92+
ASAP_IMAGE_TAG: ${{ needs.build.outputs.image-tag }}
93+
94+
steps:
95+
- name: Checkout repository
96+
uses: actions/checkout@v4
97+
98+
- name: Log in to GHCR
99+
uses: docker/login-action@v3
100+
with:
101+
registry: ghcr.io
102+
username: ${{ github.repository_owner }}
103+
password: ${{ secrets.GITHUB_TOKEN }}
104+
105+
- name: Pull and start full stack
106+
run: |
107+
docker compose \
108+
-f asap-quickstart/docker-compose.yml \
109+
-f benchmarks/docker-compose.yml \
110+
up -d
111+
112+
- name: Show running containers
113+
run: |
114+
docker compose \
115+
-f asap-quickstart/docker-compose.yml \
116+
-f benchmarks/docker-compose.yml \
117+
ps
118+
119+
- name: Wait for all services to be healthy
120+
run: bash benchmarks/scripts/wait_for_stack.sh
121+
122+
- name: Wait for pipeline and data ingestion
123+
run: bash benchmarks/scripts/ingest_wait.sh
124+
125+
- name: Set up Python 3.11
126+
uses: actions/setup-python@v5
127+
with:
128+
python-version: '3.11'
129+
130+
- name: Install Python dependencies
131+
run: pip install requests
132+
133+
- name: Run baseline queries (Prometheus)
134+
run: python benchmarks/scripts/run_baseline.py
135+
136+
- name: Run ASAP queries (query engine)
137+
run: python benchmarks/scripts/run_asap.py
138+
139+
- name: Compare results and evaluate
140+
run: python benchmarks/scripts/compare.py
141+
142+
- name: Upload evaluation reports
143+
if: always()
144+
uses: actions/upload-artifact@v4
145+
with:
146+
name: eval-reports-${{ github.run_id }}
147+
path: benchmarks/reports/
148+
149+
- name: Print docker logs on failure
150+
if: failure()
151+
run: |
152+
docker compose \
153+
-f asap-quickstart/docker-compose.yml \
154+
-f benchmarks/docker-compose.yml \
155+
logs --no-color
156+
157+
- name: Teardown stack
158+
if: always()
159+
run: |
160+
docker compose \
161+
-f asap-quickstart/docker-compose.yml \
162+
-f benchmarks/docker-compose.yml \
163+
down -v

asap-query-engine/src/bin/precompute_engine.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use query_engine_rust::data_model::{
55
};
66
use query_engine_rust::drivers::query::adapters::AdapterConfig;
77
use query_engine_rust::engines::SimpleEngine;
8-
use query_engine_rust::precompute_engine::config::PrecomputeEngineConfig;
8+
use query_engine_rust::precompute_engine::config::{LateDataPolicy, PrecomputeEngineConfig};
99
use query_engine_rust::precompute_engine::output_sink::{RawPassthroughSink, StoreOutputSink};
1010
use query_engine_rust::precompute_engine::PrecomputeEngine;
1111
use query_engine_rust::stores::SimpleMapStore;
@@ -61,6 +61,10 @@ struct Args {
6161
/// Aggregation ID to stamp on each raw-mode output
6262
#[arg(long, default_value_t = 0)]
6363
raw_mode_aggregation_id: u64,
64+
65+
/// Policy for handling late samples that arrive after their window has closed
66+
#[arg(long, value_enum, default_value_t = LateDataPolicy::Drop)]
67+
late_data_policy: LateDataPolicy,
6468
}
6569

6670
#[tokio::main]
@@ -131,6 +135,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
131135
channel_buffer_size: args.channel_buffer_size,
132136
pass_raw_samples: args.pass_raw_samples,
133137
raw_mode_aggregation_id: args.raw_mode_aggregation_id,
138+
late_data_policy: args.late_data_policy,
134139
};
135140

136141
// Create the output sink (writes directly to the store)

asap-query-engine/src/bin/test_e2e_precompute.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use query_engine_rust::drivers::ingest::prometheus_remote_write::{
1515
};
1616
use query_engine_rust::drivers::query::adapters::AdapterConfig;
1717
use query_engine_rust::engines::SimpleEngine;
18-
use query_engine_rust::precompute_engine::config::PrecomputeEngineConfig;
18+
use query_engine_rust::precompute_engine::config::{LateDataPolicy, PrecomputeEngineConfig};
1919
use query_engine_rust::precompute_engine::output_sink::{RawPassthroughSink, StoreOutputSink};
2020
use query_engine_rust::precompute_engine::PrecomputeEngine;
2121
use query_engine_rust::stores::SimpleMapStore;
@@ -144,6 +144,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
144144
channel_buffer_size: 10000,
145145
pass_raw_samples: false,
146146
raw_mode_aggregation_id: 0,
147+
late_data_policy: LateDataPolicy::Drop,
147148
};
148149
let output_sink = Arc::new(StoreOutputSink::new(store.clone()));
149150
let engine = PrecomputeEngine::new(engine_config, streaming_config.clone(), output_sink);
@@ -283,6 +284,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
283284
channel_buffer_size: 10000,
284285
pass_raw_samples: true,
285286
raw_mode_aggregation_id: raw_agg_id,
287+
late_data_policy: LateDataPolicy::Drop,
286288
};
287289
let raw_sink = Arc::new(RawPassthroughSink::new(store.clone()));
288290
let raw_engine = PrecomputeEngine::new(raw_engine_config, streaming_config.clone(), raw_sink);

0 commit comments

Comments
 (0)