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
12 changes: 6 additions & 6 deletions control_plane/src/emit/otap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ pub fn emit_otap_dag_yaml(
});
prev = name;
}
let endpoint = resolve_export_endpoint("gateway", &cfg.exporter_target);
let endpoint = resolve_export_endpoint("backend", &cfg.exporter_target);
nodes.insert(
"exporter".to_string(),
NodeDef {
Expand All @@ -202,7 +202,7 @@ pub fn emit_otap_dag_yaml(
});
} else {
// Mode 2 — raw at edge → sketch at backend. Passthrough DAG.
let endpoint = resolve_export_endpoint("gateway", &cfg.exporter_target);
let endpoint = resolve_export_endpoint("backend", &cfg.exporter_target);
nodes.insert(
"exporter".to_string(),
NodeDef {
Expand Down Expand Up @@ -427,7 +427,7 @@ mod tests {
}

/// Mode 1 snapshot — sketch at edge: receiver → asap_sketches →
/// otlp_grpc exporter to gateway.
/// otlp_grpc exporter to asapquery-backend.
#[test]
fn otap_dag_mode1_sketch_at_edge_shape() {
let yaml = emit_otap_dag_yaml(&ddsketch_edge_cfg_mode1(), "ws://ctrl/v1/opamp", None)
Expand Down Expand Up @@ -458,10 +458,10 @@ mod tests {
assert_eq!(pipe.connections[0].to, "sketch_0");
assert_eq!(pipe.connections[1].from, "sketch_0");
assert_eq!(pipe.connections[1].to, "exporter");
// Endpoint contains gateway:4317.
// Endpoint contains backend:4317.
assert!(
yaml.contains("gateway:4317"),
"missing gateway endpoint\n{yaml}"
yaml.contains("backend:4317"),
"missing backend endpoint\n{yaml}"
);
}

Expand Down
28 changes: 17 additions & 11 deletions control_plane/src/emit/stage_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -225,10 +225,13 @@ tsdb_block_duration: {window_secs}s\n",
};

// ── Exporters ─────────────────────────────────────────────────────────────
// Edge always exports to the gateway. ExportTarget gets resolved to
// a concrete endpoint here (Phase B): symbolic stages map to
// documented hostnames the demo overlay (Phase C) will provision.
let (exporter_key, exporter_val) = build_otlp_exporter("gateway", &cfg.exporter_target);
// Edge exports directly to asapquery-backend's OTLP ingest. The
// backend's precompute engine merges per-aggregation_id accumulators
// server-side, so no middle-tier gateway merge processor is needed.
// (The gateway typed L5 stage + emit_gateway_yaml machinery stays in
// source for topologies that re-introduce a middle tier, but is not
// exercised in the default deployment.)
let (exporter_key, exporter_val) = build_otlp_exporter("backend", &cfg.exporter_target);

let mut exporters: HashMap<String, Value> = [(exporter_key.clone(), exporter_val)].into();
let mut pipelines: HashMap<String, Pipeline> = HashMap::new();
Expand Down Expand Up @@ -963,7 +966,9 @@ tsdb_block_duration: {window_secs}s\n",
processors.insert("memory_limiter".to_string(), memory_limiter_block);

// ── Exporters ──────────────────────────────────────────────────────────
let (exporter_key, exporter_val) = build_otlp_exporter("gateway", &cfg.exporter_target);
// Edge → asapquery-backend OTLP ingest (see emit_edge_yaml for the
// gateway-less rationale).
let (exporter_key, exporter_val) = build_otlp_exporter("backend", &cfg.exporter_target);
let mut exporters: HashMap<String, Value> = [(exporter_key.clone(), exporter_val)].into();

let has_prometheus_archive = !cfg.prometheus_archive_metrics.is_empty();
Expand Down Expand Up @@ -1194,9 +1199,10 @@ fn build_default_edge_processor_block(
}

/// Resolve an `ExportTarget` to a concrete `endpoint:port` string. Phase
/// B uses documented placeholder hostnames (`gateway:4317`,
/// `backend:4317`) for symbolic stages — Phase C plumbs a real
/// `DeploymentConstraints::executors()` resolver.
/// B uses documented placeholder hostnames (`backend:4317` for the
/// edge→backend default; `gateway:4317` is reachable when a caller
/// explicitly opts in via `default_host`) for symbolic stages — Phase C
/// plumbs a real `DeploymentConstraints::executors()` resolver.
fn resolve_export_endpoint(default_host: &str, target: &ExportTarget) -> String {
match target {
ExportTarget::Endpoint(s) => s.clone(),
Expand Down Expand Up @@ -1505,11 +1511,11 @@ mod tests {
"edge processor config must not emit planning-only fields rejected by OTel configs\n{yaml}"
);

// Exporter — gateway.
// Exporter — asapquery-backend OTLP ingest.
assert!(yaml.contains("otlp/backend:"), "missing exporter\n{yaml}");
assert!(
yaml.contains("gateway:4317"),
"exporter should target gateway\n{yaml}"
yaml.contains("backend:4317"),
"exporter should target asapquery-backend\n{yaml}"
);

// OpAMP extension carries the controller endpoint.
Expand Down
12 changes: 6 additions & 6 deletions control_plane/src/emit/telegraf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,12 @@ pub fn emit_telegraf_toml(
for sp in &cfg.sketch_processors {
emit_processors_allsketches(&mut out, sp, cfg.window_secs);
}
let endpoint = resolve_export_endpoint("gateway", &cfg.exporter_target);
let endpoint = resolve_export_endpoint("backend", &cfg.exporter_target);
emit_outputs_opentelemetry(&mut out, &endpoint);
} else {
// Mode 2 — raw at edge. Passthrough; outputs.opentelemetry
// ships raw OTLP to the gateway.
let endpoint = resolve_export_endpoint("gateway", &cfg.exporter_target);
let endpoint = resolve_export_endpoint("backend", &cfg.exporter_target);
emit_outputs_opentelemetry(&mut out, &endpoint);
}

Expand Down Expand Up @@ -365,8 +365,8 @@ mod tests {
"missing output\n{toml}"
);
assert!(
toml.contains("service_address = \"gateway:4317\""),
"missing gateway endpoint\n{toml}"
toml.contains("service_address = \"backend:4317\""),
"missing backend endpoint\n{toml}"
);
// Sketch params preserved.
assert!(
Expand Down Expand Up @@ -397,8 +397,8 @@ mod tests {
"missing output\n{toml}"
);
assert!(
toml.contains("service_address = \"gateway:4317\""),
"missing gateway endpoint\n{toml}"
toml.contains("service_address = \"backend:4317\""),
"missing backend endpoint\n{toml}"
);
}

Expand Down
7 changes: 6 additions & 1 deletion control_plane/src/physical/colored_dag/emitter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -371,12 +371,17 @@ impl Emitter for ThreeStageEmitter {
}

// ── Edge config ────────────────────────────────────────────────
// Default exporter target is the asapquery-backend stage: the
// backend's precompute engine merges cross-agent sketches via
// its accumulators, so no middle-tier gateway processor sits in
// the default data path. Callers wanting a gateway in the path
// can re-write `exporter_target` post-emit.
let mut edge = EdgeStageConfig {
source_metric: None,
label_filters: Vec::new(),
window_secs: None,
sketch_processors: Vec::new(),
exporter_target: ExportTarget::Stage(StageId::Gateway),
exporter_target: ExportTarget::Stage(StageId::Backend),
prometheus_archive_metrics: Vec::new(),
archive_tier_metrics: Vec::new(),
warm_passthrough_metrics: Vec::new(),
Expand Down