Skip to content

Commit

Permalink
Merge branch 'main' into resource-share
Browse files Browse the repository at this point in the history
  • Loading branch information
lalitb authored Feb 14, 2024
2 parents 9168ec9 + 054b0c8 commit dd1a311
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 9 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@
**/*.rs.bk
Cargo.lock
/.idea/

.cosine
4 changes: 2 additions & 2 deletions opentelemetry-http/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[package]
name = "opentelemetry-http"
version = "0.10.0"
description = "Helper implementations for exchange of traces and metrics over HTTP"
description = "Helper implementations for sending HTTP requests. Uses include propagating and extracting context over http, exporting telemetry, requesting sampling strategies."
homepage = "https://github.com/open-telemetry/opentelemetry-rust"
repository = "https://github.com/open-telemetry/opentelemetry-rust"
keywords = ["opentelemetry", "tracing", "metrics"]
keywords = ["opentelemetry", "tracing", "context", "propagation"]
license = "Apache-2.0"
edition = "2021"
rust-version = "1.65"
Expand Down
12 changes: 11 additions & 1 deletion opentelemetry-http/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ pub use bytes::Bytes;
pub use http::{Request, Response};
use opentelemetry::propagation::{Extractor, Injector};

/// Helper for injecting headers into HTTP Requests. This is used for OpenTelemetry context
/// propagation over HTTP.
/// See [this](https://github.com/open-telemetry/opentelemetry-rust/blob/main/examples/tracing-http-propagator/README.md)
/// for example usage.
pub struct HeaderInjector<'a>(pub &'a mut http::HeaderMap);

impl<'a> Injector for HeaderInjector<'a> {
Expand All @@ -20,6 +24,10 @@ impl<'a> Injector for HeaderInjector<'a> {
}
}

/// Helper for extracting headers from HTTP Requests. This is used for OpenTelemetry context
/// propagation over HTTP.
/// See [this](https://github.com/open-telemetry/opentelemetry-rust/blob/main/examples/tracing-http-propagator/README.md)
/// for example usage.
pub struct HeaderExtractor<'a>(pub &'a http::HeaderMap);

impl<'a> Extractor for HeaderExtractor<'a> {
Expand All @@ -39,7 +47,9 @@ impl<'a> Extractor for HeaderExtractor<'a> {

pub type HttpError = Box<dyn std::error::Error + Send + Sync + 'static>;

/// A minimal interface necessary for export spans over HTTP.
/// A minimal interface necessary for sending requests over HTTP.
/// Used primarily for exporting telemetry over HTTP. Also used for fetching
/// sampling strategies for JaegerRemoteSampler
///
/// Users sometime choose HTTP clients that relay on a certain async runtime. This trait allows
/// users to bring their choice of HTTP client.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,8 @@ mod collector_client_tests {
use opentelemetry::trace::TraceError;
use opentelemetry_sdk::runtime::Tokio;

// Ignore this test as it is flaky and the opentelemetry-jaeger is on-track for deprecation
#[ignore]
#[test]
fn test_bring_your_own_client() -> Result<(), TraceError> {
let invalid_uri_builder = new_collector_pipeline()
Expand Down
2 changes: 2 additions & 0 deletions opentelemetry-jaeger/src/exporter/config/collector/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,8 @@ mod tests {
assert!(valid_uri.is_ok());
}

// Ignore this test as it is flaky and the opentelemetry-jaeger is on-track for deprecation
#[ignore]
#[test]
fn test_collector_exporter() {
let exporter = new_collector_pipeline()
Expand Down
38 changes: 35 additions & 3 deletions opentelemetry-sdk/src/metrics/periodic_reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -409,20 +409,52 @@ impl MetricReader for PeriodicReader {
mod tests {
use super::PeriodicReader;
use crate::{
metrics::data::ResourceMetrics, metrics::reader::MetricReader, runtime,
testing::metrics::InMemoryMetricsExporter, Resource,
metrics::data::ResourceMetrics, metrics::reader::MetricReader, metrics::SdkMeterProvider,
runtime, testing::metrics::InMemoryMetricsExporter, Resource,
};
use opentelemetry::metrics::MeterProvider;
use std::sync::mpsc;

#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
async fn registration_triggers_collection() {
// Arrange
let interval = std::time::Duration::from_millis(1);
let exporter = InMemoryMetricsExporter::default();
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio)
.with_interval(interval)
.build();
let (sender, receiver) = mpsc::channel();

// Act
let meter_provider = SdkMeterProvider::builder().with_reader(reader).build();
let meter = meter_provider.meter("test");
let counter = meter.u64_observable_counter("testcounter").init();
meter
.register_callback(&[counter.as_any()], move |_| {
sender.send(()).expect("channel should still be open");
})
.expect("callback registration should succeed");

// Assert
receiver
.recv_timeout(interval * 2)
.expect("message should be available in channel, indicating a collection occurred");
}

#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
async fn unregistered_collect() {
// Arrange
let exporter = InMemoryMetricsExporter::default();
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio).build();

let mut rm = ResourceMetrics {
resource: Resource::empty(),
scope_metrics: Vec::new(),
};

// Act
let result = reader.collect(&mut rm);

// Assert
result.expect_err("error expected when reader is not registered");
}
}
9 changes: 6 additions & 3 deletions opentelemetry-sdk/src/propagation/trace_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,12 @@ impl TraceContextPropagator {
// supported sampling bit.
let trace_flags = TraceFlags::new(opts) & TraceFlags::SAMPLED;

let trace_state: TraceState =
TraceState::from_str(extractor.get(TRACESTATE_HEADER).unwrap_or(""))
.unwrap_or_else(|_| TraceState::default());
let trace_state = match extractor.get(TRACESTATE_HEADER) {
Some(trace_state_str) => {
TraceState::from_str(trace_state_str).unwrap_or_else(|_| TraceState::default())
}
None => TraceState::default(),
};

// create context
let span_context = SpanContext::new(trace_id, span_id, trace_flags, true, trace_state);
Expand Down

0 comments on commit dd1a311

Please sign in to comment.