use super::*;
pub(super) fn obs_export(args: &[String]) -> Result<(), String> {
let format = option_value(args, "--format").unwrap_or_else(|| "prometheus".to_string());
if format != "prometheus" && format != "otel" {
return Err(format!(
"unsupported --format value: {format} (expected prometheus|otel)"
));
}
let alert_template =
option_value(args, "--alert-template").unwrap_or_else(|| "none".to_string());
if alert_template != "none" && alert_template != "basic" {
return Err(format!(
"unsupported --alert-template value: {alert_template} (expected none|basic)"
));
}
let json = has_flag(args, "--json");
let (snapshot, source) = data_source::load_status_snapshot(args)?;
let aggregator = metrics::build_snapshot_aggregator(&snapshot);
let metrics_payload = if format == "prometheus" {
serde_json::Value::String(export_prometheus_text(&aggregator))
} else {
export_otel_json_value(&aggregator)
};
let template_payload = metrics::build_alert_template(&alert_template);
if json {
let payload = serde_json::json!({
"api_version": OBS_EXPORT_API_VERSION,
"kind": "obs_export",
"captured_at_unix_nanos": snapshot.captured_at_unix_nanos,
"source": source.json,
"query": {
"format": format,
"alert_template": alert_template,
},
"result": {
"metrics": metrics_payload,
"alert_template": template_payload,
}
});
println!(
"{}",
serde_json::to_string_pretty(&payload)
.map_err(|err| format!("serialize obs export payload failed: {err}"))?
);
} else {
println!("RobotRT Obs Export");
println!("source: {}", source.label);
println!("format: {}", format);
println!();
if format == "prometheus" {
println!(
"{}",
metrics_payload
.as_str()
.ok_or_else(|| String::from("unexpected prometheus payload type"))?
);
} else {
println!(
"{}",
serde_json::to_string_pretty(&metrics_payload)
.map_err(|err| format!("serialize otel payload failed: {err}"))?
);
}
if !template_payload.is_null() {
println!();
println!("alert_template:");
println!(
"{}",
template_payload
.as_str()
.ok_or_else(|| String::from("unexpected alert template payload type"))?
);
}
}
Ok(())
}