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.
First make sure you have a running version of the opentelemetry collector you want to send data to:
shell
$ docker run -p 55680:55680 otel/opentelemetry-collector-dev:latest
Then install a new pipeline with the recommended defaults to start exporting telemetry:
```rust use opentelemetry::api::Tracer;
fn main() -> Result<(), Box
tracer.in_span("doing_work", |cx| {
// Traced app logic here...
});
Ok(())
} ```
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.
toml
[dependencies]
opentelemetry = { version = "*", features = ["tokio"] }
opentelemetry-otlp = "*"
Example showing how to override all configuration options. See the
[OtlpPipelineBuilder
] docs for details of each option.
```rust 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
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(())
} ```