Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
493 changes: 493 additions & 0 deletions .design_docs/sketch-config-optimization-formulation.md

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions asap-planner-rs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ path = "src/lib.rs"
name = "asap-planner"
path = "src/main.rs"

[[bin]]
name = "asap-optimizer-cli"
path = "src/bin/optimizer_cli.rs"

[dependencies]
asap_types.workspace = true
promql_utilities.workspace = true
Expand Down
3 changes: 2 additions & 1 deletion asap-planner-rs/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ COPY asap-planner-rs/Cargo.toml ./asap-planner-rs/
# Create dummy source files so Cargo can resolve all workspace members
RUN mkdir -p asap-query-engine/src && echo "fn main() {}" > asap-query-engine/src/main.rs && \
mkdir -p asap-query-engine/benches && echo "fn main() {}" > asap-query-engine/benches/simple_store_bench.rs && \
mkdir -p asap-planner-rs/src && echo "fn main() {}" > asap-planner-rs/src/main.rs && \
mkdir -p asap-planner-rs/src/bin && echo "fn main() {}" > asap-planner-rs/src/main.rs && \
echo "fn main() {}" > asap-planner-rs/src/bin/optimizer_cli.rs && \
echo "pub fn placeholder() {}" >> asap-planner-rs/src/lib.rs

# Build dependencies (this layer will be cached)
Expand Down
83 changes: 83 additions & 0 deletions asap-planner-rs/src/bin/optimizer_cli.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
//! Offline runner for the optimization-based sketch/config selector.
//!
//! Standalone: not wired into `asap-planner`/`Controller::generate()` yet. Lets
//! you exercise `run_greedy_pipeline` against real workload configs while the
//! optimizer module is still under development (Phase 2 of issue #405).

use std::path::PathBuf;

use asap_planner::optimizer::run_greedy_pipeline;
use asap_planner::ControllerConfig;
use clap::Parser;

#[derive(Parser, Debug)]
#[command(
name = "asap-optimizer-cli",
about = "Offline runner for the optimization-based sketch/config selector (not wired into asap-planner yet)"
)]
struct Args {
/// Path to a YAML workload config (same format as `asap-planner --input_config`).
#[arg(long = "input_config")]
input_config: PathBuf,

#[arg(long = "prometheus_scrape_interval")]
prometheus_scrape_interval: u64,

/// Placeholder arrival rate (items/sec) applied uniformly to every candidate's
/// IngestCost. Real per-config rates aren't wired up yet — see the open TODOs
/// in .design_docs/optimizer-v1-implementation-plan.md.
#[arg(long = "rho", default_value = "1.0", value_parser = parse_positive_finite)]
rho: f64,

#[arg(short, long, action = clap::ArgAction::Count)]
verbose: u8,
}

fn parse_positive_finite(s: &str) -> Result<f64, String> {
let v: f64 = s.parse().map_err(|_| format!("not a valid number: {s}"))?;
if !v.is_finite() || v <= 0.0 {
return Err(format!("--rho must be a positive finite number, got {v}"));
}
Ok(v)
}

fn main() -> anyhow::Result<()> {
let args = Args::parse();

tracing_subscriber::fmt()
.with_max_level(if args.verbose > 0 {
tracing::Level::DEBUG
} else {
tracing::Level::INFO
})
.init();

let yaml_str = std::fs::read_to_string(&args.input_config)?;
let config: ControllerConfig = serde_yaml::from_str(&yaml_str)?;
let schema = config.schema_from_hints();

let (streaming, inference) =
run_greedy_pipeline(&config, &schema, args.prometheus_scrape_interval, args.rho);

let deployed = streaming.get_all_aggregation_configs();
println!("=== Deployed streaming configs: {} ===", deployed.len());
for (id, cfg) in deployed {
println!(
" [{id}] {} sub_type={:?} window={}s slide={}s type={:?} metric={} params={:?}",
cfg.aggregation_type,
cfg.aggregation_sub_type,
cfg.window_size,
cfg.slide_interval,
cfg.window_type,
cfg.metric,
cfg.parameters,
);
}

println!("\n=== Query configs: {} ===", inference.query_configs.len());
for qc in &inference.query_configs {
println!(" \"{}\" -> {:?}", qc.query, qc.aggregations);
}

Ok(())
}
1 change: 1 addition & 0 deletions asap-planner-rs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ pub mod config;
pub mod elastic_dsl;
pub mod error;
pub mod generator;
pub mod optimizer;
pub mod planner;
pub mod planner_output;
pub mod prometheus_client;
Expand Down
Loading
Loading