Skip to content

Commit a2c8c7d

Browse files
cijothomaslalitbutpilla
authored
Simplified stdout exporter for logs and traces (#2040)
Co-authored-by: Lalit Kumar Bhasin <labhas@microsoft.com> Co-authored-by: Utkarsh Umesan Pillai <66651184+utpilla@users.noreply.github.com>
1 parent 322c985 commit a2c8c7d

File tree

16 files changed

+473
-1118
lines changed

16 files changed

+473
-1118
lines changed

examples/logs-basic/src/main.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@ use opentelemetry_semantic_conventions::resource::SERVICE_NAME;
77

88
fn main() {
99
// Setup LoggerProvider with a stdout exporter
10-
let exporter = opentelemetry_stdout::LogExporterBuilder::default()
11-
// uncomment the below lines to pretty print output.
12-
// .with_encoder(|writer, data|
13-
// Ok(serde_json::to_writer_pretty(writer, &data).unwrap()))
14-
.build();
10+
let exporter = opentelemetry_stdout::LogExporter::default();
1511
let logger_provider = LoggerProvider::builder()
1612
.with_resource(Resource::new([KeyValue::new(
1713
SERVICE_NAME,

examples/tracing-grpc/src/client.rs

+2-10
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use opentelemetry::{global, propagation::Injector};
44
use opentelemetry_sdk::{
55
propagation::TraceContextPropagator, runtime::Tokio, trace::TracerProvider,
66
};
7-
use opentelemetry_stdout::SpanExporterBuilder;
7+
use opentelemetry_stdout::SpanExporter;
88

99
use opentelemetry::{
1010
trace::{SpanKind, TraceContextExt, Tracer},
@@ -15,15 +15,7 @@ fn init_tracer() {
1515
global::set_text_map_propagator(TraceContextPropagator::new());
1616
// Install stdout exporter pipeline to be able to retrieve the collected spans.
1717
let provider = TracerProvider::builder()
18-
.with_batch_exporter(
19-
SpanExporterBuilder::default()
20-
.with_encoder(|writer, data| {
21-
serde_json::to_writer_pretty(writer, &data).unwrap();
22-
Ok(())
23-
})
24-
.build(),
25-
Tokio,
26-
)
18+
.with_batch_exporter(SpanExporter::default(), Tokio)
2719
.build();
2820

2921
global::set_tracer_provider(provider);

examples/tracing-grpc/src/server.rs

+2-10
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,14 @@ use opentelemetry::{
88
use opentelemetry_sdk::{
99
propagation::TraceContextPropagator, runtime::Tokio, trace::TracerProvider,
1010
};
11-
use opentelemetry_stdout::SpanExporterBuilder;
11+
use opentelemetry_stdout::SpanExporter;
1212
use tonic::{transport::Server, Request, Response, Status};
1313

1414
fn init_tracer() {
1515
global::set_text_map_propagator(TraceContextPropagator::new());
1616
// Install stdout exporter pipeline to be able to retrieve the collected spans.
1717
let provider = TracerProvider::builder()
18-
.with_batch_exporter(
19-
SpanExporterBuilder::default()
20-
.with_encoder(|writer, data| {
21-
serde_json::to_writer_pretty(writer, &data).unwrap();
22-
Ok(())
23-
})
24-
.build(),
25-
Tokio,
26-
)
18+
.with_batch_exporter(SpanExporter::default(), Tokio)
2719
.build();
2820

2921
global::set_tracer_provider(provider);

opentelemetry-appender-log/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//! # #[tokio::main] async fn main() {
1313
//! # use opentelemetry_sdk::logs::{BatchLogProcessor, LoggerProvider};
1414
//! # use opentelemetry_sdk::runtime;
15-
//! let exporter = opentelemetry_stdout::LogExporterBuilder::default().build();
15+
//! let exporter = opentelemetry_stdout::LogExporter::default();
1616
//!
1717
//! let logger_provider = LoggerProvider::builder()
1818
//! .with_log_processor(BatchLogProcessor::builder(exporter, runtime::Tokio).build())
@@ -27,7 +27,7 @@
2727
//! # use opentelemetry_sdk::logs::{BatchLogProcessor, LoggerProvider};
2828
//! # use opentelemetry_sdk::runtime;
2929
//! # use opentelemetry_appender_log::OpenTelemetryLogBridge;
30-
//! # let exporter = opentelemetry_stdout::LogExporterBuilder::default().build();
30+
//! # let exporter = opentelemetry_stdout::LogExporter::default();
3131
//! # let logger_provider = LoggerProvider::builder()
3232
//! # .with_log_processor(BatchLogProcessor::builder(exporter, runtime::Tokio).build())
3333
//! # .build();

opentelemetry-stdout/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
- **Breaking** [1994](https://github.com/open-telemetry/opentelemetry-rust/pull/1994) The logrecord event-name is added as attribute with
66
key `name` only if the feature flag `populate-logs-event-name` is enabled.
7+
- **Breaking** [2040](https://github.com/open-telemetry/opentelemetry-rust/pull/2040) Simplified stdout exporter:
8+
- Now only supports writing to stdout, removing ability to send telemetry to other streams.
9+
- Output format improved for better human readability.
10+
- Note: This exporter is intended for learning and debugging purposes only. Not recommended for production use or automated parsing.
711

812
## v0.5.0
913

opentelemetry-stdout/examples/basic.rs

+116-16
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,129 @@ fn init_logs() -> opentelemetry_sdk::logs::LoggerProvider {
6464

6565
#[cfg(feature = "trace")]
6666
fn emit_span() {
67-
let tracer = global::tracer("stdout-test");
68-
let mut span = tracer.start("test_span");
69-
span.set_attribute(KeyValue::new("test_key", "test_value"));
67+
use opentelemetry::trace::{
68+
SpanContext, SpanId, TraceFlags, TraceId, TraceState, TracerProvider,
69+
};
70+
71+
let tracer = global::tracer_provider()
72+
.tracer_builder("stdout-example")
73+
.with_version("v1")
74+
.with_schema_url("schema_url")
75+
.with_attributes([KeyValue::new("scope_key", "scope_value")])
76+
.build();
77+
let mut span = tracer.start("example-span");
78+
span.set_attribute(KeyValue::new("attribute_key1", "attribute_value1"));
79+
span.set_attribute(KeyValue::new("attribute_key2", "attribute_value2"));
7080
span.add_event(
71-
"test_event",
72-
vec![KeyValue::new("test_event_key", "test_event_value")],
81+
"example-event-name",
82+
vec![KeyValue::new("event_attribute1", "event_value1")],
83+
);
84+
span.add_link(
85+
SpanContext::new(
86+
TraceId::from_hex("58406520a006649127e371903a2de979").expect("invalid"),
87+
SpanId::from_hex("b6d7d7f6d7d6d7f6").expect("invalid"),
88+
TraceFlags::default(),
89+
false,
90+
TraceState::NONE,
91+
),
92+
vec![
93+
KeyValue::new("link_attribute1", "link_value1"),
94+
KeyValue::new("link_attribute2", "link_value2"),
95+
],
96+
);
97+
98+
span.add_link(
99+
SpanContext::new(
100+
TraceId::from_hex("23401120a001249127e371903f2de971").expect("invalid"),
101+
SpanId::from_hex("cd37d765d743d7f6").expect("invalid"),
102+
TraceFlags::default(),
103+
false,
104+
TraceState::NONE,
105+
),
106+
vec![
107+
KeyValue::new("link_attribute1", "link_value1"),
108+
KeyValue::new("link_attribute2", "link_value2"),
109+
],
73110
);
74111
span.end();
75112
}
76113

77114
#[cfg(feature = "metrics")]
78115
fn emit_metrics() {
79-
let meter = global::meter("stdout-test");
80-
let c = meter.u64_counter("test_counter").init();
81-
c.add(1, &[KeyValue::new("test_key", "test_value")]);
116+
let meter = global::meter("stdout-example");
117+
let c = meter.u64_counter("example_counter").init();
118+
c.add(
119+
1,
120+
&[
121+
KeyValue::new("name", "apple"),
122+
KeyValue::new("color", "green"),
123+
],
124+
);
125+
c.add(
126+
1,
127+
&[
128+
KeyValue::new("name", "apple"),
129+
KeyValue::new("color", "green"),
130+
],
131+
);
132+
c.add(
133+
2,
134+
&[
135+
KeyValue::new("name", "apple"),
136+
KeyValue::new("color", "red"),
137+
],
138+
);
139+
c.add(
140+
1,
141+
&[
142+
KeyValue::new("name", "banana"),
143+
KeyValue::new("color", "yellow"),
144+
],
145+
);
146+
c.add(
147+
11,
148+
&[
149+
KeyValue::new("name", "banana"),
150+
KeyValue::new("color", "yellow"),
151+
],
152+
);
153+
154+
let h = meter.f64_histogram("example_histogram").init();
155+
h.record(
156+
1.0,
157+
&[
158+
KeyValue::new("name", "apple"),
159+
KeyValue::new("color", "green"),
160+
],
161+
);
162+
h.record(
163+
1.0,
164+
&[
165+
KeyValue::new("name", "apple"),
166+
KeyValue::new("color", "green"),
167+
],
168+
);
169+
h.record(
170+
2.0,
171+
&[
172+
KeyValue::new("name", "apple"),
173+
KeyValue::new("color", "red"),
174+
],
175+
);
176+
h.record(
177+
1.0,
178+
&[
179+
KeyValue::new("name", "banana"),
180+
KeyValue::new("color", "yellow"),
181+
],
182+
);
183+
h.record(
184+
11.0,
185+
&[
186+
KeyValue::new("name", "banana"),
187+
KeyValue::new("color", "yellow"),
188+
],
189+
);
82190
}
83191

84192
#[cfg(feature = "logs")]
@@ -101,17 +209,9 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
101209
#[cfg(feature = "logs")]
102210
emit_log();
103211

104-
println!(
105-
"======================================================================================"
106-
);
107-
108212
#[cfg(feature = "trace")]
109213
emit_span();
110214

111-
println!(
112-
"======================================================================================"
113-
);
114-
115215
#[cfg(feature = "metrics")]
116216
emit_metrics();
117217

opentelemetry-stdout/src/lib.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
//! # Feature Flags
88
//! The following feature flags can enable exporters for different telemetry signals:
99
//!
10-
//! * `trace`: Includes the trace exporters (enabled by default).
10+
//! * `trace`: Includes the trace exporters.
1111
//! * `metrics`: Includes the metrics exporters.
1212
//! * `logs`: Includes the logs exporters.
1313
//!
@@ -56,9 +56,6 @@
5656
//!
5757
//! // recorded traces, metrics and logs will now be sent to stdout:
5858
//!
59-
//! // {"resourceMetrics":{"resource":{"attributes":[{"key":"service.name","value":{"str..
60-
//! // {"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stri..
61-
//! // {"resourceLogs": [{"resource": {"attributes": [{"key": "service.name", "value": {"str..
6259
//! # }
6360
//! ```
6461
#![warn(missing_debug_implementations, missing_docs)]

0 commit comments

Comments
 (0)