Skip to content

Commit 7cfca6d

Browse files
committed
Merge branch 'main' of https://github.com/open-telemetry/opentelemetry-rust into feat/log-kvs
2 parents e647860 + 832fad4 commit 7cfca6d

File tree

28 files changed

+554
-324
lines changed

28 files changed

+554
-324
lines changed

.github/repository-settings.md

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Log of local changes
2+
3+
Maintainers are expected to maintain this log. This is required as per
4+
[OpenTelemetry Community
5+
guidelines](https://github.com/open-telemetry/community/blob/main/docs/how-to-configure-new-repository.md#collaborators-and-teams).
6+
7+
## April 30th 2024
8+
9+
Modified branch protection for main branch to require the following CI checks:
10+
docs
11+
test (stable)

README.md

+12-5
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,18 @@ observability tools.
2525

2626
## Project Status
2727

28-
| Signal | Status |
29-
| ------- | ---------- |
30-
| Logs | Alpha* |
31-
| Metrics | Alpha |
32-
| Traces | Beta |
28+
| Signal/Component | Overall Status |
29+
| -------------------- | ------------------ |
30+
| Logs-API | Alpha* |
31+
| Logs-SDK | Alpha |
32+
| Logs-OTLP Exporter | Alpha |
33+
| Logs-Appender-Tracing | Alpha |
34+
| Metrics-API | Alpha |
35+
| Metrics-SDK | Alpha |
36+
| Metrics-OTLP Exporter | Alpha |
37+
| Traces-API | Beta |
38+
| Traces-SDK | Beta |
39+
| Traces-OTLP Exporter | Beta |
3340

3441
*OpenTelemetry Rust is not introducing a new end user callable Logging API.
3542
Instead, it provides [Logs Bridge

opentelemetry-appender-tracing/benches/logs.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ impl LogProcessor for NoopProcessor {
6262
Ok(())
6363
}
6464

65-
fn shutdown(&mut self) -> LogResult<()> {
65+
fn shutdown(&self) -> LogResult<()> {
6666
Ok(())
6767
}
6868

opentelemetry-otlp/CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717

1818
[#1568]: https://github.com/open-telemetry/opentelemetry-rust/pull/1568
1919

20+
### Changed
21+
- **Breaking** Remove global provider for Logs [#1691](https://github.com/open-telemetry/opentelemetry-rust/pull/1691/)
22+
- The method OtlpLogPipeline::install_simple() and OtlpLogPipeline::install_batch() now return `LoggerProvider` instead of
23+
`Logger`. Refer to the [basic-otlp](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry-otlp/examples/basic-otlp/src/main.rs) and [basic-otlp-http](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs) examples for how to initialize OTLP Log Exporter to use with OpenTelemetryLogBridge and OpenTelemetryTracingBridge respectively.
24+
2025
## v0.15.0
2126

2227
### Added

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

+4-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use std::error::Error;
1515
use tracing::info;
1616
use tracing_subscriber::prelude::*;
1717

18-
fn init_logs() -> Result<sdklogs::Logger, opentelemetry::logs::LogError> {
18+
fn init_logs() -> Result<sdklogs::LoggerProvider, opentelemetry::logs::LogError> {
1919
let service_name = env!("CARGO_BIN_NAME");
2020
opentelemetry_otlp::new_pipeline()
2121
.logging()
@@ -76,13 +76,12 @@ static COMMON_ATTRIBUTES: Lazy<[KeyValue; 4]> = Lazy::new(|| {
7676
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
7777
let _ = init_tracer()?;
7878
let _ = init_metrics()?;
79-
let _ = init_logs();
79+
// Opentelemetry will not provide a global API to manage the logger provider. Application users must manage the lifecycle of the logger provider on their own. Dropping logger providers will disable log emitting.
80+
let logger_provider = init_logs().unwrap();
8081

8182
let tracer = global::tracer("ex.com/basic");
8283
let meter = global::meter("ex.com/basic");
8384

84-
// configure the global logger to use our opentelemetry logger
85-
let logger_provider = opentelemetry::global::logger_provider();
8685
let layer = OpenTelemetryTracingBridge::new(&logger_provider);
8786
tracing_subscriber::registry().with(layer).init();
8887

@@ -108,7 +107,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
108107
histogram.record(5.5, COMMON_ATTRIBUTES.as_ref());
109108

110109
global::shutdown_tracer_provider();
111-
global::shutdown_logger_provider();
110+
logger_provider.shutdown();
112111
global::shutdown_meter_provider();
113112

114113
Ok(())

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

+3-6
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ fn init_metrics() -> Result<(), MetricsError> {
5454
}
5555
}
5656

57-
fn init_logs() -> Result<opentelemetry_sdk::logs::Logger, LogError> {
57+
fn init_logs() -> Result<opentelemetry_sdk::logs::LoggerProvider, LogError> {
5858
let service_name = env!("CARGO_BIN_NAME");
5959
opentelemetry_otlp::new_pipeline()
6060
.logging()
@@ -93,10 +93,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
9393
let _ = init_metrics()?;
9494

9595
// Initialize logs, which sets the global loggerprovider.
96-
let _ = init_logs();
97-
98-
// Retrieve the global LoggerProvider.
99-
let logger_provider = global::logger_provider();
96+
let logger_provider = init_logs().unwrap();
10097

10198
// Create a new OpenTelemetryLogBridge using the above LoggerProvider.
10299
let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider);
@@ -141,7 +138,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
141138
info!(target: "my-target", "hello from {}. My price is {}", "apple", 1.99);
142139

143140
global::shutdown_tracer_provider();
144-
global::shutdown_logger_provider();
141+
logger_provider.shutdown();
145142
global::shutdown_meter_provider();
146143

147144
Ok(())

opentelemetry-otlp/src/exporter/http/logs.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ impl LogExporter for OtlpHttpClient {
1919
_ => Err(LogError::Other("exporter is already shut down".into())),
2020
})?;
2121

22-
let (body, content_type) = self.build_logs_export_body(batch)?;
22+
let (body, content_type) = { self.build_logs_export_body(batch, &self.resource)? };
2323
let mut request = http::Request::builder()
2424
.method(Method::POST)
2525
.uri(&self.collector_endpoint)
@@ -50,4 +50,8 @@ impl LogExporter for OtlpHttpClient {
5050
fn shutdown(&mut self) {
5151
let _ = self.client.lock().map(|mut c| c.take());
5252
}
53+
54+
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {
55+
self.resource = resource.into();
56+
}
5357
}

opentelemetry-otlp/src/exporter/http/mod.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use crate::{
55
};
66
use http::{HeaderName, HeaderValue, Uri};
77
use opentelemetry_http::HttpClient;
8+
use opentelemetry_proto::transform::common::tonic::ResourceAttributesWithSchema;
9+
810
#[cfg(feature = "logs")]
911
use opentelemetry_sdk::export::logs::LogData;
1012
#[cfg(feature = "trace")]
@@ -274,6 +276,9 @@ struct OtlpHttpClient {
274276
headers: HashMap<HeaderName, HeaderValue>,
275277
protocol: Protocol,
276278
_timeout: Duration,
279+
#[allow(dead_code)]
280+
// <allow dead> would be removed once we support set_resource for metrics and traces.
281+
resource: opentelemetry_proto::transform::common::tonic::ResourceAttributesWithSchema,
277282
}
278283

279284
impl OtlpHttpClient {
@@ -291,6 +296,7 @@ impl OtlpHttpClient {
291296
headers,
292297
protocol,
293298
_timeout: timeout,
299+
resource: ResourceAttributesWithSchema::default(),
294300
}
295301
}
296302

@@ -318,12 +324,15 @@ impl OtlpHttpClient {
318324
fn build_logs_export_body(
319325
&self,
320326
logs: Vec<LogData>,
327+
resource: &opentelemetry_proto::transform::common::tonic::ResourceAttributesWithSchema,
321328
) -> opentelemetry::logs::LogResult<(Vec<u8>, &'static str)> {
322329
use opentelemetry_proto::tonic::collector::logs::v1::ExportLogsServiceRequest;
330+
let resource_logs = logs
331+
.into_iter()
332+
.map(|log_event| (log_event, resource).into())
333+
.collect::<Vec<_>>();
334+
let req = ExportLogsServiceRequest { resource_logs };
323335

324-
let req = ExportLogsServiceRequest {
325-
resource_logs: logs.into_iter().map(Into::into).collect(),
326-
};
327336
match self.protocol {
328337
#[cfg(feature = "http-json")]
329338
Protocol::HttpJson => match serde_json::to_string_pretty(&req) {

opentelemetry-otlp/src/exporter/tonic/logs.rs

+18-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
use core::fmt;
2-
31
use async_trait::async_trait;
2+
use core::fmt;
43
use opentelemetry::logs::{LogError, LogResult};
54
use opentelemetry_proto::tonic::collector::logs::v1::{
65
logs_service_client::LogsServiceClient, ExportLogsServiceRequest,
@@ -12,6 +11,9 @@ use super::BoxInterceptor;
1211

1312
pub(crate) struct TonicLogsClient {
1413
inner: Option<ClientInner>,
14+
#[allow(dead_code)]
15+
// <allow dead> would be removed once we support set_resource for metrics and traces.
16+
resource: opentelemetry_proto::transform::common::tonic::ResourceAttributesWithSchema,
1517
}
1618

1719
struct ClientInner {
@@ -43,6 +45,7 @@ impl TonicLogsClient {
4345
client,
4446
interceptor,
4547
}),
48+
resource: Default::default(),
4649
}
4750
}
4851
}
@@ -62,13 +65,19 @@ impl LogExporter for TonicLogsClient {
6265
None => return Err(LogError::Other("exporter is already shut down".into())),
6366
};
6467

68+
let resource_logs = {
69+
batch
70+
.into_iter()
71+
.map(|log_data| (log_data, &self.resource))
72+
.map(Into::into)
73+
.collect()
74+
};
75+
6576
client
6677
.export(Request::from_parts(
6778
metadata,
6879
extensions,
69-
ExportLogsServiceRequest {
70-
resource_logs: batch.into_iter().map(Into::into).collect(),
71-
},
80+
ExportLogsServiceRequest { resource_logs },
7281
))
7382
.await
7483
.map_err(crate::Error::from)?;
@@ -79,4 +88,8 @@ impl LogExporter for TonicLogsClient {
7988
fn shutdown(&mut self) {
8089
let _ = self.inner.take();
8190
}
91+
92+
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {
93+
self.resource = resource.into();
94+
}
8295
}

opentelemetry-otlp/src/logs.rs

+15-23
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@ use crate::exporter::http::HttpExporterBuilder;
1010

1111
use crate::{NoExporterConfig, OtlpPipeline};
1212
use async_trait::async_trait;
13-
use std::{borrow::Cow, fmt::Debug};
13+
use std::fmt::Debug;
14+
15+
use opentelemetry::logs::LogError;
1416

15-
use opentelemetry::{
16-
global,
17-
logs::{LogError, LoggerProvider},
18-
};
1917
use opentelemetry_sdk::{export::logs::LogData, runtime::RuntimeChannel};
2018

2119
/// Compression algorithm to use, defaults to none.
@@ -103,6 +101,10 @@ impl opentelemetry_sdk::export::logs::LogExporter for LogExporter {
103101
async fn export(&mut self, batch: Vec<LogData>) -> opentelemetry::logs::LogResult<()> {
104102
self.client.export(batch).await
105103
}
104+
105+
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {
106+
self.client.set_resource(resource);
107+
}
106108
}
107109

108110
/// Recommended configuration for an OTLP exporter pipeline.
@@ -147,7 +149,7 @@ impl OtlpLogPipeline<LogExporterBuilder> {
147149
/// Returns a [`Logger`] with the name `opentelemetry-otlp` and the current crate version.
148150
///
149151
/// [`Logger`]: opentelemetry_sdk::logs::Logger
150-
pub fn install_simple(self) -> Result<opentelemetry_sdk::logs::Logger, LogError> {
152+
pub fn install_simple(self) -> Result<opentelemetry_sdk::logs::LoggerProvider, LogError> {
151153
Ok(build_simple_with_exporter(
152154
self.exporter_builder.build_log_exporter()?,
153155
self.log_config,
@@ -163,7 +165,7 @@ impl OtlpLogPipeline<LogExporterBuilder> {
163165
pub fn install_batch<R: RuntimeChannel>(
164166
self,
165167
runtime: R,
166-
) -> Result<opentelemetry_sdk::logs::Logger, LogError> {
168+
) -> Result<opentelemetry_sdk::logs::LoggerProvider, LogError> {
167169
Ok(build_batch_with_exporter(
168170
self.exporter_builder.build_log_exporter()?,
169171
self.log_config,
@@ -176,27 +178,22 @@ impl OtlpLogPipeline<LogExporterBuilder> {
176178
fn build_simple_with_exporter(
177179
exporter: LogExporter,
178180
log_config: Option<opentelemetry_sdk::logs::Config>,
179-
) -> opentelemetry_sdk::logs::Logger {
181+
) -> opentelemetry_sdk::logs::LoggerProvider {
180182
let mut provider_builder =
181183
opentelemetry_sdk::logs::LoggerProvider::builder().with_simple_exporter(exporter);
182184
if let Some(config) = log_config {
183185
provider_builder = provider_builder.with_config(config);
184186
}
185-
let provider = provider_builder.build();
186-
let logger = provider
187-
.logger_builder(Cow::Borrowed("opentelemetry-otlp"))
188-
.with_version(Cow::Borrowed(env!("CARGO_PKG_VERSION")))
189-
.build();
190-
let _ = global::set_logger_provider(provider);
191-
logger
187+
// logger would be created in the tracing appender
188+
provider_builder.build()
192189
}
193190

194191
fn build_batch_with_exporter<R: RuntimeChannel>(
195192
exporter: LogExporter,
196193
log_config: Option<opentelemetry_sdk::logs::Config>,
197194
runtime: R,
198195
batch_config: Option<opentelemetry_sdk::logs::BatchConfig>,
199-
) -> opentelemetry_sdk::logs::Logger {
196+
) -> opentelemetry_sdk::logs::LoggerProvider {
200197
let mut provider_builder = opentelemetry_sdk::logs::LoggerProvider::builder();
201198
let batch_processor = opentelemetry_sdk::logs::BatchLogProcessor::builder(exporter, runtime)
202199
.with_batch_config(batch_config.unwrap_or_default())
@@ -206,11 +203,6 @@ fn build_batch_with_exporter<R: RuntimeChannel>(
206203
if let Some(config) = log_config {
207204
provider_builder = provider_builder.with_config(config);
208205
}
209-
let provider = provider_builder.build();
210-
let logger = provider
211-
.logger_builder(Cow::Borrowed("opentelemetry-otlp"))
212-
.with_version(Cow::Borrowed(env!("CARGO_PKG_VERSION")))
213-
.build();
214-
let _ = global::set_logger_provider(provider);
215-
logger
206+
// logger would be created in the tracing appender
207+
provider_builder.build()
216208
}

opentelemetry-proto/src/transform/common.rs

+18-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,23 @@ pub mod tonic {
2222
use opentelemetry::{Array, Value};
2323
use std::borrow::Cow;
2424

25+
#[cfg(any(feature = "trace", feature = "logs"))]
26+
#[derive(Debug, Default)]
27+
pub struct ResourceAttributesWithSchema {
28+
pub attributes: Attributes,
29+
pub schema_url: Option<String>,
30+
}
31+
32+
#[cfg(any(feature = "trace", feature = "logs"))]
33+
impl From<&opentelemetry_sdk::Resource> for ResourceAttributesWithSchema {
34+
fn from(resource: &opentelemetry_sdk::Resource) -> Self {
35+
ResourceAttributesWithSchema {
36+
attributes: resource_attributes(resource),
37+
schema_url: resource.schema_url().map(ToString::to_string),
38+
}
39+
}
40+
}
41+
2542
#[cfg(any(feature = "trace", feature = "logs"))]
2643
use opentelemetry_sdk::Resource;
2744

@@ -52,7 +69,7 @@ pub mod tonic {
5269
}
5370

5471
/// Wrapper type for Vec<`KeyValue`>
55-
#[derive(Default)]
72+
#[derive(Default, Debug)]
5673
pub struct Attributes(pub ::std::vec::Vec<crate::proto::tonic::common::v1::KeyValue>);
5774

5875
impl From<Vec<opentelemetry::KeyValue>> for Attributes {

0 commit comments

Comments
 (0)