From 5f6a9a20f4b51db4f123696c7b51a88596e253aa Mon Sep 17 00:00:00 2001 From: iamvigneshwars Date: Mon, 3 Feb 2025 09:46:04 +0000 Subject: [PATCH] fix(graph-proxy): use custom telemetry library --- graph-proxy/Cargo.lock | 23 ++++++-- graph-proxy/Cargo.toml | 7 +-- graph-proxy/Dockerfile | 2 + graph-proxy/src/main.rs | 2 - graph-proxy/src/telemetry.rs | 111 ----------------------------------- 5 files changed, 20 insertions(+), 125 deletions(-) delete mode 100644 graph-proxy/src/telemetry.rs diff --git a/graph-proxy/Cargo.lock b/graph-proxy/Cargo.lock index 0c362212..817d0b64 100644 --- a/graph-proxy/Cargo.lock +++ b/graph-proxy/Cargo.lock @@ -832,20 +832,15 @@ dependencies = [ "dotenvy", "lazy_static", "mockito", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry-semantic-conventions", - "opentelemetry_sdk", "regex", "reqwest", "serde", "serde_json", + "telemetry", "thiserror 2.0.11", "tokio", "tower-http", "tracing", - "tracing-opentelemetry", - "tracing-subscriber", "url", ] @@ -2249,6 +2244,22 @@ dependencies = [ "syn", ] +[[package]] +name = "telemetry" +version = "0.1.0" +dependencies = [ + "anyhow", + "built", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", + "tracing", + "tracing-opentelemetry", + "tracing-subscriber", + "url", +] + [[package]] name = "tempfile" version = "3.12.0" diff --git a/graph-proxy/Cargo.toml b/graph-proxy/Cargo.toml index ca021676..89b5ffa2 100644 --- a/graph-proxy/Cargo.toml +++ b/graph-proxy/Cargo.toml @@ -30,10 +30,6 @@ derive_more = { version = "1.0.0", features = [ ] } dotenvy = { version = "0.15.7" } lazy_static = { version = "1.5.0" } -opentelemetry = { version = "0.27.1" } -opentelemetry-otlp = { version = "0.27.0", features = ["metrics"] } -opentelemetry-semantic-conventions = "0.27.0" -opentelemetry_sdk = { version = "0.27.1", features = ["rt-tokio"] } regex = "1.11.1" reqwest = { version = "0.12.9", default-features = false, features = [ "rustls-tls", @@ -42,11 +38,10 @@ reqwest = { version = "0.12.9", default-features = false, features = [ serde = { workspace = true } serde_json = { workspace = true } thiserror = { version = "2.0.11" } +telemetry = { path = "../telemetry" } tokio = { version = "1.43.0", features = ["macros", "net", "rt-multi-thread"] } tower-http = { version = "0.6.2", features = ["cors"] } tracing = { version = "0.1.41" } -tracing-opentelemetry = { version = "0.28.0" } -tracing-subscriber = { version = "0.3.19" } url = { version = "2.5.4" } [dev-dependencies] diff --git a/graph-proxy/Dockerfile b/graph-proxy/Dockerfile index 8f7be737..17bdfd5c 100644 --- a/graph-proxy/Dockerfile +++ b/graph-proxy/Dockerfile @@ -10,6 +10,7 @@ COPY argo-workflows-openapi/Cargo.toml argo-workflows-openapi/Cargo.toml COPY argo-workflows-openapi/build.rs argo-workflows-openapi/build.rs COPY argo-workflows-openapi/src/lib.rs argo-workflows-openapi/src/lib.rs COPY Cargo.toml Cargo.lock ./ +COPY ../telemetry telemetry RUN mkdir src \ && echo "fn main() {}" > src/main.rs \ @@ -17,6 +18,7 @@ RUN mkdir src \ && cargo build --release COPY . . +RUN ln -s /telemetry /app/telemetry RUN touch src/main.rs \ && cargo build --release diff --git a/graph-proxy/src/main.rs b/graph-proxy/src/main.rs index 021e4d3b..d12ca6d0 100644 --- a/graph-proxy/src/main.rs +++ b/graph-proxy/src/main.rs @@ -5,8 +5,6 @@ /// GraphQL resolvers mod graphql; -/// OpenTelemetry setup and configuration -mod telemetry; use async_graphql::{http::GraphiQLSource, SDLExportOptions}; use axum::{response::Html, routing::get, Router}; diff --git a/graph-proxy/src/telemetry.rs b/graph-proxy/src/telemetry.rs deleted file mode 100644 index 808c7edd..00000000 --- a/graph-proxy/src/telemetry.rs +++ /dev/null @@ -1,111 +0,0 @@ -use opentelemetry::{trace::TracerProvider as _, KeyValue}; -use opentelemetry_otlp::{MetricExporter, SpanExporter, WithExportConfig}; -use opentelemetry_sdk::{ - metrics::{PeriodicReader, SdkMeterProvider}, - propagation::TraceContextPropagator, - runtime, - trace::TracerProvider, - Resource, -}; -use opentelemetry_semantic_conventions::resource::{SERVICE_NAME, SERVICE_VERSION}; -use tracing::{level_filters::LevelFilter, Level}; -use tracing_opentelemetry::{MetricsLayer, OpenTelemetryLayer}; -use tracing_subscriber::layer::SubscriberExt; -use tracing_subscriber::util::SubscriberInitExt; -use url::Url; - -/// Provides crate information from the time it was built -mod built_info { - include!(concat!(env!("OUT_DIR"), "/built.rs")); -} - -/// Encapsulates a [`TracerProvider`] and [`SdkMeterProvider`] to ensure metrics & trace streams -/// are shutdown and flushed on drop -#[allow(clippy::missing_docs_in_private_items)] -pub struct OtelGuard { - tracer_provider: Option, - meter_provider: Option, -} - -impl Drop for OtelGuard { - fn drop(&mut self) { - if let Some(tracer_provider) = &self.tracer_provider { - if let Err(err) = tracer_provider.shutdown() { - eprintln!("{err:?}"); - } - } - if let Some(meter_provider) = &self.meter_provider { - if let Err(err) = meter_provider.shutdown() { - eprintln!("{err}:?"); - } - } - } -} - -/// Sets up Logging & Tracing using opentelemetry if available -pub fn setup_telemetry( - metrics_endpoint: Option, - tracing_endpoint: Option, - telemetry_level: Level, -) -> anyhow::Result { - let level_filter = LevelFilter::from_level(telemetry_level); - let log_layer = tracing_subscriber::fmt::layer(); - - let otel_resources = Resource::new([ - KeyValue::new(SERVICE_NAME, built_info::PKG_NAME), - KeyValue::new(SERVICE_VERSION, built_info::PKG_VERSION), - ]); - - let (meter_provider, metrics_layer) = if let Some(metrics_endpoint) = metrics_endpoint { - let meter_provider = SdkMeterProvider::builder() - .with_reader( - PeriodicReader::builder( - MetricExporter::builder() - .with_tonic() - .with_endpoint(metrics_endpoint) - .build()?, - runtime::Tokio, - ) - .build(), - ) - .with_resource(otel_resources.clone()) - .build(); - ( - Some(meter_provider.clone()), - Some(MetricsLayer::new(meter_provider)), - ) - } else { - (None, None) - }; - - let (tracer_provider, tracing_layer) = if let Some(tracing_endpoint) = tracing_endpoint { - let tracer_provider = TracerProvider::builder() - .with_batch_exporter( - SpanExporter::builder() - .with_tonic() - .with_endpoint(tracing_endpoint) - .build()?, - runtime::Tokio, - ) - .with_resource(otel_resources) - .build(); - let tracer = tracer_provider.tracer(built_info::PKG_NAME); - (Some(tracer_provider), Some(OpenTelemetryLayer::new(tracer))) - } else { - (None, None) - }; - - let otel_guard = OtelGuard { - tracer_provider, - meter_provider, - }; - - opentelemetry::global::set_text_map_propagator(TraceContextPropagator::default()); - tracing_subscriber::Registry::default() - .with(level_filter) - .with(log_layer) - .with(metrics_layer) - .with(tracing_layer) - .try_init()?; - Ok(otel_guard) -}