2 Commits

Author SHA1 Message Date
  github-actions[bot] b00b4adee5
chore: Update Cargo.lock (#1263) 8 hours ago
  Pratyksh Gupta 3b49a44d1e
feat: implement dora node list command with metrics and filtering (#1202) (#1262) 9 hours ago
4 changed files with 280 additions and 70 deletions
Split View
  1. +70
    -70
      Cargo.lock
  2. +5
    -0
      binaries/cli/src/command/mod.rs
  3. +186
    -0
      binaries/cli/src/command/node/list.rs
  4. +19
    -0
      binaries/cli/src/command/node/mod.rs

+ 70
- 70
Cargo.lock View File

@@ -1135,9 +1135,9 @@ dependencies = [

[[package]]
name = "cxx"
version = "1.0.190"
version = "1.0.192"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7620f6cfc4dcca21f2b085b7a890e16c60fd66f560cd69ee60594908dc72ab1"
checksum = "bbda285ba6e5866529faf76352bdf73801d9b44a6308d7cd58ca2379f378e994"
dependencies = [
"cc",
"cxx-build",
@@ -1150,9 +1150,9 @@ dependencies = [

[[package]]
name = "cxx-build"
version = "1.0.190"
version = "1.0.192"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a9bc1a22964ff6a355fbec24cf68266a0ed28f8b84c0864c386474ea3d0e479"
checksum = "af9efde466c5d532d57efd92f861da3bdb7f61e369128ce8b4c3fe0c9de4fa4d"
dependencies = [
"cc",
"codespan-reporting",
@@ -1165,9 +1165,9 @@ dependencies = [

[[package]]
name = "cxxbridge-cmd"
version = "1.0.190"
version = "1.0.192"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1f29a879d35f7906e3c9b77d7a1005a6a0787d330c09dfe4ffb5f617728cb44"
checksum = "3efb93799095bccd4f763ca07997dc39a69e5e61ab52d2c407d4988d21ce144d"
dependencies = [
"clap",
"codespan-reporting",
@@ -1179,15 +1179,15 @@ dependencies = [

[[package]]
name = "cxxbridge-flags"
version = "1.0.190"
version = "1.0.192"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d67109015f93f683e364085aa6489a5b2118b4a40058482101d699936a7836d6"
checksum = "3092010228026e143b32a4463ed9fa8f86dca266af4bf5f3b2a26e113dbe4e45"

[[package]]
name = "cxxbridge-macro"
version = "1.0.190"
version = "1.0.192"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d187e019e7b05a1f3e69a8396b70800ee867aa9fc2ab972761173ccee03742df"
checksum = "31d72ebfcd351ae404fb00ff378dfc9571827a00722c9e735c9181aec320ba0a"
dependencies = [
"indexmap 2.12.1",
"proc-macro2",
@@ -2823,9 +2823,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"

[[package]]
name = "icu_properties"
version = "2.1.1"
version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99"
checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
dependencies = [
"icu_collections",
"icu_locale_core",
@@ -2837,9 +2837,9 @@ dependencies = [

[[package]]
name = "icu_properties_data"
version = "2.1.1"
version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899"
checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"

[[package]]
name = "icu_provider"
@@ -3445,9 +3445,9 @@ checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"

[[package]]
name = "local-ip-address"
version = "0.6.6"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "786c72d9739fc316a7acf9b22d9c2794ac9cb91074e9668feb04304ab7219783"
checksum = "0a60bf300a990b2d1ebdde4228e873e8e4da40d834adbf5265f3da1457ede652"
dependencies = [
"libc",
"neli",
@@ -5044,9 +5044,9 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"

[[package]]
name = "reqwest"
version = "0.12.25"
version = "0.12.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6eff9328d40131d43bd911d42d79eb6a47312002a4daefc9e37f17e74a7701a"
checksum = "3b4c14b2d9afca6a60277086b0cc6a6ae0b568f6f7916c943a8cdc79f8be240f"
dependencies = [
"base64",
"bytes",
@@ -7850,9 +7850,9 @@ dependencies = [

[[package]]
name = "zenoh"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4b42226900dbc62cdf26d564ee11aa970a2a24172fe253e939027105ae5809a"
checksum = "4e2df46d36ba8d173f18e9cce5011117fed81a90a22bc3cfe8bbcfaf66b54114"
dependencies = [
"ahash",
"arc-swap",
@@ -7902,18 +7902,18 @@ dependencies = [

[[package]]
name = "zenoh-buffers"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c0ab7597651b56117f94071f0b28b2df2d18fb384a830bc2633ca4da5b38b79"
checksum = "82d610eaa2099c16844b092c2b16605d115f354e332eb1d37e9af46e5430ecac"
dependencies = [
"zenoh-collections",
]

[[package]]
name = "zenoh-codec"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e9b04660396614bc0e6c7d85eb42814b23a15df377a61c60315d87d678161ff4"
checksum = "7f1cff28c30bca3d07e7b84f71f1c9b81d505449f6fec36a023cc8b601c01150"
dependencies = [
"tracing",
"uhlc 0.8.2",
@@ -7923,18 +7923,18 @@ dependencies = [

[[package]]
name = "zenoh-collections"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ea0a1a811bd974ee7342a293ddb439a7a470ff86d5ea67526c27b38856100e8"
checksum = "a72cac7d4bbe99e41ef46c175e0dd2933e883b17cef3e60151e4461b5a088ad3"
dependencies = [
"ahash",
]

[[package]]
name = "zenoh-config"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6825f58216df854f7b691c13c00c862ce13f14edb6b7bc95e98b3a5529f4ae27"
checksum = "df65e4ab337079d897aaaa6d01474b4f8683daaa05a8671b18db34e71a872af7"
dependencies = [
"json5",
"nonempty-collections",
@@ -7957,9 +7957,9 @@ dependencies = [

[[package]]
name = "zenoh-core"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5b5ba84fb13e090a2aef2908b8c9d2233bc9a94c06683ed46e48e45035a209d"
checksum = "869deb22305e8f7a6aa324142ab6717f0cc979be8e4a2de646e8f31313224a1c"
dependencies = [
"lazy_static",
"tokio",
@@ -7969,9 +7969,9 @@ dependencies = [

[[package]]
name = "zenoh-crypto"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56da7bfe3a459198ee951abd0d8fef7c5dd42ea8336eccbc00e78981a0a185d0"
checksum = "7f5b09559108c9e11128730d5a6f551dbcc226adfd82423439ad7eeed024c736"
dependencies = [
"aes",
"hmac",
@@ -7983,9 +7983,9 @@ dependencies = [

[[package]]
name = "zenoh-keyexpr"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6239d9dbcb3abc5674da556cbcbaa92d98455214c1f8ba5644464e9db28b1cf6"
checksum = "b8b754ea6460c4c3c5dd67e6a8c62bfc076c16f8b794898fb3ea6f0039a5939e"
dependencies = [
"getrandom 0.2.16",
"hashbrown 0.16.1",
@@ -7999,9 +7999,9 @@ dependencies = [

[[package]]
name = "zenoh-link"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "533234339599e3220ba2dc447137cb5b9e48ea2edac5c594f9672f189de1c470"
checksum = "0d0c04d554b67600967cb520061ef9f635caf7704978357334e66cd7179a204a"
dependencies = [
"zenoh-config",
"zenoh-link-commons",
@@ -8018,9 +8018,9 @@ dependencies = [

[[package]]
name = "zenoh-link-commons"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7862bed0c25fa8d324ec1f20e6e1094d65084009e85099ed99529ff0dc165ffa"
checksum = "52d1c652a706da1da46eae54a65c4b658153cdebfa213f061beea3bef71088f2"
dependencies = [
"async-trait",
"base64",
@@ -8052,9 +8052,9 @@ dependencies = [

[[package]]
name = "zenoh-link-quic"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b6dcdcf369828780b2e6cf3a3e060939a7e81ceb784d19af0f4b1e145e8d89d"
checksum = "0069d889388d06e56eb86139021a1af12b9846222847aeabaa05eb92fc2ee108"
dependencies = [
"async-trait",
"base64",
@@ -8078,9 +8078,9 @@ dependencies = [

[[package]]
name = "zenoh-link-quic_datagram"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d7e5dd3dd05052e3604686d71c5fae7edf5b4dd833c079d206d419aa6134102"
checksum = "dc81e512b51cf9b6ab479ba11be70e7a4ce072c0e985271e09c88e4bbff591b3"
dependencies = [
"async-trait",
"quinn",
@@ -8099,9 +8099,9 @@ dependencies = [

[[package]]
name = "zenoh-link-tcp"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a87ce7454c2548840a09a861cd5dd82a1a09e2b309d871f46e0df96b22ce9e6d"
checksum = "279ff42ab4a65508069596045ab8a3c6fb03f94343c290a9b75f9568c49094e4"
dependencies = [
"async-trait",
"socket2 0.5.10",
@@ -8117,9 +8117,9 @@ dependencies = [

[[package]]
name = "zenoh-link-tls"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fb179240c398c274081fe477a449b88a942dd468d01cc2c3d72b9db164e2983"
checksum = "d3172615126b64456beb0c537351eb9c715f20f641e37ae8f84cb209816d205a"
dependencies = [
"async-trait",
"base64",
@@ -8147,9 +8147,9 @@ dependencies = [

[[package]]
name = "zenoh-link-udp"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "048b490aa5e2089d961ded780ef4b8620bc554e96137694bce99e4b3711e7537"
checksum = "11006545a887167d431e8c3f2867ad386e7d678ee8babd3df4a7537b168e47de"
dependencies = [
"async-trait",
"libc",
@@ -8169,9 +8169,9 @@ dependencies = [

[[package]]
name = "zenoh-link-unixsock_stream"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d26fb1bbf940fa2aa89b25c552e07937330e3a485c78755cb435fb9168914a5b"
checksum = "ab57f1a899f869dea28168d6ab46a820b0d94e025e1db8cf8e686fc08b4f5de3"
dependencies = [
"async-trait",
"nix 0.29.0",
@@ -8188,9 +8188,9 @@ dependencies = [

[[package]]
name = "zenoh-link-ws"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a987b9bdbb1dab36caf4218aa0de475a1222a00ca3ed15c582eb0d2b7bc14d9e"
checksum = "41c398aaee46ce19ca01c709ea38985da7da6b4ffb803c6b5c07a56e8a31f8b4"
dependencies = [
"async-trait",
"futures-util",
@@ -8209,9 +8209,9 @@ dependencies = [

[[package]]
name = "zenoh-macros"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3be309128c36330b4d088bb274aaff2948330948d4c370e65c3e8fa8190963d4"
checksum = "21df1681ca014a4bd69db91d356bcf699d346f854ff8a6b73123cee75f5073cd"
dependencies = [
"proc-macro2",
"quote",
@@ -8221,9 +8221,9 @@ dependencies = [

[[package]]
name = "zenoh-plugin-trait"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "751d42236e5e72d399a2aba9014f529a0352caff20cd8ab869b312a542452636"
checksum = "4651bc51951eb004e71bba71583f9ea60240bdd11351b61dbd6956e906088567"
dependencies = [
"git-version",
"libloading 0.8.9",
@@ -8239,9 +8239,9 @@ dependencies = [

[[package]]
name = "zenoh-protocol"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4aa16a814d9b8f27002ea71482f541061b24d9f0053533c79f9eb993958a46"
checksum = "ab17d39b24f6fbd0a24e03a5ab96c236d3d5ebb5071978338c9bc3fe1ccff626"
dependencies = [
"const_format",
"rand 0.8.5",
@@ -8254,18 +8254,18 @@ dependencies = [

[[package]]
name = "zenoh-result"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c2d06af782e7ec6cd07957c0e967800351745ba263e3ca41d50d28ece1a94e8"
checksum = "1b7d23a2f69c4b96ae95ac2f80808cce5f2ed9697ba37e769a75428fb6806a57"
dependencies = [
"anyhow",
]

[[package]]
name = "zenoh-runtime"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd6856b920aa5ddd5f897362ef30a2db9a0757c2004e097c3be42d5aa3e7f613"
checksum = "a71f356bb63c1c9d37cb4bc89112e83a9fd6079458d1440232d67ca41a52c687"
dependencies = [
"lazy_static",
"ron",
@@ -8278,9 +8278,9 @@ dependencies = [

[[package]]
name = "zenoh-sync"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cad6b934521e9b5d0c7a3582713171e33a2576248add22c82526b988235f52ba"
checksum = "e3b1113111e247d6b1ebd5d406b43e23e78faca2c7525dca22a2a075c64787bd"
dependencies = [
"arc-swap",
"event-listener",
@@ -8293,9 +8293,9 @@ dependencies = [

[[package]]
name = "zenoh-task"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7e66aea4735b0db40428ef135ec2e2b6d333729bb4bccdd40cd66d82dec9228"
checksum = "7a1f690f81704b1e934b9fb7a63ce544af73521ca9d11b5a439cdfc74108dd28"
dependencies = [
"futures",
"tokio",
@@ -8307,9 +8307,9 @@ dependencies = [

[[package]]
name = "zenoh-transport"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac6bb74187cfb4fcea3b81ed2982cb4d3a36edf75e5cb9f205719a8c78d9a1f0"
checksum = "41cdc4dcb4a68161afe25e44871a66a5c3c347d86a77628ab101d859a9518db9"
dependencies = [
"async-trait",
"crossbeam-utils",
@@ -8341,9 +8341,9 @@ dependencies = [

[[package]]
name = "zenoh-util"
version = "1.7.0"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b97f2c3f4213ad97fd132a1fad73ab254c697e70bb833f46e7f173f408bd730"
checksum = "ea9b52e8beceffc0deca01e10ca726c604286a1ac475f95acdd87ee55f18b120"
dependencies = [
"async-trait",
"const_format",


+ 5
- 0
binaries/cli/src/command/mod.rs View File

@@ -9,6 +9,7 @@ mod inspect;
mod list;
mod logs;
mod new;
mod node;
mod run;
mod runtime;
mod self_;
@@ -32,6 +33,7 @@ use inspect::Inspect;
use list::ListArgs;
use logs::LogsArgs;
use new::NewArgs;
use node::Node;
use run::Run;
use runtime::Runtime;
use self_::SelfSubCommand;
@@ -69,6 +71,8 @@ pub enum Command {
Coordinator(Coordinator),
#[clap(subcommand)]
Topic(Topic),
#[clap(subcommand)]
Node(Node),

Completion(Completion),
Self_ {
@@ -114,6 +118,7 @@ impl Executable for Command {
Command::Self_ { command } => command.execute(),
Command::Runtime(args) => args.execute(),
Command::Topic(args) => args.execute(),
Command::Node(args) => args.execute(),
Command::Completion(args) => args.execute(),
}
}


+ 186
- 0
binaries/cli/src/command/node/list.rs View File

@@ -0,0 +1,186 @@
use std::io::Write;

use clap::Args;
use serde::Serialize;
use tabwriter::TabWriter;
use uuid::Uuid;

use crate::{
command::{Executable, default_tracing},
common::CoordinatorOptions,
formatting::OutputFormat,
};
use communication_layer_request_reply::TcpRequestReplyConnection;
use dora_message::{
cli_to_coordinator::ControlRequest,
coordinator_to_cli::{ControlRequestReply, NodeInfo},
};
use eyre::{Context, bail};

/// List all currently running nodes and their status.
///
/// Examples:
///
/// List all nodes:
/// dora node list
///
/// List nodes in a specific dataflow:
/// dora node list --dataflow my-dataflow
///
/// List nodes as JSON:
/// dora node list --format json
#[derive(Debug, Args)]
#[clap(verbatim_doc_comment)]
pub struct List {
/// Filter by dataflow name or UUID
#[clap(long, short = 'd', value_name = "NAME_OR_UUID")]
pub dataflow: Option<String>,

/// Output format
#[clap(long, value_name = "FORMAT", default_value_t = OutputFormat::Table)]
pub format: OutputFormat,

#[clap(flatten)]
coordinator: CoordinatorOptions,
}

impl Executable for List {
fn execute(self) -> eyre::Result<()> {
default_tracing()?;

let mut session = self.coordinator.connect()?;
list(session.as_mut(), self.dataflow, self.format)
}
}

#[derive(Serialize)]
struct OutputEntry {
node: String,
status: String,
pid: String,
cpu: String,
memory: String,
#[serde(skip_serializing_if = "Option::is_none")]
dataflow: Option<String>,
}

fn list(
session: &mut TcpRequestReplyConnection,
dataflow_filter: Option<String>,
format: OutputFormat,
) -> eyre::Result<()> {
// Request node information from coordinator
let reply_raw = session
.request(&serde_json::to_vec(&ControlRequest::GetNodeInfo).unwrap())
.wrap_err("failed to send GetNodeInfo request")?;

let reply: ControlRequestReply =
serde_json::from_slice(&reply_raw).wrap_err("failed to parse reply")?;

let node_infos = match reply {
ControlRequestReply::NodeInfoList(infos) => infos,
ControlRequestReply::Error(err) => bail!("{err}"),
other => bail!("unexpected reply: {other:?}"),
};

// Filter by dataflow if specified
let filtered_nodes: Vec<NodeInfo> = if let Some(ref filter) = dataflow_filter {
// Try to parse as UUID first
let filter_uuid = Uuid::parse_str(filter).ok();

node_infos
.into_iter()
.filter(|node| {
// Match by UUID or name
if let Some(uuid) = filter_uuid {
node.dataflow_id == uuid
} else {
node.dataflow_name.as_deref() == Some(filter)
}
})
.collect()
} else {
node_infos
};

// Convert to output entries
let entries: Vec<OutputEntry> = filtered_nodes
.into_iter()
.map(|node| {
let (status, pid, cpu, memory) = if let Some(metrics) = node.metrics {
(
"Running".to_string(),
metrics.pid.to_string(),
format!("{:.1}%", metrics.cpu_usage),
format!("{:.0} MB", metrics.memory_mb),
)
} else {
// Node exists but no metrics available (might be starting or error state)
(
"Unknown".to_string(),
"-".to_string(),
"-".to_string(),
"-".to_string(),
)
};

OutputEntry {
node: node.node_id.to_string(),
status,
pid,
cpu,
memory,
dataflow: if dataflow_filter.is_none() {
Some(
node.dataflow_name
.unwrap_or_else(|| node.dataflow_id.to_string()),
)
} else {
None
},
}
})
.collect();

match format {
OutputFormat::Table => {
let mut tw = TabWriter::new(std::io::stdout().lock());

// Write header
if dataflow_filter.is_none() {
tw.write_all(b"NODE\tSTATUS\tPID\tCPU\tMEMORY\tDATAFLOW\n")?;
} else {
tw.write_all(b"NODE\tSTATUS\tPID\tCPU\tMEMORY\n")?;
}

// Write entries
for entry in entries {
if let Some(ref dataflow) = entry.dataflow {
tw.write_all(
format!(
"{}\t{}\t{}\t{}\t{}\t{}\n",
entry.node, entry.status, entry.pid, entry.cpu, entry.memory, dataflow
)
.as_bytes(),
)?;
} else {
tw.write_all(
format!(
"{}\t{}\t{}\t{}\t{}\n",
entry.node, entry.status, entry.pid, entry.cpu, entry.memory
)
.as_bytes(),
)?;
}
}
tw.flush()?;
}
OutputFormat::Json => {
for entry in entries {
println!("{}", serde_json::to_string(&entry)?);
}
}
}

Ok(())
}

+ 19
- 0
binaries/cli/src/command/node/mod.rs View File

@@ -0,0 +1,19 @@
use crate::command::Executable;

mod list;

pub use list::List;

/// Manage and inspect dataflow nodes.
#[derive(Debug, clap::Subcommand)]
pub enum Node {
List(List),
}

impl Executable for Node {
fn execute(self) -> eyre::Result<()> {
match self {
Node::List(cmd) => cmd.execute(),
}
}
}

Loading…
Cancel
Save
Baidu
map