observability 0.1.3

Experimental tracing ideas
Documentation
use observability::{span_context, OpenSpanExt};
use std::{env, error::Error, net::SocketAddr};
use tokio::net::UdpSocket;
use tracing::*;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    observability::test_run_open().ok();
    let remote_addr: SocketAddr = env::args()
        .nth(1)
        .unwrap_or_else(|| "127.0.0.1:8080".into())
        .parse()?;
    let local_addr: SocketAddr = if remote_addr.is_ipv4() {
        "0.0.0.0:0"
    } else {
        "[::]:0"
    }
    .parse()?;

    let mut socket = UdpSocket::bind(local_addr).await?;
    const MAX_DATAGRAM_SIZE: usize = 65_507;
    socket.connect(&remote_addr).await?;
    {
        let span = debug_span!("client send");
        let _g = span.enter();
        span_context!(span, Level::DEBUG);
        let data = span.get_context_bytes();

        socket.send(data.as_ref()).await?;
    }
    {
        let mut data = vec![0u8; MAX_DATAGRAM_SIZE];
        let len = socket.recv(&mut data).await?;
        let data = data[..len].to_vec();
        let span = debug_span!("client recv");
        let _g = span.enter();
        span.set_from_bytes(data);
        span_context!(span, Level::DEBUG);

        let data = span.get_context_bytes();

        socket.send(data.as_ref()).await?;
    }
    {
        let mut data = vec![0u8; MAX_DATAGRAM_SIZE];
        let len = socket.recv(&mut data).await?;
        let data = data[..len].to_vec();
        let span = debug_span!("client recv 2");
        let _g = span.enter();
        span.set_from_bytes(data);
        span_context!(span, Level::DEBUG);
    }
    Ok(())
}