Skip to content

Commit 0e5db5d

Browse files
authored
feat: Add structured internal logging for debugging for Geneva-uploader (#472)
L
1 parent 3ee12ab commit 0e5db5d

File tree

8 files changed

+465
-43
lines changed

8 files changed

+465
-43
lines changed

opentelemetry-exporter-geneva/geneva-uploader/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ lz4_flex = { version = "0.11", features = ["safe-encode"], default-features = fa
2828
# Azure Identity dependencies - using public crates.io versions
2929
azure_identity = "0.27.0"
3030
azure_core = "0.27.0"
31+
tracing = "0.1"
3132

3233
[features]
3334
self_signed_certs = [] # Empty by default for security

opentelemetry-exporter-geneva/geneva-uploader/src/client.rs

Lines changed: 99 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::payload_encoder::otlp_encoder::OtlpEncoder;
77
use opentelemetry_proto::tonic::logs::v1::ResourceLogs;
88
use opentelemetry_proto::tonic::trace::v1::ResourceSpans;
99
use std::sync::Arc;
10+
use tracing::{debug, info};
1011

1112
/// Public batch type (already LZ4 chunked compressed).
1213
/// Produced by `OtlpEncoder::encode_log_batch` and returned to callers.
@@ -44,13 +45,27 @@ pub struct GenevaClient {
4445

4546
impl GenevaClient {
4647
pub fn new(cfg: GenevaClientConfig) -> Result<Self, String> {
48+
info!(
49+
name: "client.new",
50+
target: "geneva-uploader",
51+
endpoint = %cfg.endpoint,
52+
namespace = %cfg.namespace,
53+
account = %cfg.account,
54+
"Initializing GenevaClient"
55+
);
56+
4757
// Validate MSI resource presence for managed identity variants
4858
match cfg.auth_method {
4959
AuthMethod::SystemManagedIdentity
5060
| AuthMethod::UserManagedIdentity { .. }
5161
| AuthMethod::UserManagedIdentityByObjectId { .. }
5262
| AuthMethod::UserManagedIdentityByResourceId { .. } => {
5363
if cfg.msi_resource.is_none() {
64+
debug!(
65+
name: "client.new.validate_msi_resource",
66+
target: "geneva-uploader",
67+
"Validation failed: msi_resource must be provided for managed identity auth"
68+
);
5469
return Err(
5570
"msi_resource must be provided for managed identity auth".to_string()
5671
);
@@ -71,10 +86,16 @@ impl GenevaClient {
7186
auth_method: cfg.auth_method,
7287
msi_resource: cfg.msi_resource,
7388
};
74-
let config_client = Arc::new(
75-
GenevaConfigClient::new(config_client_config)
76-
.map_err(|e| format!("GenevaConfigClient init failed: {e}"))?,
77-
);
89+
let config_client =
90+
Arc::new(GenevaConfigClient::new(config_client_config).map_err(|e| {
91+
debug!(
92+
name: "client.new.config_client_init",
93+
target: "geneva-uploader",
94+
error = %e,
95+
"GenevaConfigClient init failed"
96+
);
97+
format!("GenevaConfigClient init failed: {e}")
98+
})?);
7899

79100
let source_identity = format!(
80101
"Tenant={}/Role={}/RoleInstance={}",
@@ -95,8 +116,22 @@ impl GenevaClient {
95116
config_version: config_version.clone(),
96117
};
97118

98-
let uploader = GenevaUploader::from_config_client(config_client, uploader_config)
99-
.map_err(|e| format!("GenevaUploader init failed: {e}"))?;
119+
let uploader =
120+
GenevaUploader::from_config_client(config_client, uploader_config).map_err(|e| {
121+
debug!(
122+
name: "client.new.uploader_init",
123+
target: "geneva-uploader",
124+
error = %e,
125+
"GenevaUploader init failed"
126+
);
127+
format!("GenevaUploader init failed: {e}")
128+
})?;
129+
130+
info!(
131+
name: "client.new.complete",
132+
target: "geneva-uploader",
133+
"GenevaClient initialized successfully"
134+
);
100135

101136
Ok(Self {
102137
uploader: Arc::new(uploader),
@@ -110,38 +145,92 @@ impl GenevaClient {
110145
&self,
111146
logs: &[ResourceLogs],
112147
) -> Result<Vec<EncodedBatch>, String> {
148+
debug!(
149+
name: "client.encode_and_compress_logs",
150+
target: "geneva-uploader",
151+
resource_logs_count = logs.len(),
152+
"Encoding and compressing resource logs"
153+
);
154+
113155
let log_iter = logs
114156
.iter()
115157
.flat_map(|resource_log| resource_log.scope_logs.iter())
116158
.flat_map(|scope_log| scope_log.log_records.iter());
117159

118160
self.encoder
119161
.encode_log_batch(log_iter, &self.metadata)
120-
.map_err(|e| format!("Compression failed: {e}"))
162+
.map_err(|e| {
163+
debug!(
164+
name: "client.encode_and_compress_logs.error",
165+
target: "geneva-uploader",
166+
error = %e,
167+
"Log compression failed"
168+
);
169+
format!("Compression failed: {e}")
170+
})
121171
}
122172

123173
/// Encode OTLP spans into LZ4 chunked compressed batches.
124174
pub fn encode_and_compress_spans(
125175
&self,
126176
spans: &[ResourceSpans],
127177
) -> Result<Vec<EncodedBatch>, String> {
178+
debug!(
179+
name: "client.encode_and_compress_spans",
180+
target: "geneva-uploader",
181+
resource_spans_count = spans.len(),
182+
"Encoding and compressing resource spans"
183+
);
184+
128185
let span_iter = spans
129186
.iter()
130187
.flat_map(|resource_span| resource_span.scope_spans.iter())
131188
.flat_map(|scope_span| scope_span.spans.iter());
132189

133190
self.encoder
134191
.encode_span_batch(span_iter, &self.metadata)
135-
.map_err(|e| format!("Compression failed: {e}"))
192+
.map_err(|e| {
193+
debug!(
194+
name: "client.encode_and_compress_spans.error",
195+
target: "geneva-uploader",
196+
error = %e,
197+
"Span compression failed"
198+
);
199+
format!("Compression failed: {e}")
200+
})
136201
}
137202

138203
/// Upload a single compressed batch.
139204
/// This allows for granular control over uploads, including custom retry logic for individual batches.
140205
pub async fn upload_batch(&self, batch: &EncodedBatch) -> Result<(), String> {
206+
debug!(
207+
name: "client.upload_batch",
208+
target: "geneva-uploader",
209+
event_name = %batch.event_name,
210+
size = batch.data.len(),
211+
"Uploading batch"
212+
);
213+
141214
self.uploader
142215
.upload(batch.data.clone(), &batch.event_name, &batch.metadata)
143216
.await
144-
.map(|_| ())
145-
.map_err(|e| format!("Geneva upload failed: {e} Event: {}", batch.event_name))
217+
.map(|_| {
218+
debug!(
219+
name: "client.upload_batch.success",
220+
target: "geneva-uploader",
221+
event_name = %batch.event_name,
222+
"Successfully uploaded batch"
223+
);
224+
})
225+
.map_err(|e| {
226+
debug!(
227+
name: "client.upload_batch.error",
228+
target: "geneva-uploader",
229+
event_name = %batch.event_name,
230+
error = %e,
231+
"Geneva upload failed"
232+
);
233+
format!("Geneva upload failed: {e} Event: {}", batch.event_name)
234+
})
146235
}
147236
}

0 commit comments

Comments
 (0)