aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHazel Atkinson <yellowsink@riseup.net>2025-04-04 16:21:49 +0100
committerHazel Atkinson <yellowsink@riseup.net>2025-04-04 16:21:49 +0100
commit01e8739edec3979a32c94df3eced77b04db83c26 (patch)
tree707956822a8fcef50de34c6c99f8437418e96b47
parent9b56e89c21b2348d1381bc2d48a11eaf563dfa75 (diff)
downloadcontainerspy-01e8739edec3979a32c94df3eced77b04db83c26.tar.gz
containerspy-01e8739edec3979a32c94df3eced77b04db83c26.tar.bz2
containerspy-01e8739edec3979a32c94df3eced77b04db83c26.zip
docker event loop
-rw-r--r--Cargo.lock11
-rw-r--r--Cargo.toml3
-rw-r--r--README.md8
-rw-r--r--prometheus.yml0
-rw-r--r--src/main.rs34
5 files changed, 43 insertions, 13 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 0c537ed..d298384 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -215,6 +215,7 @@ dependencies = [
"opentelemetry-otlp",
"opentelemetry_sdk",
"tokio",
+ "tokio-util",
]
[[package]]
@@ -1326,6 +1327,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
+name = "signal-hook-registry"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
name = "slab"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1459,6 +1469,7 @@ dependencies = [
"libc",
"mio",
"pin-project-lite",
+ "signal-hook-registry",
"socket2",
"tokio-macros",
"windows-sys",
diff --git a/Cargo.toml b/Cargo.toml
index 4779392..bb06a9a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,4 +10,5 @@ confique = { version = "0.3.0", features = ["json5"] }
opentelemetry = { version = "0.29.1", features = ["metrics"] }
opentelemetry-otlp = { version = "0.29.0", features = ["grpc-tonic"] }
opentelemetry_sdk = { version = "0.29.0", features = ["metrics"] }
-tokio = { version = "1.44.1", features = ["macros"] }
+tokio = { version = "1.44.1", features = ["macros", "signal"] }
+tokio-util = "0.7.14"
diff --git a/README.md b/README.md
index 75099b0..a2e8f39 100644
--- a/README.md
+++ b/README.md
@@ -48,3 +48,11 @@ You can set configuration in the config file specified in the `CSPY_CONFIG` env
If a docker socket path is not set, containerspy will try to connect to
`/var/run/docker.sock` or `//./pipe/docker_engine` depending on host OS.
+
+## Supported metrics
+
+This is intended to be a dropin replacement for cAdvisor, which lists its supported metrics
+[here](https://github.com/google/cadvisor/blob/master/docs/storage/prometheus.md).
+
+The list of ContainerSpy's currently supported items from this list is:
+ - `container_cpu_usage_seconds_total`
diff --git a/prometheus.yml b/prometheus.yml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/prometheus.yml
diff --git a/src/main.rs b/src/main.rs
index 3e1b75c..9763138 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -5,13 +5,14 @@ use bollard::Docker;
use config::CONFIG;
use opentelemetry::{metrics::MeterProvider, KeyValue};
use opentelemetry_otlp::{MetricExporter, Protocol, WithExportConfig};
-use opentelemetry_sdk::{metrics::SdkMeterProvider, Resource};
+use opentelemetry_sdk::{metrics::SdkMeterProvider, resource::{ResourceDetector, SdkProvidedResourceDetector}, Resource};
+use tokio_util::sync::CancellationToken;
mod config;
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<()> {
- /* // open a docker connection
+ // open a docker connection
let docker =
if let Some(path) = &CONFIG.docker_socket {
Docker::connect_with_socket(path, 60, bollard::API_DEFAULT_VERSION)?
@@ -22,7 +23,7 @@ async fn main() -> Result<()> {
let info = docker.info().await?;
- println!("Connected to Docker Daemon version {:?}", info.server_version); */
+ println!("Connected to Docker Daemon version {:?}", info.server_version);
// connect the OTLP exporter
let metric_exporter =
@@ -53,21 +54,30 @@ async fn main() -> Result<()> {
},
};
- //let test_resource = Resource::builder().with_service_name("containerspy").build();
-
let meter_provider = SdkMeterProvider::builder()
- //.with_resource(test_resource)
- //.with_periodic_exporter(opentelemetry_stdout::MetricExporter::default())
.with_periodic_exporter(metric_exporter)
.build();
- let m = meter_provider
- .meter("test_meter")
- .u64_gauge("testing_gauge")
- .build();
+ // fetch-report loop with graceful shutdown
+ let shutdown_token = CancellationToken::new();
+ let st2 = shutdown_token.clone(); // to be moved into the task
+
+ tokio::spawn(async move {
+ tokio::signal::ctrl_c().await.expect("Failed to setup ctrl-c handler");
+ st2.cancel();
+ });
- m.record(10, &[KeyValue::new("label", 4)]);
+ let mut interval = tokio::time::interval(Duration::from_secs(1));
+
+ loop {
+ tokio::select! {
+ _ = interval.tick() => {}
+ _ = shutdown_token.cancelled() => { break }
+ }
+ let list_res = docker.list_containers::<String>(None).await?;
+ println!("{list_res:?}");
+ }
Ok(())
}