Skip to content

Commit

Permalink
opentelemetry: update to latest otel release version (#1049) (#1099)
Browse files Browse the repository at this point in the history
This backports  #1049, which was already approved on master.

## Motivation

Support the latest OpenTelemetry specification

## Solution

In order to support the latest spec, this patch makes the following
breaking API changes:

* Update `opentelemetry` to 0.10.x
* Update `CompatSpan` to reflect changes to `Span` trait
* Record `u64` values as strings as they are no longer supported in
  OpenTelemetry.

Additionally the following non-public api, doc, and example changes:

* Update examples and docs to use new simplified pipeline builder.
* As `opentelemetry::api` no longer exports trace types, internally use
`opentelemetry::trace as otel` to disambiguate from tracing types.
* Remove `rand` dependency as it is no longer needed

Co-authored-by: Eliza Weisman <eliza@buoyant.io>
# Conflicts:
#	examples/examples/opentelemetry-remote-context.rs
#	tracing-opentelemetry/Cargo.toml
#	tracing-opentelemetry/src/layer.rs
#	tracing-opentelemetry/src/span_ext.rs
#	tracing-opentelemetry/src/tracer.rs
  • Loading branch information
jtescher authored Nov 13, 2020
1 parent 692c56f commit 642ad19
Show file tree
Hide file tree
Showing 9 changed files with 219 additions and 280 deletions.
4 changes: 2 additions & 2 deletions examples/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,5 @@ inferno = "0.10.0"
tempdir = "0.3.7"

# opentelemetry example
opentelemetry = { version = "0.8", default-features = false, features = ["trace"] }
opentelemetry-jaeger = "0.7"
opentelemetry = { version = "0.10", default-features = false, features = ["trace"] }
opentelemetry-jaeger = "0.9"
18 changes: 10 additions & 8 deletions examples/examples/opentelemetry-remote-context.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
use opentelemetry::{api, api::HttpTextFormat};
use opentelemetry::sdk::propagation::B3Propagator;
use opentelemetry::{global, Context};
use std::collections::HashMap;
use tracing::span;
use tracing_opentelemetry::OpenTelemetrySpanExt;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::Registry;

fn make_request(_cx: api::Context) {
fn make_request(_cx: Context) {
// perform external request after injecting context
// e.g. if there are request headers that impl `opentelemetry::api::Carrier`
// e.g. if there are request headers that impl `opentelemetry::propagation::Injector`
// then `propagator.inject_context(cx, request.headers_mut())`
}

Expand All @@ -22,14 +23,15 @@ fn build_example_carrier() -> HashMap<String, String> {
}

fn main() {
// Set a format for propagating context. This MUST be provided, as the default is a no-op.
global::set_text_map_propagator(B3Propagator::new());
let subscriber = Registry::default().with(tracing_opentelemetry::layer());

// Propagator can be swapped with trace context propagator binary propagator, etc.
let propagator = api::B3Propagator::new();

tracing::subscriber::with_default(subscriber, || {
// Extract from request headers, or any type that impls `opentelemetry::api::Carrier`
let parent_context = propagator.extract(&build_example_carrier());
// Extract context from request headers
let parent_context = global::get_text_map_propagator(|propagator| {
propagator.extract(&build_example_carrier())
});

// Generate tracing span as usual
let app_root = span!(tracing::Level::INFO, "app_start");
Expand Down
31 changes: 5 additions & 26 deletions examples/examples/opentelemetry.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
use opentelemetry::api::Provider;
use opentelemetry::sdk;
use std::{thread, time::Duration};
use std::{error::Error, thread, time::Duration};
use tracing::{span, trace, warn};
use tracing_attributes::instrument;
use tracing_subscriber::prelude::*;
Expand All @@ -16,34 +14,15 @@ fn expensive_work() -> &'static str {
"success"
}

fn init_tracer() -> Result<(), Box<dyn std::error::Error>> {
let exporter = opentelemetry_jaeger::Exporter::builder()
.with_agent_endpoint("127.0.0.1:6831".parse().unwrap())
.with_process(opentelemetry_jaeger::Process {
service_name: "report_example".to_string(),
tags: Vec::new(),
})
.init()?;
let provider = sdk::Provider::builder()
.with_simple_exporter(exporter)
.with_config(sdk::Config {
default_sampler: Box::new(sdk::Sampler::AlwaysOn),
..Default::default()
})
.build();
let tracer = provider.get_tracer("tracing");

fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
let (tracer, _uninstall) = opentelemetry_jaeger::new_pipeline()
.with_service_name("report_example")
.install()?;
let opentelemetry = tracing_opentelemetry::layer().with_tracer(tracer);
tracing_subscriber::registry()
.with(opentelemetry)
.try_init()?;

Ok(())
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
init_tracer()?;

let root = span!(tracing::Level::INFO, "app_start", work_units = 2);
let _enter = root.enter();

Expand Down
5 changes: 2 additions & 3 deletions tracing-opentelemetry/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,11 @@ edition = "2018"
default = ["tracing-log"]

[dependencies]
opentelemetry = { version = "0.8", default-features = false, features = ["trace"] }
rand = "0.7"
opentelemetry = { version = "0.10", default-features = false, features = ["trace"] }
tracing = { path = "../tracing", version = "0.1" }
tracing-core = { path = "../tracing-core", version = "0.1" }
tracing-subscriber = { path = "../tracing-subscriber", version = "0.2", default-features = false, features = ["registry"] }
tracing-log = { path = "../tracing-log", version = "0.1", default-features = false, optional = true }

[dev-dependencies]
opentelemetry-jaeger = "0.7"
opentelemetry-jaeger = "0.9"
11 changes: 7 additions & 4 deletions tracing-opentelemetry/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,22 +59,25 @@ The crate provides the following types:
### Basic Usage

```rust
use opentelemetry::{api::Provider, sdk};
use opentelemetry::exporter::trace::stdout;
use tracing::{error, span};
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::Registry;

fn main() {
// Create a new tracer
let tracer = sdk::Provider::default().get_tracer("component_name");
// Install a new OpenTelemetry trace pipeline
let (tracer, _uninstall) = stdout::new_pipeline().install();

// Create a new OpenTelemetry tracing layer
// Create a tracing layer with the configured tracer
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);

// Use the tracing subscriber `Registry`, or any other subscriber
// that impls `LookupSpan`
let subscriber = Registry::default().with(telemetry);

// Trace executed code
tracing::subscriber::with_default(subscriber, || {
// Spans will be sent to the configured OpenTelemetry exporter
let root = span!(tracing::Level::TRACE, "app_start", work_units = 2);
let _enter = root.enter();

Expand Down
Loading

0 comments on commit 642ad19

Please sign in to comment.