1
0
mirror of https://github.com/actix/actix-extras.git synced 2025-07-01 20:25:09 +02:00

Support otel 0.24 (#127)

* Support otel 0.24

* fix the otel example

* Fix examples and last bits

* Update examples/custom-root-span/src/main.rs

* Update examples/opentelemetry/src/main.rs

---------

Co-authored-by: Luca Palmieri <20745048+LukeMathWalker@users.noreply.github.com>
This commit is contained in:
Omid Rad
2024-09-02 11:17:49 +02:00
committed by GitHub
parent 516e90cea7
commit 9f180d6eb9
10 changed files with 93 additions and 35 deletions

View File

@ -2,16 +2,19 @@
name = "custom-root-span"
version = "0.1.0"
authors = ["LukeMathWalker <contact@lpalmieri.com>"]
edition = "2018"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
actix-web = "4"
opentelemetry = "0.22"
opentelemetry-jaeger = { version = "0.21", features = ["rt-tokio-current-thread"] }
tracing-opentelemetry = { version = "0.23" }
tracing = "0.1.19"
once_cell = "1.19"
opentelemetry = "0.24"
opentelemetry-otlp = "0.17"
opentelemetry_sdk = { version = "0.24", features = ["rt-tokio-current-thread"] }
opentelemetry-semantic-conventions = "0.16"
tracing-opentelemetry = { version = "0.25" }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] }
tracing-bunyan-formatter = "0.3"
tracing-actix-web = { path = "../.." }
tracing-actix-web = { path = "../..", features = ["opentelemetry_0_24"] }

View File

@ -1,15 +1,19 @@
use actix_web::body::MessageBody;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::{web, App, Error, HttpServer};
use opentelemetry::{
global, runtime::TokioCurrentThread, sdk::propagation::TraceContextPropagator,
use once_cell::sync::Lazy;
use opentelemetry::trace::TracerProvider;
use opentelemetry::{global, KeyValue};
use opentelemetry_otlp::WithExportConfig;
use opentelemetry_sdk::{
propagation::TraceContextPropagator, runtime::TokioCurrentThread, trace::Config, Resource,
};
use opentelemetry_semantic_conventions::resource;
use std::io;
use tracing::Span;
use tracing_actix_web::{DefaultRootSpanBuilder, RootSpan, RootSpanBuilder, TracingLogger};
use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::{EnvFilter, Registry};
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
/// We will define a custom root span builder to capture additional fields, specific
/// to our application, on top of the ones provided by `DefaultRootSpanBuilder` out of the box.
@ -68,22 +72,40 @@ async fn main() -> io::Result<()> {
Ok(())
}
const APP_NAME: &str = "tracing-actix-web-demo";
static RESOURCE: Lazy<Resource> =
Lazy::new(|| Resource::new(vec![KeyValue::new(resource::SERVICE_NAME, APP_NAME)]));
/// Init a `tracing` subscriber that prints spans to stdout as well as
/// ships them to Jaeger.
///
/// Check the `opentelemetry` example for more details.
fn init_telemetry() {
let app_name = "tracing-actix-web-demo";
// Start a new otlp trace pipeline.
// Spans are exported in batch - recommended setup for a production application.
global::set_text_map_propagator(TraceContextPropagator::new());
let tracer = opentelemetry_jaeger::new_agent_pipeline()
.with_service_name(app_name)
let tracer = opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint("http://localhost:4317"),
)
.with_trace_config(Config::default().with_resource(RESOURCE.clone()))
.install_batch(TokioCurrentThread)
.expect("Failed to install OpenTelemetry tracer.");
.expect("Failed to install OpenTelemetry tracer.")
.tracer_builder(APP_NAME)
.build();
// Filter based on level - trace, debug, info, warn, error
// Tunable via `RUST_LOG` env variable
let env_filter = EnvFilter::try_from_default_env().unwrap_or(EnvFilter::new("info"));
// Create a `tracing` layer using the otlp tracer
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
let formatting_layer = BunyanFormattingLayer::new(app_name.into(), std::io::stdout);
// Create a `tracing` layer to emit spans as structured logs to stdout
let formatting_layer = BunyanFormattingLayer::new(APP_NAME.into(), std::io::stdout);
// Combined them all together in a `tracing` subscriber
let subscriber = Registry::default()
.with(env_filter)
.with(telemetry)

View File

@ -2,16 +2,19 @@
name = "otel"
version = "0.1.0"
authors = ["Luca Palmieri <rust@lpalmieri.com>"]
edition = "2018"
edition = "2021"
license = "MIT/Apache-2.0"
[dependencies]
actix-web = "4"
tracing = "0.1.19"
opentelemetry = "0.23"
opentelemetry-jaeger = { version = "0.22", features = ["rt-tokio-current-thread"] }
tracing-opentelemetry = { version = "0.24" }
once_cell = "1.19"
opentelemetry = "0.24"
opentelemetry_sdk = { version = "0.24", features = ["rt-tokio-current-thread"] }
opentelemetry-otlp = "0.17"
opentelemetry-semantic-conventions = "0.16"
tracing-opentelemetry = "0.25"
tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] }
tracing-bunyan-formatter = "0.3"
tracing-actix-web = { path = "../..", features = ["opentelemetry_0_23"] }
tracing-actix-web = { path = "../..", features = ["opentelemetry_0_24"] }
tracing = "0.1.40"

View File

@ -1,35 +1,50 @@
use actix_web::{web, App, HttpServer};
use opentelemetry::{
global, runtime::TokioCurrentThread, sdk::propagation::TraceContextPropagator,
use once_cell::sync::Lazy;
use opentelemetry::trace::TracerProvider;
use opentelemetry::{global, KeyValue};
use opentelemetry_otlp::WithExportConfig;
use opentelemetry_sdk::{
propagation::TraceContextPropagator, runtime::TokioCurrentThread, trace::Config, Resource,
};
use opentelemetry_semantic_conventions::resource;
use std::io;
use tracing_actix_web::TracingLogger;
use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::{EnvFilter, Registry};
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
const APP_NAME: &str = "tracing-actix-web-demo";
static RESOURCE: Lazy<Resource> =
Lazy::new(|| Resource::new(vec![KeyValue::new(resource::SERVICE_NAME, APP_NAME)]));
async fn hello() -> &'static str {
"Hello world!"
}
fn init_telemetry() {
let app_name = "tracing-actix-web-demo";
// Start a new Jaeger trace pipeline.
// Start a new otlp trace pipeline.
// Spans are exported in batch - recommended setup for a production application.
global::set_text_map_propagator(TraceContextPropagator::new());
let tracer = opentelemetry_jaeger::new_agent_pipeline()
.with_service_name(app_name)
let tracer = opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint("http://localhost:4317"),
)
.with_trace_config(Config::default().with_resource(RESOURCE.clone()))
.install_batch(TokioCurrentThread)
.expect("Failed to install OpenTelemetry tracer.");
.expect("Failed to install OpenTelemetry tracer.")
.tracer_builder(APP_NAME)
.build();
// Filter based on level - trace, debug, info, warn, error
// Tunable via `RUST_LOG` env variable
let env_filter = EnvFilter::try_from_default_env().unwrap_or(EnvFilter::new("info"));
// Create a `tracing` layer using the Jaeger tracer
// Create a `tracing` layer using the otlp tracer
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
// Create a `tracing` layer to emit spans as structured logs to stdout
let formatting_layer = BunyanFormattingLayer::new(app_name.into(), std::io::stdout);
let formatting_layer = BunyanFormattingLayer::new(APP_NAME.into(), std::io::stdout);
// Combined them all together in a `tracing` subscriber
let subscriber = Registry::default()
.with(env_filter)