[−][src]Crate opentelemetry_jaeger
Collects OpenTelemetry spans and reports them to a given Jaeger
agent
or collector
endpoint. See the Jaeger Docs for details
about Jaeger and deployment information.
Quickstart
First make sure you have a running version of the Jaeger instance you want to send data to:
$ docker run -d -p6831:6831/udp -p6832:6832/udp -p16686:16686 -p14268:14268 jaegertracing/all-in-one:latest
Then install a new jaeger pipeline with the recommended defaults to start exporting telemetry:
use opentelemetry::api::trace::Tracer; fn main() -> Result<(), Box<dyn std::error::Error>> { let (tracer, _uninstall) = opentelemetry_jaeger::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-jaeger = { version = "*", features = ["tokio"] }
Jaeger Exporter From Environment Variables
The jaeger pipeline builder can be configured dynamically via the
from_env
method. All variables are optinal, a full list of accepted
options can be found in the jaeger variables spec.
use opentelemetry::api::trace::Tracer; fn main() -> Result<(), Box<dyn std::error::Error>> { // export OTEL_SERVICE_NAME=my-service-name let (tracer, _uninstall) = opentelemetry_jaeger::new_pipeline().from_env().install()?; tracer.in_span("doing_work", |cx| { // Traced app logic here... }); Ok(()) }
Jaeger Collector Example
If you want to skip the agent and submit spans directly to a Jaeger collector,
you can enable the optional collector_client
feature for this crate. This
example expects a Jaeger collector running on http://localhost:14268
.
[dependencies]
opentelemetry-jaeger = { version = "..", features = ["collector_client"] }
Then you can use the with_collector_endpoint
method to specify the endpoint:
// Note that this requires the `collector_client` feature. use opentelemetry::api::trace::Tracer; fn main() -> Result<(), Box<dyn std::error::Error>> { let (tracer, _uninstall) = opentelemetry_jaeger::new_pipeline() .with_collector_endpoint("http://localhost:14268/api/traces") // optionally set username and password as well. .with_collector_username("username") .with_collector_password("s3cr3t") .install()?; tracer.in_span("doing_work", |cx| { // Traced app logic here... }); Ok(()) }
Kitchen Sink Full Configuration
Example showing how to override all configuration options. See the
PipelineBuilder
docs for details of each option.
use opentelemetry::api::{KeyValue, trace::Tracer}; use opentelemetry::sdk::{trace::{self, IdGenerator, Sampler}, Resource}; fn main() -> Result<(), Box<dyn std::error::Error>> { let (tracer, _uninstall) = opentelemetry_jaeger::new_pipeline() .from_env() .with_agent_endpoint("localhost:6831") .with_service_name("my_app") .with_tags(vec![KeyValue::new("process_key", "process_value")]) .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(()) }
Structs
Exporter | Jaeger span exporter |
PipelineBuilder | Jaeger exporter builder |
Process | Jaeger process configuration |
Uninstall | Guard that uninstalls the Jaeger trace pipeline when dropped |
Functions
new_pipeline | Create a new Jaeger exporter pipeline builder. |