diff --git a/src/trace-forwarder/src/handler.rs b/src/trace-forwarder/src/handler.rs index 377ee0e82d..e7b4652482 100644 --- a/src/trace-forwarder/src/handler.rs +++ b/src/trace-forwarder/src/handler.rs @@ -32,13 +32,14 @@ pub async fn handle_connection<'a>( logger: Logger, mut conn: VsockStream, exporter: &'a mut dyn SpanExporter, + dump_only: bool, ) -> Result<()> { let logger = logger.new(o!("subsystem" => "handler", "connection" => format!("{:?}", conn))); debug!(logger, "handling connection"); - handle_trace_data(logger.clone(), &mut conn, exporter) + handle_trace_data(logger.clone(), &mut conn, exporter, dump_only) .await .map_err(|e| mk_io_err(&format!("failed to handle data: {:}", e)))?; @@ -56,6 +57,7 @@ async fn handle_trace_data<'a>( logger: Logger, reader: &'a mut dyn Read, exporter: &'a mut dyn SpanExporter, + dump_only: bool, ) -> Result<()> { loop { let mut header: [u8; HEADER_SIZE_BYTES as usize] = [0; HEADER_SIZE_BYTES as usize]; @@ -90,18 +92,22 @@ async fn handle_trace_data<'a>( debug!(logger, "deserialised payload"); - let mut batch = Vec::::new(); + if dump_only { + debug!(logger, "dump-only: {:?}", span_data); + } else { + let mut batch = Vec::::new(); - batch.push(span_data); + batch.push(span_data); - // Call low-level Jaeger exporter to send the trace span immediately. - let result = exporter.export(batch).await; + // Call low-level Jaeger exporter to send the trace span immediately. + let result = exporter.export(batch).await; - if result.is_err() { - return Err(anyhow!("failed to export trace spans: {:?}", result)); + if result.is_err() { + return Err(anyhow!("failed to export trace spans: {:?}", result)); + } + + debug!(logger, "exported trace spans"); } - - debug!(logger, "exported trace spans"); } Ok(()) diff --git a/src/trace-forwarder/src/main.rs b/src/trace-forwarder/src/main.rs index 8e5f646d46..68346c64a3 100644 --- a/src/trace-forwarder/src/main.rs +++ b/src/trace-forwarder/src/main.rs @@ -36,12 +36,13 @@ mod handler; mod server; mod tracer; -fn announce(logger: &Logger, version: &str) { +fn announce(logger: &Logger, version: &str, dump_only: bool) { let commit = env::var("VERSION_COMMIT").map_or(String::new(), |s| s); info!(logger, "announce"; "commit-version" => commit.as_str(), - "version" => version); + "version" => version, + "dump-only" => dump_only); } fn make_examples_text(program_name: &str) -> String { @@ -69,6 +70,11 @@ fn real_main() -> Result<()> { .about(ABOUT_TEXT) .long_about(DESCRIPTION_TEXT) .after_help(&*make_examples_text(name)) + .arg( + Arg::with_name("dump-only") + .long("dump-only") + .help("Disable forwarding of spans and write to stdout (for testing)"), + ) .arg( Arg::with_name("trace-name") .long("trace-name") @@ -182,7 +188,9 @@ fn real_main() -> Result<()> { let writer = io::stdout(); let (logger, _logger_guard) = logging::create_logger(name, name, log_level, writer); - announce(&logger, version); + let dump_only = args.is_present("dump-only"); + + announce(&logger, version, dump_only); let trace_name: &str = args .value_of("trace-name") @@ -205,6 +213,7 @@ fn real_main() -> Result<()> { jaeger_host, jaeger_port, trace_name, + dump_only, ); let result = server.start(); diff --git a/src/trace-forwarder/src/server.rs b/src/trace-forwarder/src/server.rs index 371acca3d3..cca1b31f26 100644 --- a/src/trace-forwarder/src/server.rs +++ b/src/trace-forwarder/src/server.rs @@ -21,6 +21,7 @@ pub struct VsockTraceServer { pub jaeger_service_name: String, pub logger: Logger, + pub dump_only: bool, } impl VsockTraceServer { @@ -31,16 +32,18 @@ impl VsockTraceServer { jaeger_host: &str, jaeger_port: u32, jaeger_service_name: &str, + dump_only: bool, ) -> Self { let logger = logger.new(o!("subsystem" => "server")); VsockTraceServer { - vsock_port: vsock_port, - vsock_cid: vsock_cid, + vsock_port, + vsock_cid, jaeger_host: jaeger_host.to_string(), - jaeger_port: jaeger_port, + jaeger_port, jaeger_service_name: jaeger_service_name.to_string(), - logger: logger, + logger, + dump_only, } } @@ -71,7 +74,7 @@ impl VsockTraceServer { let logger = self.logger.new(o!()); - let f = handler::handle_connection(logger, conn, &mut exporter); + let f = handler::handle_connection(logger, conn, &mut exporter, self.dump_only); block_on(f)?; }