opentelemetry-otlp 0.2.0

Exporter for the OpenTelemetry Collector
docs.rs failed to build opentelemetry-otlp-0.2.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: opentelemetry-otlp-0.15.0

OpenTelemetry Collector Rust Exporter

The OTLP Exporter supports exporting trace and metric data in the OTLP format to the OpenTelemetry collector. The OpenTelemetry Collector offers a vendor-agnostic implementation on how to receive, process, and export telemetry data. In addition, it removes the need to run, operate, and maintain multiple agents/collectors in order to support open-source telemetry data formats (e.g. Jaeger, Prometheus, etc.) sending to multiple open-source or commercial back-ends.

Quickstart

First make sure you have a running version of the opentelemetry collector you want to send data to:

$ docker run -p 55680:55680 otel/opentelemetry-collector-dev:latest

Then install a new pipeline with the recommended defaults to start exporting telemetry:

use opentelemetry::api::Tracer;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let (tracer, _uninstall) = opentelemetry_otlp::new_pipeline().install()?;

    tracer.in_span("doing_work", |cx| {
        // Traced app logic here...
    });

    Ok(())
}

Performance

For optimal performance, a batch exporter is recommended as the simple exporter will export each span synchronously on drop. You can enable the tokio or async-std features to have a batch exporter configured for you automatically for either executor when you install the pipeline.

[dependencies]
opentelemetry = { version = "*", features = ["tokio"] }
opentelemetry-otlp = "*"

Kitchen Sink Full Configuration

Example showing how to override all configuration options. See the OtlpPipelineBuilder docs for details of each option.

use opentelemetry::api::{KeyValue, Tracer};
use opentelemetry::sdk::{trace, IdGenerator, Resource, Sampler};
use opentelemetry_otlp::{Compression, Credentials, Protocol};
use std::time::Duration;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let headers = vec![("X-Custom".to_string(), "Custom-Value".to_string())]
        .into_iter()
        .collect();

    let (tracer, _uninstall) = opentelemetry_otlp::new_pipeline()
        .with_endpoint("localhost:55680")
        .with_protocol(Protocol::Grpc)
        .with_headers(headers)
        .with_compression(Compression::Gzip)
        .with_timeout(Duration::from_secs(3))
        .with_completion_queue_count(2)
        .with_credentials(Credentials {
            cert: "tls.cert".to_string(),
            key: "tls.key".to_string(),
        })
        .with_trace_config(
            trace::config()
                .with_default_sampler(Sampler::AlwaysOn)
                .with_id_generator(IdGenerator::default())
                .with_max_events_per_span(64)
                .with_max_attributes_per_span(16)
                .with_max_events_per_span(16)
                .with_resource(Resource::new(vec![KeyValue::new("key", "value")])),
        )
        .install()?;

    tracer.in_span("doing_work", |cx| {
        // Traced app logic here...
    });

    Ok(())
}