diff options
| -rw-r--r-- | Cargo.lock | 11 | ||||
| -rw-r--r-- | Cargo.toml | 3 | ||||
| -rw-r--r-- | README.md | 8 | ||||
| -rw-r--r-- | prometheus.yml | 0 | ||||
| -rw-r--r-- | src/main.rs | 34 |
5 files changed, 43 insertions, 13 deletions
@@ -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", @@ -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" @@ -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(()) } |
