feat: Enable gRPC reflection

pull/24376/head
Marko Mikulicic 2021-05-05 21:52:55 +02:00
parent c3c80f53ce
commit 0d6d94dc00
No known key found for this signature in database
GPG Key ID: D02A41F91A687DB3
6 changed files with 50 additions and 3 deletions

16
Cargo.lock generated
View File

@ -1520,6 +1520,7 @@ dependencies = [
"tokio-util",
"tonic",
"tonic-health",
"tonic-reflection",
"tracker",
"write_buffer",
]
@ -4038,6 +4039,21 @@ dependencies = [
"tonic-build",
]
[[package]]
name = "tonic-reflection"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56498d20188550337ea6c48ecf59d11646382dbfcd61051fb98c1093cfae3c21"
dependencies = [
"bytes",
"prost",
"prost-types",
"tokio",
"tokio-stream",
"tonic",
"tonic-build",
]
[[package]]
name = "tower"
version = "0.4.7"

View File

@ -97,6 +97,7 @@ tokio-stream = { version = "0.1.2", features = ["net"] }
tokio-util = { version = "0.6.3" }
tonic = "0.4.0"
tonic-health = "0.3.0"
tonic-reflection = "0.1.0"
[dev-dependencies]
# Workspace dependencies, in alphabetical order

View File

@ -1,5 +1,6 @@
//! Compiles Protocol Buffers into native Rust types.
use std::env;
use std::path::{Path, PathBuf};
type Error = Box<dyn std::error::Error>;
@ -69,7 +70,11 @@ fn generate_grpc_types(root: &Path) -> Result<()> {
)
.extern_path(".google.protobuf", "::google_types::protobuf");
tonic_build::configure().compile_with_config(config, &proto_files, &[root.into()])?;
let descriptor_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("proto_descriptor.bin");
tonic_build::configure()
.file_descriptor_set_path(&descriptor_path)
.format(true)
.compile_with_config(config, &proto_files, &[root.into()])?;
Ok(())
}

View File

@ -102,6 +102,11 @@ pub fn protobuf_type_url(protobuf_type: &str) -> String {
format!("{}/{}", ANY_TYPE_PREFIX, protobuf_type)
}
/// Protobuf file descriptor containing all generated types.
/// Useful in gRPC reflection.
pub const FILE_DESCRIPTOR_SET: &'static [u8] =
tonic::include_file_descriptor_set!("proto_descriptor");
/// Compares the protobuf type URL found within a google.protobuf.Any
/// message to an expected Protobuf package and message name
///

View File

@ -50,7 +50,7 @@ pub enum Error {
ServingHttp { source: hyper::Error },
#[snafu(display("Error serving RPC: {}", source))]
ServingRpc { source: tonic::transport::Error },
ServingRpc { source: rpc::Error },
#[snafu(display(
"Specified {} for the object store, required configuration missing for {}",

View File

@ -5,6 +5,7 @@ use tokio::net::TcpListener;
use tokio_stream::wrappers::TcpListenerStream;
use server::{ConnectionManager, Server};
use snafu::{ResultExt, Snafu};
use tokio_util::sync::CancellationToken;
pub mod error;
@ -15,6 +16,19 @@ mod storage;
mod testing;
mod write;
#[derive(Debug, Snafu)]
pub enum Error {
#[snafu(display("gRPC transport error: {}", source))]
TransportError { source: tonic::transport::Error },
#[snafu(display("gRPC reflection error: {}", source))]
ReflectionError {
source: tonic_reflection::server::Error,
},
}
pub type Result<T, E = Error> = std::result::Result<T, E>;
/// Instantiate a server listening on the specified address
/// implementing the IOx, Storage, and Flight gRPC interfaces, the
/// underlying hyper server instance. Resolves when the server has
@ -23,13 +37,17 @@ pub async fn serve<M>(
socket: TcpListener,
server: Arc<Server<M>>,
shutdown: CancellationToken,
) -> Result<(), tonic::transport::Error>
) -> Result<()>
where
M: ConnectionManager + Send + Sync + Debug + 'static,
{
let stream = TcpListenerStream::new(socket);
let (mut health_reporter, health_service) = tonic_health::server::health_reporter();
let reflection_service = tonic_reflection::server::Builder::configure()
.register_encoded_file_descriptor_set(generated_types::FILE_DESCRIPTOR_SET)
.build()
.context(ReflectionError)?;
let services = [
generated_types::STORAGE_SERVICE,
@ -45,6 +63,7 @@ where
tonic::transport::Server::builder()
.add_service(health_service)
.add_service(reflection_service)
.add_service(testing::make_server())
.add_service(storage::make_server(
Arc::clone(&server),
@ -56,4 +75,5 @@ where
.add_service(operations::make_server(server))
.serve_with_incoming_shutdown(stream, shutdown.cancelled())
.await
.context(TransportError)
}