//! The OTLP Exporter supports exporting logs, metrics and traces 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 telemetry 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:
//!
//! ```shell
//! $ docker run -p 4317:4317 otel/opentelemetry-collector:latest
//! ```
//!
//! Then install a new pipeline with the recommended defaults to start exporting
//! telemetry. You will have to build a OTLP exporter first.
//!
//! Exporting pipelines can be started with `new_pipeline().tracing()` and
//! `new_pipeline().metrics()`, and `new_pipeline().logging()` respectively for
//! traces, metrics and logs.
//!
//! ```no_run
//! # #[cfg(all(feature = "trace", feature = "grpc-tonic"))]
//! # {
//! use opentelemetry::global;
//! 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 _ = opentelemetry_otlp::new_pipeline()
//! .tracing()
//! .with_exporter(otlp_exporter)
//! .install_simple()?;
//! let tracer = global::tracer("my_tracer");
//! 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.
//!
//! ```toml
//! [dependencies]
//! opentelemetry_sdk = { version = "*", features = ["async-std"] }
//! opentelemetry-otlp = { version = "*", features = ["grpc-tonic"] }
//! ```
//!
//! ```no_run
//! # #[cfg(all(feature = "trace", feature = "grpc-tonic"))]
//! # {
//! # fn main() -> Result<(), opentelemetry::trace::TraceError> {
//! let tracer = opentelemetry_otlp::new_pipeline()
//! .tracing()
//! .with_exporter(opentelemetry_otlp::new_exporter().tonic())
//! .install_batch(opentelemetry_sdk::runtime::AsyncStd)?;
//! # Ok(())
//! # }
//! # }
//! ```
//!
//! [`tokio`]: https://tokio.rs
//! [`async-std`]: https://async.rs
//!
//! # Feature Flags
//! The following feature flags can enable exporters for different telemetry signals:
//!
//! * `trace`: Includes the trace exporters (enabled by default).
//! * `metrics`: Includes the metrics exporters.
//! * `logs`: Includes the logs exporters.
//!
//! The following feature flags generate additional code and types:
//! * `serialize`: Enables serialization support for type defined in this create via `serde`.
//!
//! The following feature flags offer additional configurations on gRPC:
//!
//! For users uses `tonic` as grpc layer:
//! * `grpc-tonic`: Use `tonic` as grpc layer. This is enabled by default.
//! * `gzip-tonic`: Use gzip compression for `tonic` grpc layer.
//! * `tls-tonic`: Enable TLS.
//! * `tls-roots`: Adds system trust roots to rustls-based gRPC clients using the rustls-native-certs crate
//! * `tls-webkpi-roots`: Embeds Mozilla's trust roots to rustls-based gRPC clients using the webkpi-roots crate
//!
//! The following feature flags offer additional configurations on http:
//!
//! * `http-proto`: Use http as transport layer, protobuf as body format.
//! * `reqwest-blocking-client`: Use reqwest blocking http client.
//! * `reqwest-client`: Use reqwest http client.
//! * `reqwest-rustls`: Use reqwest with TLS with system trust roots via `rustls-native-certs` crate.
//! * `reqwest-rustls-webkpi-roots`: Use reqwest with TLS with Mozilla's trust roots via `webkpi-roots` crate.
//!
//! # 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.
//!
//! ```no_run
//! use opentelemetry::{KeyValue, trace::Tracer};
//! use opentelemetry_sdk::{trace::{self, RandomIdGenerator, Sampler}, Resource};
//! # #[cfg(feature = "metrics")]
//! use opentelemetry_sdk::metrics::reader::{DefaultAggregationSelector, DefaultTemporalitySelector};
//! use opentelemetry_otlp::{Protocol, WithExportConfig, ExportConfig};
//! use std::time::Duration;
//! # #[cfg(feature = "grpc-tonic")]
//! use tonic::metadata::*;
//!
//! fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
//! # #[cfg(all(feature = "trace", feature = "grpc-tonic"))]
//! # let tracer = {
//! 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_sdk::runtime::Tokio)?;
//! # tracer
//! # };
//!
//! # #[cfg(all(feature = "metrics", feature = "grpc-tonic"))]
//! # {
//! 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(opentelemetry_sdk::runtime::Tokio)
//! .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_resource(Resource::new(vec![KeyValue::new("service.name", "example")]))
//! .with_period(Duration::from_secs(3))
//! .with_timeout(Duration::from_secs(10))
//! .with_aggregation_selector(DefaultAggregationSelector::new())
//! .with_temporality_selector(DefaultTemporalitySelector::new())
//! .build();
//! # }
//!
//! # #[cfg(all(feature = "trace", feature = "grpc-tonic"))]
//! # {
//! tracer.in_span("doing_work", |cx| {
//! // Traced app logic here...
//! });
//! # }
//!
//! Ok(())
//! }
//! ```
pub use crate Compression;
pub use crate ExportConfig;
pub use crate;
pub use crate;
pub use crate;
pub use crate;
use ExportError;
pub use crate HttpExporterBuilder;
pub use crate;
use ;
/// General builder for both tracing and metrics.
;
/// Build a OTLP metrics or tracing exporter builder. See functions below to understand
/// what's currently supported.
;
/// Create a new pipeline builder with the recommended configuration.
///
/// ## Examples
///
/// ```no_run
/// fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
/// # #[cfg(feature = "trace")]
/// let tracing_builder = opentelemetry_otlp::new_pipeline().tracing();
///
/// Ok(())
/// }
/// ```
/// Create a builder to build OTLP metrics exporter or tracing exporter.
/// Wrap type for errors from this crate.
/// The communication protocol to use when exporting data.
/// Placeholder type when no exporter pipeline has been configured in telemetry pipeline.
);