forwarder: Add dump only option

Added a `--dump-only` option which disables forwarding of trace spans.
This essentially makes the forwarder a NOP but can be useful for testing
purposes.

Fixes: #2132.

Signed-off-by: James O. D. Hunt <james.o.hunt@intel.com>
This commit is contained in:
James O. D. Hunt 2021-06-28 15:56:25 +01:00
parent 432296ae7a
commit a33d6bae63
3 changed files with 35 additions and 17 deletions

View File

@ -32,13 +32,14 @@ pub async fn handle_connection<'a>(
logger: Logger, logger: Logger,
mut conn: VsockStream, mut conn: VsockStream,
exporter: &'a mut dyn SpanExporter, exporter: &'a mut dyn SpanExporter,
dump_only: bool,
) -> Result<()> { ) -> Result<()> {
let logger = logger.new(o!("subsystem" => "handler", let logger = logger.new(o!("subsystem" => "handler",
"connection" => format!("{:?}", conn))); "connection" => format!("{:?}", conn)));
debug!(logger, "handling connection"); debug!(logger, "handling connection");
handle_trace_data(logger.clone(), &mut conn, exporter) handle_trace_data(logger.clone(), &mut conn, exporter, dump_only)
.await .await
.map_err(|e| mk_io_err(&format!("failed to handle data: {:}", e)))?; .map_err(|e| mk_io_err(&format!("failed to handle data: {:}", e)))?;
@ -56,6 +57,7 @@ async fn handle_trace_data<'a>(
logger: Logger, logger: Logger,
reader: &'a mut dyn Read, reader: &'a mut dyn Read,
exporter: &'a mut dyn SpanExporter, exporter: &'a mut dyn SpanExporter,
dump_only: bool,
) -> Result<()> { ) -> Result<()> {
loop { loop {
let mut header: [u8; HEADER_SIZE_BYTES as usize] = [0; HEADER_SIZE_BYTES as usize]; 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"); debug!(logger, "deserialised payload");
let mut batch = Vec::<SpanData>::new(); if dump_only {
debug!(logger, "dump-only: {:?}", span_data);
} else {
let mut batch = Vec::<SpanData>::new();
batch.push(span_data); batch.push(span_data);
// Call low-level Jaeger exporter to send the trace span immediately. // Call low-level Jaeger exporter to send the trace span immediately.
let result = exporter.export(batch).await; let result = exporter.export(batch).await;
if result.is_err() { if result.is_err() {
return Err(anyhow!("failed to export trace spans: {:?}", result)); return Err(anyhow!("failed to export trace spans: {:?}", result));
}
debug!(logger, "exported trace spans");
} }
debug!(logger, "exported trace spans");
} }
Ok(()) Ok(())

View File

@ -36,12 +36,13 @@ mod handler;
mod server; mod server;
mod tracer; 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); let commit = env::var("VERSION_COMMIT").map_or(String::new(), |s| s);
info!(logger, "announce"; info!(logger, "announce";
"commit-version" => commit.as_str(), "commit-version" => commit.as_str(),
"version" => version); "version" => version,
"dump-only" => dump_only);
} }
fn make_examples_text(program_name: &str) -> String { fn make_examples_text(program_name: &str) -> String {
@ -69,6 +70,11 @@ fn real_main() -> Result<()> {
.about(ABOUT_TEXT) .about(ABOUT_TEXT)
.long_about(DESCRIPTION_TEXT) .long_about(DESCRIPTION_TEXT)
.after_help(&*make_examples_text(name)) .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(
Arg::with_name("trace-name") Arg::with_name("trace-name")
.long("trace-name") .long("trace-name")
@ -182,7 +188,9 @@ fn real_main() -> Result<()> {
let writer = io::stdout(); let writer = io::stdout();
let (logger, _logger_guard) = logging::create_logger(name, name, log_level, writer); 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 let trace_name: &str = args
.value_of("trace-name") .value_of("trace-name")
@ -205,6 +213,7 @@ fn real_main() -> Result<()> {
jaeger_host, jaeger_host,
jaeger_port, jaeger_port,
trace_name, trace_name,
dump_only,
); );
let result = server.start(); let result = server.start();

View File

@ -21,6 +21,7 @@ pub struct VsockTraceServer {
pub jaeger_service_name: String, pub jaeger_service_name: String,
pub logger: Logger, pub logger: Logger,
pub dump_only: bool,
} }
impl VsockTraceServer { impl VsockTraceServer {
@ -31,16 +32,18 @@ impl VsockTraceServer {
jaeger_host: &str, jaeger_host: &str,
jaeger_port: u32, jaeger_port: u32,
jaeger_service_name: &str, jaeger_service_name: &str,
dump_only: bool,
) -> Self { ) -> Self {
let logger = logger.new(o!("subsystem" => "server")); let logger = logger.new(o!("subsystem" => "server"));
VsockTraceServer { VsockTraceServer {
vsock_port: vsock_port, vsock_port,
vsock_cid: vsock_cid, vsock_cid,
jaeger_host: jaeger_host.to_string(), jaeger_host: jaeger_host.to_string(),
jaeger_port: jaeger_port, jaeger_port,
jaeger_service_name: jaeger_service_name.to_string(), 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 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)?; block_on(f)?;
} }