owiwi 2.0.0

A library to initialize tracing with opentelemetry
Documentation

Build Status Crates.io Documentation MPL-2.0 license

owiwi

Opinionated tracing subscriber with OpenTelemetry export.

Known Limitations

  • gRPC only. OTEL_EXPORTER_OTLP_PROTOCOL ignored
  • OTEL_TRACES_EXPORTER / OTEL_METRICS_EXPORTER not supported

Install

[dependencies]
owiwi = { version = "2", features = ["console"] }
tracing = "0.1"

Usage

use owiwi::Owiwi;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let owiwi = Owiwi::builder().service_name("my-service").build();
    let guard = owiwi.try_init_console()?;

    tracing::info!("credential issues");

    guard.shutdown()?;
    Ok(())
}

Hold the returned OwiwiGuard until shutdown. Dropping it stops export.

OTLP export

use owiwi::{Owiwi, OtlpConfig};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let guard = Owiwi::builder()
        .service_name("my-service")
        .otlp(OtlpConfig::builder()
            .endpoint("http://localhost:4317".parse()?)
            .timeout(std::time::Duration::from_secs(10))
            .build())
        .build()
        .try_init()?;

    tracing::info!("credential issues");

    guard.shutdown()?;
    Ok(())
}

Custom backends

Use try_init_with with any type that implements SpanExporterConfig:

use owiwi::{Owiwi, HoneycombConfig};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = HoneycombConfig::builder()
        .endpoint("https://api.honeycomb.io".parse()?)
        .api_key("your-api-key".into())
        .timeout(std::time::Duration::from_secs(5))
        .build();

    let guard = Owiwi::builder()
        .service_name("my-service")
        .build()
        .try_init_with(config)?;

    guard.shutdown()?;
    Ok(())
}

CLI Integration

Flatten Owiwi into your CLI struct. Requires the clap feature.

[dependencies]
clap = { version = "4", features = ["derive"] }
owiwi = { version = "2.0.0", features = ["clap"] }
tracing = "0.1"
use clap::Parser;
use owiwi::Owiwi;

#[derive(Debug, Clone, Parser)]
struct Cli {
    #[command(flatten)]
    owiwi: Owiwi,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let cli = Cli::parse();
    let guard = cli.owiwi.try_init()?;
    guard.shutdown()?;
    Ok(())
}

Backends

Backend Config type Init method Feature
Any OTLP collector OtlpConfig try_init (default)
Console (stdout) try_init_console console
Honeycomb HoneycombConfig try_init_with honeycomb
Custom impl SpanExporterConfig try_init_with

Environment Variables

Per the OpenTelemetry spec. With clap, each has a CLI flag.

Variable Flag
OTEL_SERVICE_NAME --service-name Service name
OTEL_SDK_DISABLED --no-telemetry Disable telemetry
OTEL_RESOURCE_ATTRIBUTES --resource-attrs key=value,key=value
OTEL_EXPORTER_OTLP_ENDPOINT --otlp-endpoint Exporter endpoint
OTEL_EXPORTER_OTLP_HEADERS --otlp-headers Extra gRPC headers
OTEL_EXPORTER_OTLP_TIMEOUT --otlp-timeout Export timeout
OTEL_TRACES_SAMPLER Sampler type (always_on, always_off, traceidratio)
OTEL_TRACES_SAMPLER_ARG Sampler argument (e.g. ratio for traceidratio)
RUST_LOG --trace-directive info / my_crate=debug
OWIWI_EXPORT_LOG --export-directive Export filter (default: info)
OWIWI_METRICS_INTERVAL --metrics-interval Metrics export interval (e.g. 30s)

Features

Feature Default
clap CLI flags via clap::Args yes
serde Deserialize on config types yes
console Stdout exporters no
honeycomb Honeycomb exporter no
metrics Metrics via SdkMeterProvider no
prometheus Prometheus OTLP export (implies metrics) no

MSRV

1.94.0

Acknowledgments

Inspired by Instrumenting Axum.

License

MPL-2.0