diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 2fad901c9..bbec6e696 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1745,6 +1745,7 @@ dependencies = [ "tower-http", "tower-service", "tracing", + "tracing-subscriber", "url", ] diff --git a/backend/graph-proxy/Cargo.toml b/backend/graph-proxy/Cargo.toml index 668b74ffb..99d3e42c1 100644 --- a/backend/graph-proxy/Cargo.toml +++ b/backend/graph-proxy/Cargo.toml @@ -41,6 +41,7 @@ async-stream = "0.3.6" eventsource-stream = "0.2.3" opentelemetry = { workspace = true } opentelemetry_sdk = { workspace = true } +tracing-subscriber.workspace = true [dev-dependencies] mockito = { workspace = true } diff --git a/backend/graph-proxy/src/graphql/subscription_integration.rs b/backend/graph-proxy/src/graphql/subscription_integration.rs index 776f8ca20..dfd790a05 100644 --- a/backend/graph-proxy/src/graphql/subscription_integration.rs +++ b/backend/graph-proxy/src/graphql/subscription_integration.rs @@ -34,7 +34,10 @@ use axum::{ response::IntoResponse, Error, }; -use axum_extra::headers::Authorization; +use axum_extra::{ + headers::{authorization::Bearer, Authorization}, + TypedHeader, +}; use futures_util::{ future, future::BoxFuture, @@ -140,6 +143,12 @@ where .total_requests .add(1, &[KeyValue::new("request_type", "subscription")]); + let header_token = + TypedHeader::>::from_request_parts(&mut parts, &()) + .await + .ok() + .map(|it| it.0); + let resp = upgrade .protocols(ALL_WEBSOCKET_PROTOCOLS) .on_upgrade(move |stream| { @@ -149,10 +158,15 @@ where .get("Authorization") .and_then(|value| value.as_str()) .and_then(|token| token.strip_prefix("Bearer ")) - .map(str::to_string) - .ok_or(async_graphql::Error::new("No auth token was provided"))?; + .map(|it| Authorization::bearer(it).ok()) + .flatten() + .ok_or(async_graphql::Error::new("No auth token was provided")); + + let auth_header = token.or_else(|it| { + header_token + .ok_or(async_graphql::Error::new("No auth token was provided")) + }); - let auth_header = Authorization::bearer(&token); match auth_header { Ok(header) => { let mut data = Data::default(); diff --git a/backend/graph-proxy/src/main.rs b/backend/graph-proxy/src/main.rs index 0ab169293..fb881dab9 100644 --- a/backend/graph-proxy/src/main.rs +++ b/backend/graph-proxy/src/main.rs @@ -2,9 +2,9 @@ #![doc = include_str!("../README.md")] #![warn(missing_docs)] #![warn(clippy::missing_docs_in_private_items)] - /// GraphQL resolvers mod graphql; +mod noop; /// S3 client mod s3client; @@ -14,6 +14,7 @@ mod metrics; use crate::{ graphql::subscription_integration::GraphQLSubscription, metrics::{Metrics, MetricsState}, + noop::NoopMeter, }; use async_graphql::{http::GraphiQLSource, SDLExportOptions}; use axum::{ @@ -101,6 +102,11 @@ pub struct KubernetesApiUrl(Uri); #[tokio::main] async fn main() { + tracing_subscriber::fmt() + .with_max_level(tracing::Level::TRACE) + .with_writer(std::io::stdout) + .init(); + dotenvy::dotenv().ok(); let args = Cli::parse(); rustls::crypto::ring::default_provider() @@ -109,12 +115,13 @@ async fn main() { match args { Cli::Serve(args) => { - let otlp_guard = setup_telemetry(args.telemetry_config.clone()).unwrap(); + //let otlp_guard = setup_telemetry(args.telemetry_config.clone()).unwrap(); // TODO: This unwrap isn't ideal, but the telemetry lib is configured in such a way that // it's necessary. probably needs a tweak on the telemetry lib. - let metrics = otlp_guard.meter_provider.as_ref().unwrap(); - let metrics_state = Arc::new(Metrics::new(metrics)); + // let metrics = otlp_guard.meter_provider.as_ref().unwrap(); + let metrics = noop::NoopMeterProvider::new(); + let metrics_state = Arc::new(Metrics::new(&metrics)); info!(?args, "Starting GraphQL Server"); let s3_client = Client::from(args.s3_client); diff --git a/backend/graph-proxy/src/metrics.rs b/backend/graph-proxy/src/metrics.rs index 236ef4cb2..71b7b3988 100644 --- a/backend/graph-proxy/src/metrics.rs +++ b/backend/graph-proxy/src/metrics.rs @@ -1,7 +1,6 @@ use std::sync::Arc; use opentelemetry::metrics::{Counter, Histogram, MeterProvider}; -use opentelemetry_sdk::metrics::SdkMeterProvider; /// Thread-safe wrapper for OTEL metrics pub type MetricsState = Arc; @@ -23,7 +22,7 @@ pub struct Metrics { impl Metrics { /// Builds a new metrics carrier instance - pub fn new(meter_provider: &SdkMeterProvider) -> Self { + pub fn new(meter_provider: &impl MeterProvider) -> Self { let meter = meter_provider.meter("otel-proxy"); let total_requests = meter