Skip to content

Commit 4300a78

Browse files
authored
Merge branch 'main' into fix-metrics-u64-serialization
2 parents 03d5e9a + 144fdd9 commit 4300a78

File tree

107 files changed

+2829
-1105
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+2829
-1105
lines changed

.cspell.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
// workspace dictionary.
2727
"words": [
2828
"actix",
29+
"anyvalue",
2930
"appender",
3031
"appenders",
3132
"Bhasin",
@@ -37,6 +38,7 @@
3738
"deque",
3839
"Dirkjan",
3940
"EPYC",
41+
"flamegraph",
4042
"hasher",
4143
"Isobel",
4244
"jaegertracing",
@@ -53,17 +55,21 @@
5355
"OTELCOL",
5456
"OTLP",
5557
"periodicreader",
58+
"pprof",
5659
"prost",
5760
"protoc",
5861
"quantile",
5962
"Redelmeier",
6063
"reqwest",
6164
"runtimes",
6265
"rustc",
66+
"serde",
6367
"shoppingcart",
6468
"struct",
6569
"Tescher",
70+
"testcontainers",
6671
"testresults",
72+
"thiserror",
6773
"tracerprovider",
6874
"updown",
6975
"Zhongyang",

.github/workflows/integration_tests.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ jobs:
99
integration_tests:
1010
runs-on: ubuntu-latest
1111
timeout-minutes: 10
12-
if: ${{ github.event.label.name == 'integration tests' || contains(github.event.pull_request.labels.*.name, 'integration tests') }}
1312
steps:
1413
- name: Free disk space
1514
run: |

Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ members = [
88
"stress",
99
]
1010
resolver = "2"
11+
# Avoid applying patch to force use of workspace members for this
12+
# not actively maintained crate
13+
exclude = ["opentelemetry-prometheus"]
1114

1215
[profile.bench]
1316
# https://doc.rust-lang.org/cargo/reference/profiles.html#bench
@@ -50,3 +53,9 @@ tracing = { version = ">=0.1.40", default-features = false }
5053
tracing-core = { version = ">=0.1.33", default-features = false }
5154
tracing-subscriber = { version = "0.3", default-features = false }
5255
url = { version = "2.5", default-features = false }
56+
57+
# Aviod use of crates.io version of these crates through the tracing-opentelemetry dependencies
58+
[patch.crates-io]
59+
opentelemetry = { path = "opentelemetry" }
60+
opentelemetry_sdk = { path = "opentelemetry-sdk" }
61+
opentelemetry-stdout = { path = "opentelemetry-stdout" }

opentelemetry-appender-log/src/lib.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,9 @@ use opentelemetry::{
116116
InstrumentationScope, Key,
117117
};
118118
#[cfg(feature = "experimental_metadata_attributes")]
119-
use opentelemetry_semantic_conventions::attribute::{CODE_FILEPATH, CODE_LINENO, CODE_NAMESPACE};
119+
use opentelemetry_semantic_conventions::attribute::{
120+
CODE_FILEPATH, CODE_LINE_NUMBER, CODE_NAMESPACE,
121+
};
120122

121123
pub struct OpenTelemetryLogBridge<P, L>
122124
where
@@ -158,7 +160,7 @@ where
158160
}
159161

160162
if let Some(line_no) = record.line() {
161-
log_record.add_attribute(Key::new(CODE_LINENO), AnyValue::from(line_no));
163+
log_record.add_attribute(Key::new(CODE_LINE_NUMBER), AnyValue::from(line_no));
162164
}
163165

164166
if let Some(module) = record.module_path() {
@@ -769,7 +771,7 @@ mod tests {
769771
use super::OpenTelemetryLogBridge;
770772

771773
use opentelemetry::{logs::AnyValue, StringValue};
772-
use opentelemetry_sdk::{logs::LoggerProvider, testing::logs::InMemoryLogExporter};
774+
use opentelemetry_sdk::{logs::InMemoryLogExporter, logs::LoggerProvider};
773775

774776
use log::Log;
775777

@@ -1171,7 +1173,7 @@ mod tests {
11711173
#[test]
11721174
fn logbridge_code_attributes() {
11731175
use opentelemetry_semantic_conventions::attribute::{
1174-
CODE_FILEPATH, CODE_LINENO, CODE_NAMESPACE,
1176+
CODE_FILEPATH, CODE_LINE_NUMBER, CODE_NAMESPACE,
11751177
};
11761178

11771179
let exporter = InMemoryLogExporter::default();
@@ -1212,7 +1214,7 @@ mod tests {
12121214
Some(AnyValue::String(StringValue::from("service"))),
12131215
get(CODE_NAMESPACE)
12141216
);
1215-
assert_eq!(Some(AnyValue::Int(101)), get(CODE_LINENO));
1217+
assert_eq!(Some(AnyValue::Int(101)), get(CODE_LINE_NUMBER));
12161218
}
12171219

12181220
#[test]

opentelemetry-appender-tracing/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## vNext
44

55
- Bump msrv to 1.75.0.
6+
- New experimental feature to use trace\_id & span\_id from spans created through the [tracing](https://crates.io/crates/tracing) crate (experimental_use_tracing_span_context) [#2438](https://github.com/open-telemetry/opentelemetry-rust/pull/2438)
67

78

89
## 0.27.0

opentelemetry-appender-tracing/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ tracing = { workspace = true, features = ["std"]}
1717
tracing-core = { workspace = true }
1818
tracing-log = { version = "0.2", optional = true }
1919
tracing-subscriber = { workspace = true, features = ["registry", "std"] }
20+
tracing-opentelemetry = { version = "0.28", optional = true }
2021

2122
[dev-dependencies]
2223
log = { workspace = true }
@@ -28,11 +29,12 @@ criterion = { workspace = true }
2829
tokio = { workspace = true, features = ["full"]}
2930

3031
[target.'cfg(not(target_os = "windows"))'.dev-dependencies]
31-
pprof = { version = "0.13", features = ["flamegraph", "criterion"] }
32+
pprof = { version = "0.14", features = ["flamegraph", "criterion"] }
3233

3334
[features]
3435
experimental_metadata_attributes = ["dep:tracing-log"]
3536
spec_unstable_logs_enabled = ["opentelemetry/spec_unstable_logs_enabled"]
37+
experimental_use_tracing_span_context = ["tracing-opentelemetry"]
3638

3739

3840
[[bench]]

opentelemetry-appender-tracing/benches/logs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
use criterion::{criterion_group, criterion_main, Criterion};
1717
use opentelemetry::InstrumentationScope;
1818
use opentelemetry_appender_tracing::layer as tracing_layer;
19-
use opentelemetry_sdk::export::logs::{LogBatch, LogExporter};
2019
use opentelemetry_sdk::logs::LogResult;
20+
use opentelemetry_sdk::logs::{LogBatch, LogExporter};
2121
use opentelemetry_sdk::logs::{LogProcessor, LogRecord, LoggerProvider};
2222
use opentelemetry_sdk::Resource;
2323
use pprof::criterion::{Output, PProfProfiler};

opentelemetry-appender-tracing/src/layer.rs

Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use tracing_core::Level;
88
use tracing_core::Metadata;
99
#[cfg(feature = "experimental_metadata_attributes")]
1010
use tracing_log::NormalizeEvent;
11-
use tracing_subscriber::Layer;
11+
use tracing_subscriber::{registry::LookupSpan, Layer};
1212

1313
const INSTRUMENTATION_LIBRARY_NAME: &str = "opentelemetry-appender-tracing";
1414

@@ -149,7 +149,7 @@ where
149149

150150
impl<S, P, L> Layer<S> for OpenTelemetryTracingBridge<P, L>
151151
where
152-
S: tracing::Subscriber,
152+
S: tracing::Subscriber + for<'a> LookupSpan<'a>,
153153
P: LoggerProvider<Logger = L> + Send + Sync + 'static,
154154
L: Logger + Send + Sync + 'static,
155155
{
@@ -180,6 +180,26 @@ where
180180
// Visit fields.
181181
event.record(&mut visitor);
182182

183+
#[cfg(feature = "experimental_use_tracing_span_context")]
184+
if let Some(span) = _ctx.event_span(event) {
185+
use tracing_opentelemetry::OtelData;
186+
let opt_span_id = span
187+
.extensions()
188+
.get::<OtelData>()
189+
.and_then(|otd| otd.builder.span_id);
190+
191+
let opt_trace_id = span.scope().last().and_then(|root_span| {
192+
root_span
193+
.extensions()
194+
.get::<OtelData>()
195+
.and_then(|otd| otd.builder.trace_id)
196+
});
197+
198+
if let Some((trace_id, span_id)) = opt_trace_id.zip(opt_span_id) {
199+
log_record.set_trace_context(trace_id, span_id, None);
200+
}
201+
}
202+
183203
//emit record
184204
self.logger.emit(log_record);
185205
}
@@ -213,9 +233,9 @@ mod tests {
213233
use opentelemetry::trace::TracerProvider as _;
214234
use opentelemetry::trace::{TraceContextExt, TraceFlags, Tracer};
215235
use opentelemetry::{logs::AnyValue, Key};
216-
use opentelemetry_sdk::export::logs::{LogBatch, LogExporter};
236+
use opentelemetry_sdk::logs::InMemoryLogExporter;
237+
use opentelemetry_sdk::logs::{LogBatch, LogExporter};
217238
use opentelemetry_sdk::logs::{LogRecord, LogResult, LoggerProvider};
218-
use opentelemetry_sdk::testing::logs::InMemoryLogExporter;
219239
use opentelemetry_sdk::trace::{Sampler, TracerProvider};
220240
use tracing::{error, warn};
221241
use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt;
@@ -495,6 +515,67 @@ mod tests {
495515
}
496516
}
497517

518+
#[cfg(feature = "experimental_use_tracing_span_context")]
519+
#[test]
520+
fn tracing_appender_inside_tracing_crate_context() {
521+
use opentelemetry_sdk::trace::InMemorySpanExporterBuilder;
522+
523+
// Arrange
524+
let exporter: InMemoryLogExporter = InMemoryLogExporter::default();
525+
let logger_provider = LoggerProvider::builder()
526+
.with_simple_exporter(exporter.clone())
527+
.build();
528+
529+
// setup tracing layer to compare trace/span IDs against
530+
let span_exporter = InMemorySpanExporterBuilder::new().build();
531+
let tracer_provider = TracerProvider::builder()
532+
.with_simple_exporter(span_exporter.clone())
533+
.build();
534+
let tracer = tracer_provider.tracer("test-tracer");
535+
536+
let level_filter = tracing_subscriber::filter::LevelFilter::INFO;
537+
let log_layer =
538+
layer::OpenTelemetryTracingBridge::new(&logger_provider).with_filter(level_filter);
539+
540+
let subscriber = tracing_subscriber::registry()
541+
.with(log_layer)
542+
.with(tracing_opentelemetry::layer().with_tracer(tracer));
543+
544+
// Avoiding global subscriber.init() as that does not play well with unit tests.
545+
let _guard = tracing::subscriber::set_default(subscriber);
546+
547+
// Act
548+
tracing::info_span!("outer-span").in_scope(|| {
549+
error!("first-event");
550+
551+
tracing::info_span!("inner-span").in_scope(|| {
552+
error!("second-event");
553+
});
554+
});
555+
556+
logger_provider.force_flush();
557+
558+
let logs = exporter.get_emitted_logs().expect("No emitted logs");
559+
assert_eq!(logs.len(), 2);
560+
561+
let spans = span_exporter.get_finished_spans().unwrap();
562+
assert_eq!(spans.len(), 2);
563+
564+
let trace_id = spans[0].span_context.trace_id();
565+
assert_eq!(trace_id, spans[1].span_context.trace_id());
566+
let inner_span_id = spans[0].span_context.span_id();
567+
let outer_span_id = spans[1].span_context.span_id();
568+
assert_eq!(outer_span_id, spans[0].parent_span_id);
569+
570+
let trace_ctx0 = logs[0].record.trace_context().unwrap();
571+
let trace_ctx1 = logs[1].record.trace_context().unwrap();
572+
573+
assert_eq!(trace_ctx0.trace_id, trace_id);
574+
assert_eq!(trace_ctx1.trace_id, trace_id);
575+
assert_eq!(trace_ctx0.span_id, outer_span_id);
576+
assert_eq!(trace_ctx1.span_id, inner_span_id);
577+
}
578+
498579
#[test]
499580
fn tracing_appender_standalone_with_tracing_log() {
500581
// Arrange

opentelemetry-otlp/examples/basic-otlp-http/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ license = "Apache-2.0"
66
publish = false
77

88
[features]
9+
default = ["reqwest-blocking"]
910
reqwest-blocking = ["opentelemetry-otlp/reqwest-blocking-client"]
10-
hyper = ["opentelemetry-otlp/hyper-client"]
1111

1212
[dependencies]
1313
once_cell = { workspace = true }
1414
opentelemetry = { path = "../../../opentelemetry" }
15-
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "experimental_metrics_periodicreader_with_async_runtime"]}
16-
opentelemetry-otlp = { path = "../..", features = ["http-proto", "http-json", "logs", "internal-logs"]}
15+
opentelemetry_sdk = { path = "../../../opentelemetry-sdk" }
16+
opentelemetry-otlp = { path = "../..", features = ["http-proto", "http-json", "logs", "internal-logs"], default-features = false}
1717
opentelemetry-appender-tracing = { path = "../../../opentelemetry-appender-tracing", default-features = false}
1818

1919
tokio = { workspace = true, features = ["full"] }

opentelemetry-otlp/examples/basic-otlp-http/Dockerfile

Lines changed: 0 additions & 6 deletions
This file was deleted.

opentelemetry-otlp/examples/basic-otlp-http/README.md

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,46 +16,25 @@ recommended approach when using OTLP exporters. While it can be modified to use
1616
a `SimpleExporter`, this requires making the main function a regular main and
1717
*not* tokio main.
1818

19-
// TODO: Document `hyper` feature flag when using SimpleProcessor.
19+
// TODO: Document how to use hyper client.
2020

2121
## Usage
2222

23-
### `docker-compose`
24-
25-
By default runs against the `otel/opentelemetry-collector:latest` image, and uses `reqwest-client`
26-
as the http client, using http as the transport.
27-
28-
```shell
29-
docker-compose up
30-
```
31-
32-
In another terminal run the application `cargo run`
33-
34-
The docker-compose terminal will display logs, traces, metrics.
35-
36-
Press Ctrl+C to stop the collector, and then tear it down:
37-
38-
```shell
39-
docker-compose down
40-
```
41-
42-
### Manual
43-
44-
If you don't want to use `docker-compose`, you can manually run the `otel/opentelemetry-collector` container
45-
and inspect the logs to see traces being transferred.
23+
Run the `otel/opentelemetry-collector` container using docker
24+
and inspect the logs to see the exported telemetry.
4625

4726
On Unix based systems use:
4827

4928
```shell
5029
# From the current directory, run `opentelemetry-collector`
51-
docker run --rm -it -p 4318:4318 -v $(pwd):/cfg otel/opentelemetry-collector:latest --config=/cfg/otel-collector-config.yaml
30+
docker run --rm -it -p 4317:4317 -p 4318:4318 -v $(pwd):/cfg otel/opentelemetry-collector:latest --config=/cfg/otel-collector-config.yaml
5231
```
5332

5433
On Windows use:
5534

5635
```shell
5736
# From the current directory, run `opentelemetry-collector`
58-
docker run --rm -it -p 4318:4318 -v "%cd%":/cfg otel/opentelemetry-collector:latest --config=/cfg/otel-collector-config.yaml
37+
docker run --rm -it -p 4317:4317 -p 4318:4318 -v "%cd%":/cfg otel/opentelemetry-collector:latest --config=/cfg/otel-collector-config.yaml
5938
```
6039

6140
Run the app which exports logs, metrics and traces via OTLP to the collector
@@ -64,11 +43,7 @@ Run the app which exports logs, metrics and traces via OTLP to the collector
6443
cargo run
6544
```
6645

67-
By default the app will use a `reqwest` client to send. A hyper 0.14 client can be used with the `hyper` feature enabled
68-
69-
```shell
70-
cargo run --no-default-features --features=hyper
71-
```
46+
The app will use a `reqwest-blocking` client to send.
7247

7348
## View results
7449

opentelemetry-otlp/examples/basic-otlp-http/docker-compose.yaml

Lines changed: 0 additions & 15 deletions
This file was deleted.

opentelemetry-otlp/examples/basic-otlp-http/src/main.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,8 @@ fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, Metric
6969
.build())
7070
}
7171

72-
// #[tokio::main]
73-
// TODO: Re-enable tokio::main, if needed, after
74-
fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
72+
#[tokio::main]
73+
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
7574
let logger_provider = init_logs()?;
7675

7776
// Create a new OpenTelemetryTracingBridge using the above LoggerProvider.

0 commit comments

Comments
 (0)