Crate opentelemetry_otlp
source · [−]Expand description
The OTLP Exporter supports exporting trace and metric data in the OTLP format to the OpenTelemetry collector or other compatible backend.
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.
Currently, this crate only support sending tracing data or metrics in OTLP via grpc and http(in binary format). Supports for other format and protocol will be added in the future. The details of what’s currently offering in this crate can be found in this doc.
Quickstart
First make sure you have a running version of the opentelemetry collector you want to send data to:
$ docker run -p 4317:4317 otel/opentelemetry-collector-dev:latest
Then install a new pipeline with the recommended defaults to start exporting telemetry. You will have to build a OTLP exporter first.
Tracing and metrics pipelines can be started with new_pipeline().tracing()
and
new_pipeline().metrics()
respectively.
use opentelemetry::trace::Tracer;
fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
// First, create a OTLP exporter builder. Configure it as you need.
let otlp_exporter = opentelemetry_otlp::new_exporter().tonic();
// Then pass it into pipeline builder
let tracer = opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(otlp_exporter)
.install_simple()?;
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 dropping. You can enable the
[rt-tokio
], [rt-tokio-current-thread
] or [rt-async-std
] features and
specify a runtime on the pipeline builder to have a batch exporter
configured for you automatically.
[dependencies]
opentelemetry = { version = "*", features = ["async-std"] }
opentelemetry-otlp = { version = "*", features = ["grpc-sys"] }
let tracer = opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(opentelemetry_otlp::new_exporter().tonic())
.install_batch(opentelemetry::runtime::AsyncStd)?;
Kitchen Sink Full Configuration
Example showing how to override all configuration options.
Generally there are two parts of configuration. One is metrics config
or tracing config. Users can config it via OtlpTracePipeline
or OtlpMetricPipeline
. The other is exporting configuration.
Users can set those configurations using OtlpExporterPipeline
based
on the choice of exporters.
use opentelemetry::{KeyValue, trace::Tracer};
use opentelemetry::sdk::{trace::{self, RandomIdGenerator, Sampler}, Resource};
use opentelemetry::sdk::metrics::{selectors, PushController};
use opentelemetry::sdk::util::tokio_interval_stream;
use opentelemetry_otlp::{Protocol, WithExportConfig, ExportConfig};
use std::time::Duration;
use tonic::metadata::*;
fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
let mut map = MetadataMap::with_capacity(3);
map.insert("x-host", "example.com".parse().unwrap());
map.insert("x-number", "123".parse().unwrap());
map.insert_bin("trace-proto-bin", MetadataValue::from_bytes(b"[binary data]"));
let tracer = opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint("http://localhost:4317")
.with_timeout(Duration::from_secs(3))
.with_metadata(map)
)
.with_trace_config(
trace::config()
.with_sampler(Sampler::AlwaysOn)
.with_id_generator(RandomIdGenerator::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("service.name", "example")])),
)
.install_batch(opentelemetry::runtime::Tokio)?;
let export_config = ExportConfig {
endpoint: "http://localhost:4317".to_string(),
timeout: Duration::from_secs(3),
protocol: Protocol::Grpc
};
let meter = opentelemetry_otlp::new_pipeline()
.metrics(tokio::spawn, tokio_interval_stream)
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_export_config(export_config),
// can also config it using with_* functions like the tracing part above.
)
.with_stateful(true)
.with_period(Duration::from_secs(3))
.with_timeout(Duration::from_secs(10))
.with_aggregator_selector(selectors::simple::Selector::Exact)
.build();
tracer.in_span("doing_work", |cx| {
// Traced app logic here...
});
Ok(())
}
Grpc libraries comparison
The table below provides a short comparison between grpcio
and tonic
, two
of the most popular grpc libraries in Rust. Users can choose between them when
working with otlp and grpc.
Project | hyperium/tonic | tikv/grpc-rs |
---|---|---|
Feature name | –features=default | –features=grpc-sys |
gRPC library | tonic | grpcio |
Transport | hyperium/hyper (Rust) | grpc/grpc (C++ binding) |
TLS support | yes | yes |
TLS optional | yes | yes |
TLS library | rustls | OpenSSL |
Supported .proto generator | prost | prost , protobuf |
Structs
grpc-sys
Credential configuration for authenticated requests.
Configuration for the OTLP exporter.
grpc-sys
Build a trace exporter that uses grpcio as grpc layer and opentelemetry protocol.
http-proto
Build a trace exporter that uses HTTP transport and opentelemetry protocol.
metrics
Export metrics in OTEL format.
Build a OTLP metrics or tracing exporter builder. See functions below to understand what’s currently supported.
metrics
Pipeline to build OTLP metrics exporter
General builder for both tracing and metrics.
trace
Recommended configuration for an OTLP exporter pipeline.
grpc-tonic
Build a trace exporter that uses tonic as grpc layer and opentelemetry protocol.
Enums
grpc-sys
The compression algorithm to use when sending data.
Wrap type for errors from this crate.
The communication protocol to use when exporting data.
trace
OTLP exporter that sends tracing information
trace
OTLP span exporter builder.
Constants
Target to which the exporter is going to send signals, defaults to https://localhost:4317. Learn about the relationship between this constant and metrics/spans/logs at https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#endpoint-urls-for-otlphttp
Default target to which the exporter is going to send signals.
Target to which the exporter is going to send metrics, defaults to https://localhost:4317/v1/metrics. Learn about the relationship between this constant and default/spans/logs at https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#endpoint-urls-for-otlphttp
Max waiting time for the backend to process each metrics batch, defaults to 10s.
Max waiting time for the backend to process each signal batch, defaults to 10 seconds.
Default max waiting time for the backend to process each signal batch.
Target to which the exporter is going to send spans, defaults to https://localhost:4317/v1/traces. Learn about the relationship between this constant and default/metrics/logs at https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#endpoint-urls-for-otlphttp
Max waiting time for the backend to process each spans batch, defaults to 10s.
Traits
Provide access to the export config field within the exporter builders.
Expose methods to override export configuration.
Functions
Create a builder to build OTLP metrics exporter or tracing exporter.
Create a new pipeline builder with the recommended configuration.