mod render;
use icydb::wire::Endpoint;
use crate::{
cli::{CanisterTarget, MetricsArgs},
icp::require_created_canister,
observability::{call_query, call_update, decode_endpoint_result},
};
pub(super) fn run_metrics_command(args: MetricsArgs) -> Result<(), String> {
let target = args.target();
require_created_canister(target.environment(), target.canister_name())?;
if args.reset() {
return run_metrics_reset(target);
}
let wire_bytes = call_query(
target.environment(),
target.canister_name(),
Endpoint::Metrics.name(),
(),
)?;
let report = decode_endpoint_result::<icydb::metrics::MetricsReport>(
&wire_bytes,
"metrics",
target.environment(),
target.canister_name(),
Endpoint::Metrics.name(),
)?;
print!("{}", render_metrics_report(&report));
Ok(())
}
fn run_metrics_reset(target: &CanisterTarget) -> Result<(), String> {
let wire_bytes = call_update(
target.environment(),
target.canister_name(),
Endpoint::MetricsReset.name(),
(),
)?;
decode_endpoint_result::<()>(
&wire_bytes,
"metrics reset",
target.environment(),
target.canister_name(),
Endpoint::MetricsReset.name(),
)?;
println!(
"Reset metrics on canister '{}' in environment '{}'.",
target.canister_name(),
target.environment(),
);
Ok(())
}
pub(super) fn render_metrics_report(report: &icydb::metrics::MetricsReport) -> String {
render::render_metrics_report(report)
}