Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
15 changes: 15 additions & 0 deletions dev-tools/omdb/src/bin/omdb/nexus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ use nexus_types::internal_api::background::AuditLogTimeoutIncompleteStatus;
use nexus_types::internal_api::background::BlueprintPlannerStatus;
use nexus_types::internal_api::background::BlueprintPrunerStatus;
use nexus_types::internal_api::background::BlueprintRendezvousStatus;
use nexus_types::internal_api::background::CapacityMetricsStatus;
use nexus_types::internal_api::background::DatasetRendezvousOutcome;
use nexus_types::internal_api::background::DatasetRendezvousStats;
use nexus_types::internal_api::background::DatasetsRendezvousStats;
Expand Down Expand Up @@ -1341,6 +1342,9 @@ fn print_task_details(bgtask: &BackgroundTask, details: &serde_json::Value) {
"instance_watcher" => {
print_task_instance_watcher(details);
}
"capacity_metrics" => {
print_task_capacity_metrics(details);
}
"inventory_collection" => {
print_task_inventory_collection(details);
}
Expand Down Expand Up @@ -2232,6 +2236,17 @@ fn print_task_instance_updater(details: &serde_json::Value) {
println!(" {SAGA_ERRORS:<WIDTH$}{:>NUM_WIDTH$}", saga_errors.len());
}

fn print_task_capacity_metrics(details: &serde_json::Value) {
match serde_json::from_value::<CapacityMetricsStatus>(details.clone()) {
Err(error) => eprintln!(
"warning: failed to interpret task details: {error:?}: {details:?}",
),
Ok(status) => {
println!(" samples queued: {}", status.samples_queued);
}
}
}

fn print_task_instance_watcher(details: &serde_json::Value) {
#[derive(Deserialize)]
struct TaskSuccess {
Expand Down
12 changes: 12 additions & 0 deletions dev-tools/omdb/tests/env.out
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ task: "blueprint_rendezvous"
owned rendezvous tables that other subsystems consume


task: "capacity_metrics"
periodically emits quota capacity metrics


task: "crdb_node_id_collector"
Collects node IDs of running CockroachDB zones

Expand Down Expand Up @@ -344,6 +348,10 @@ task: "blueprint_rendezvous"
owned rendezvous tables that other subsystems consume


task: "capacity_metrics"
periodically emits quota capacity metrics


task: "crdb_node_id_collector"
Collects node IDs of running CockroachDB zones

Expand Down Expand Up @@ -607,6 +615,10 @@ task: "blueprint_rendezvous"
owned rendezvous tables that other subsystems consume


task: "capacity_metrics"
periodically emits quota capacity metrics


task: "crdb_node_id_collector"
Collects node IDs of running CockroachDB zones

Expand Down
16 changes: 16 additions & 0 deletions dev-tools/omdb/tests/successes.out
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,10 @@ task: "blueprint_rendezvous"
owned rendezvous tables that other subsystems consume


task: "capacity_metrics"
periodically emits quota capacity metrics


task: "crdb_node_id_collector"
Collects node IDs of running CockroachDB zones

Expand Down Expand Up @@ -780,6 +784,12 @@ task: "blueprint_rendezvous"
num_not_in_blueprint: 0
num_decommissioned_not_in_blueprint: 0

task: "capacity_metrics"
configured period: every <REDACTED_DURATION>m
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
samples queued: 0

task: "crdb_node_id_collector"
configured period: every <REDACTED_DURATION>m
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
Expand Down Expand Up @@ -1518,6 +1528,12 @@ task: "blueprint_rendezvous"
num_not_in_blueprint: 0
num_decommissioned_not_in_blueprint: 0

task: "capacity_metrics"
configured period: every <REDACTED_DURATION>m
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
samples queued: 0

task: "crdb_node_id_collector"
configured period: every <REDACTED_DURATION>m
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
Expand Down
15 changes: 15 additions & 0 deletions nexus-config/src/nexus_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,8 @@ pub struct BackgroundTaskConfig {
pub region_replacement_driver: RegionReplacementDriverConfig,
/// configuration for instance watcher task
pub instance_watcher: InstanceWatcherConfig,
/// configuration for capacity metrics task
pub capacity_metrics: CapacityMetricsConfig,
/// configuration for instance updater task
pub instance_updater: InstanceUpdaterConfig,
/// configuration for instance reincarnation task
Expand Down Expand Up @@ -767,6 +769,14 @@ pub struct InstanceWatcherConfig {
pub period_secs: Duration,
}

#[serde_as]
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct CapacityMetricsConfig {
/// period (in seconds) for periodic activations of this background task
#[serde_as(as = "DurationSeconds<u64>")]
pub period_secs: Duration,
}

#[serde_as]
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct InstanceUpdaterConfig {
Expand Down Expand Up @@ -1381,6 +1391,7 @@ mod test {
region_replacement.period_secs = 30
region_replacement_driver.period_secs = 30
instance_watcher.period_secs = 30
capacity_metrics.period_secs = 60
instance_updater.period_secs = 30
instance_updater.disable = false
instance_reincarnation.period_secs = 67
Expand Down Expand Up @@ -1609,6 +1620,9 @@ mod test {
instance_watcher: InstanceWatcherConfig {
period_secs: Duration::from_secs(30),
},
capacity_metrics: CapacityMetricsConfig {
period_secs: Duration::from_secs(60),
},
instance_updater: InstanceUpdaterConfig {
period_secs: Duration::from_secs(30),
disable: false,
Expand Down Expand Up @@ -1798,6 +1812,7 @@ mod test {
region_replacement.period_secs = 30
region_replacement_driver.period_secs = 30
instance_watcher.period_secs = 30
capacity_metrics.period_secs = 60
instance_updater.period_secs = 30
instance_reincarnation.period_secs = 67
service_firewall_propagation.period_secs = 300
Expand Down
1 change: 1 addition & 0 deletions nexus/background-task-interface/src/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ pub struct BackgroundTasks {
pub task_region_replacement: Activator,
pub task_region_replacement_driver: Activator,
pub task_instance_watcher: Activator,
pub task_capacity_metrics: Activator,
pub task_instance_updater: Activator,
pub task_instance_reincarnation: Activator,
pub task_service_firewall_propagation: Activator,
Expand Down
1 change: 1 addition & 0 deletions nexus/examples/config-second.toml
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ region_replacement.period_secs = 30
region_replacement_driver.period_secs = 30
# How frequently to query the status of active instances.
instance_watcher.period_secs = 30
capacity_metrics.period_secs = 60
# How frequently to schedule new instance update sagas.
instance_updater.period_secs = 30
# How frequently to attempt to restart Failed instances?
Expand Down
1 change: 1 addition & 0 deletions nexus/examples/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ region_replacement.period_secs = 30
region_replacement_driver.period_secs = 30
# How frequently to query the status of active instances.
instance_watcher.period_secs = 30
capacity_metrics.period_secs = 60
# How frequently to schedule new instance update sagas.
instance_updater.period_secs = 30
# How frequently to attempt to restart Failed instances?
Expand Down
20 changes: 20 additions & 0 deletions nexus/src/app/background/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ use super::tasks::blueprint_load::LoadedTargetBlueprint;
use super::tasks::blueprint_planner;
use super::tasks::blueprint_pruner;
use super::tasks::blueprint_rendezvous;
use super::tasks::capacity_metrics;
use super::tasks::crdb_node_id_collector;
use super::tasks::decommissioned_disk_cleaner;
use super::tasks::dns_config;
Expand Down Expand Up @@ -250,6 +251,7 @@ impl BackgroundTasksInitializer {
task_region_replacement: Activator::new(),
task_region_replacement_driver: Activator::new(),
task_instance_watcher: Activator::new(),
task_capacity_metrics: Activator::new(),
task_instance_updater: Activator::new(),
task_instance_reincarnation: Activator::new(),
task_service_firewall_propagation: Activator::new(),
Expand Down Expand Up @@ -350,6 +352,7 @@ impl BackgroundTasksInitializer {
task_region_replacement_driver,
task_instance_watcher,
task_instance_updater,
task_capacity_metrics,
task_instance_reincarnation,
task_service_firewall_propagation,
task_abandoned_vmm_reaper,
Expand Down Expand Up @@ -808,6 +811,23 @@ impl BackgroundTasksInitializer {
})
};

{
let capacity_metrics = capacity_metrics::CapacityMetrics::new(
datastore.clone(),
producer_registry,
nexus_id,
);
driver.register(TaskDefinition {
name: "capacity_metrics",
description: "periodically emits quota capacity metrics",
period: config.capacity_metrics.period_secs,
task_impl: Box::new(capacity_metrics),
opctx: opctx.child(BTreeMap::new()),
watchers: vec![],
activator: task_capacity_metrics,
});
}

// Background task: schedule update sagas for instances in need of
// state updates.
{
Expand Down
Loading
Loading