From 91ab03f202568746a392c9c4e583cb71a23043ec Mon Sep 17 00:00:00 2001 From: clux Date: Mon, 6 Mar 2023 06:57:36 +0000 Subject: [PATCH 1/4] Failing tests for #44 Signed-off-by: clux --- .github/workflows/ci.yml | 2 ++ src/telemetry.rs | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 129ffea..26f1075 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -224,6 +224,8 @@ jobs: run: cargo build - name: Run workspace unit tests run: cargo test + - name: Run full feature unit tests + run: cargo test --lib --all-features - name: Generate crd.yaml run: cargo run --bin crdgen > yaml/crd.yaml - name: Generate deployment.yaml diff --git a/src/telemetry.rs b/src/telemetry.rs index b8e32b6..8305f52 100644 --- a/src/telemetry.rs +++ b/src/telemetry.rs @@ -35,3 +35,16 @@ pub async fn init_tracer() -> opentelemetry::sdk::trace::Tracer { .install_batch(opentelemetry::runtime::Tokio) .unwrap() } + +#[cfg(test)] +mod test { + use super::*; + + #[cfg(feature = "telemetry")] + #[test] + fn get_trace_id_returns_valid_traces() { + let id = get_trace_id().to_bytes(); + dbg!(id); + assert!(id.iter().any(|digit| *digit != 0), "valid trace"); + } +} From 224baa83d7c69b89353389925d22f350f486c35f Mon Sep 17 00:00:00 2001 From: clux Date: Mon, 6 Mar 2023 07:38:09 +0000 Subject: [PATCH 2/4] working tests (but requires otel running) Signed-off-by: clux --- .github/workflows/ci.yml | 2 -- justfile | 3 +++ src/main.rs | 21 ++------------------ src/telemetry.rs | 43 ++++++++++++++++++++++++++++++++-------- 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 26f1075..129ffea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -224,8 +224,6 @@ jobs: run: cargo build - name: Run workspace unit tests run: cargo test - - name: Run full feature unit tests - run: cargo test --lib --all-features - name: Generate crd.yaml run: cargo run --bin crdgen > yaml/crd.yaml - name: Generate deployment.yaml diff --git a/justfile b/justfile index 668f0d0..2c334da 100644 --- a/justfile +++ b/justfile @@ -33,6 +33,9 @@ test-unit: # run integration tests test-integration: install-crd cargo test -- --ignored +# run telemetry tests +test-telemetry: + OPENTELEMETRY_ENDPOINT_URL=https://0.0.0.0:55680 cargo test --lib --all-features -- --ignored # compile for musl (for docker image) compile features="": diff --git a/src/main.rs b/src/main.rs index 00743de..dd64f5c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,7 @@ #![allow(unused_imports, unused_variables)] use actix_web::{get, middleware, web::Data, App, HttpRequest, HttpResponse, HttpServer, Responder}; -pub use controller::{self, Result, State}; +pub use controller::{self, telemetry, Result, State}; use prometheus::{Encoder, TextEncoder}; -use tracing::{debug, error, info, trace, warn}; -use tracing_subscriber::{prelude::*, EnvFilter, Registry}; #[get("/metrics")] async fn metrics(c: Data, _req: HttpRequest) -> impl Responder { @@ -27,22 +25,7 @@ async fn index(c: Data, _req: HttpRequest) -> impl Responder { #[tokio::main] async fn main() -> Result<()> { - // Setup tracing layers - #[cfg(feature = "telemetry")] - let telemetry = tracing_opentelemetry::layer().with_tracer(controller::telemetry::init_tracer().await); - let logger = tracing_subscriber::fmt::layer(); - let env_filter = EnvFilter::try_from_default_env() - .or_else(|_| EnvFilter::try_new("info")) - .unwrap(); - - // Decide on layers - #[cfg(feature = "telemetry")] - let collector = Registry::default().with(telemetry).with(logger).with(env_filter); - #[cfg(not(feature = "telemetry"))] - let collector = Registry::default().with(logger).with(env_filter); - - // Initialize tracing - tracing::subscriber::set_global_default(collector).unwrap(); + telemetry::init().await; // Initiatilize Kubernetes controller state let state = State::default(); diff --git a/src/telemetry.rs b/src/telemetry.rs index 8305f52..d990c57 100644 --- a/src/telemetry.rs +++ b/src/telemetry.rs @@ -1,4 +1,5 @@ use opentelemetry::trace::TraceId; +use tracing_subscriber::{prelude::*, EnvFilter, Registry}; /// Fetch an opentelemetry::trace::TraceId as hex through the full tracing stack pub fn get_trace_id() -> TraceId { @@ -13,7 +14,7 @@ pub fn get_trace_id() -> TraceId { } #[cfg(feature = "telemetry")] -pub async fn init_tracer() -> opentelemetry::sdk::trace::Tracer { +async fn init_tracer() -> opentelemetry::sdk::trace::Tracer { let otlp_endpoint = std::env::var("OPENTELEMETRY_ENDPOINT_URL").expect("Need a otel tracing collector configured"); @@ -36,15 +37,41 @@ pub async fn init_tracer() -> opentelemetry::sdk::trace::Tracer { .unwrap() } +/// Initialize tracing +pub async fn init() { + // Setup tracing layers + #[cfg(feature = "telemetry")] + let telemetry = tracing_opentelemetry::layer().with_tracer(init_tracer().await); + let logger = tracing_subscriber::fmt::layer(); + let env_filter = EnvFilter::try_from_default_env() + .or_else(|_| EnvFilter::try_new("info")) + .unwrap(); + + // Decide on layers + #[cfg(feature = "telemetry")] + let collector = Registry::default().with(telemetry).with(logger).with(env_filter); + #[cfg(not(feature = "telemetry"))] + let collector = Registry::default().with(logger).with(env_filter); + + // Initialize tracing + tracing::subscriber::set_global_default(collector).unwrap(); +} + #[cfg(test)] mod test { - use super::*; - + // This test only works when telemetry is initialized fully + // and requires OPENTELEMETRY_ENDPOINT_URL pointing to a valid server + // .. tonic does not seem to allow any mocks here #[cfg(feature = "telemetry")] - #[test] - fn get_trace_id_returns_valid_traces() { - let id = get_trace_id().to_bytes(); - dbg!(id); - assert!(id.iter().any(|digit| *digit != 0), "valid trace"); + #[tokio::test] + #[ignore = "requires a trace exporter"] + async fn get_trace_id_returns_valid_traces() { + use super::*; + super::init().await; + #[tracing::instrument(name = "test_span")] // need to be in an instrumented fn + fn test_trace_id() -> TraceId { + get_trace_id() + } + assert_ne!(test_trace_id(), TraceId::INVALID, "valid trace"); } } From 9b1801e9554c5bc256f609d840904bc4e3ccd1be Mon Sep 17 00:00:00 2001 From: clux Date: Mon, 6 Mar 2023 08:01:07 +0000 Subject: [PATCH 3/4] allow test to work without running other kubernetes tests Signed-off-by: clux --- justfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/justfile b/justfile index 2c334da..9e0cf1c 100644 --- a/justfile +++ b/justfile @@ -35,7 +35,7 @@ test-integration: install-crd cargo test -- --ignored # run telemetry tests test-telemetry: - OPENTELEMETRY_ENDPOINT_URL=https://0.0.0.0:55680 cargo test --lib --all-features -- --ignored + OPENTELEMETRY_ENDPOINT_URL=https://0.0.0.0:55680 cargo test --lib --all-features -- get_trace_id_returns_valid_traces --ignored # compile for musl (for docker image) compile features="": From 71ca2acda6d67ebf8faef31ae4fdd9b460898d9c Mon Sep 17 00:00:00 2001 From: clux Date: Mon, 6 Mar 2023 08:08:47 +0000 Subject: [PATCH 4/4] sentence Signed-off-by: clux --- src/telemetry.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/telemetry.rs b/src/telemetry.rs index d990c57..f100588 100644 --- a/src/telemetry.rs +++ b/src/telemetry.rs @@ -61,7 +61,6 @@ pub async fn init() { mod test { // This test only works when telemetry is initialized fully // and requires OPENTELEMETRY_ENDPOINT_URL pointing to a valid server - // .. tonic does not seem to allow any mocks here #[cfg(feature = "telemetry")] #[tokio::test] #[ignore = "requires a trace exporter"]