Skip to content

Commit 4e28cd5

Browse files
committed
feat(o11y): utilize opentelemetry-appender-tracing otel_target for dynamic artifact logging
1 parent 39e0363 commit 4e28cd5

4 files changed

Lines changed: 37 additions & 25 deletions

File tree

Cargo.lock

Lines changed: 18 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,3 +534,10 @@ unexpected_cfgs = { level = "deny", check-cfg = [
534534
'cfg(google_cloud_generate_protos)',
535535
'cfg(tokio_unstable)',
536536
] }
537+
538+
[patch.crates-io]
539+
opentelemetry-appender-tracing = { path = "../opentelemetry-rust/opentelemetry-appender-tracing" }
540+
opentelemetry = { path = "../opentelemetry-rust/opentelemetry" }
541+
opentelemetry_sdk = { path = "../opentelemetry-rust/opentelemetry-sdk" }
542+
opentelemetry-semantic-conventions = { path = "../opentelemetry-rust/opentelemetry-semantic-conventions" }
543+
opentelemetry-otlp = { path = "../opentelemetry-rust/opentelemetry-otlp" }

src/gax-internal/src/observability/client_signals.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ macro_rules! client_request_signals {
112112
#[cfg(test)]
113113
mod tests {
114114
use super::duration_metric::BOUNDARIES;
115-
use super::with_client_logging::{NAME, TARGET};
115+
use super::with_client_logging::NAME;
116116
use super::{ClientRequestAttributes, RequestRecorder};
117117
use crate::observability::DurationMetric;
118118
use crate::options::InstrumentationClientInfo;
@@ -288,11 +288,12 @@ mod tests {
288288
let captured = signals.logs_exporter.get_emitted_logs()?;
289289
let record = captured
290290
.iter()
291-
.find(|r| r.record.target().is_some_and(|v| v == TARGET))
292-
.unwrap_or_else(|| panic!("missing log for target {TARGET} in {captured:#?}"));
291+
.find(|r| r.record.target().is_some_and(|v| v == "test-artifact"))
292+
.unwrap_or_else(|| panic!("missing log for target test-artifact in {captured:#?}"));
293293
check_log_record(
294294
&record.record,
295295
trace_id,
296+
"test-artifact",
296297
&[
297298
("gcp.client.version", "1.2.3"),
298299
("gcp.client.repo", "googleapis/google-cloud-rust"),
@@ -459,6 +460,7 @@ mod tests {
459460
pub fn check_log_record(
460461
record: &SdkLogRecord,
461462
trace_id: TraceId,
463+
expected_target: &str,
462464
extra_attributes: &[(&'static str, &str)],
463465
) {
464466
fn format_value(any: &AnyValue) -> String {
@@ -473,7 +475,7 @@ mod tests {
473475
assert_eq!(record.event_name(), Some(NAME), "{record:?}");
474476
assert_eq!(
475477
record.target().map(|s| s.as_ref()),
476-
Some(TARGET),
478+
Some(expected_target),
477479
"{record:?}"
478480
);
479481
assert_eq!(record.severity_text(), Some("WARN"), "{record:?}");

src/gax-internal/src/observability/client_signals/with_client_logging.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ use std::task::{Context, Poll};
3333

3434
// A tentative name for the error logs.
3535
pub const NAME: &str = "experimental.client.request.error";
36-
// A tentative target for the error logs.
37-
pub const TARGET: &str = "experimental.client.request";
3836

3937
/// A future instrumented to generate the client request logs.
4038
///
@@ -104,11 +102,11 @@ where
104102
}
105103
});
106104

107-
// TODO(#4795) - use the correct name and target
108105
tracing::event!(
109106
name: NAME,
110-
target: TARGET,
107+
target: NAME, // Default fallback target
111108
tracing::Level::WARN,
109+
otel_target = snapshot.client_artifact(),
112110
{ RPC_SYSTEM_NAME } = snapshot.rpc_system(),
113111
{ RPC_SERVICE } = snapshot.service_name(),
114112
{ RPC_METHOD } = snapshot.rpc_method(),
@@ -206,13 +204,14 @@ mod tests {
206204
assert!(object.remove("timestamp").is_some(), "{parsed:?}");
207205
let want = json!({
208206
"level": "WARN",
209-
"target": "experimental.client.request",
207+
"target": NAME,
210208
});
211209
assert_eq!(Some(&object), want.as_object(), "{parsed:?}");
212210

213211
// Don't care about the formatted message, this is not a test for Error formatting.
214212
assert!(fields.remove("message").is_some(), "{parsed:?}");
215213
let want = json!({
214+
"otel_target": "test-artifact",
216215
"error.type": "CLIENT_CONNECTION_ERROR",
217216
"rpc.system.name": "http",
218217
"rpc.method": TEST_METHOD,
@@ -268,13 +267,14 @@ mod tests {
268267
assert!(object.remove("timestamp").is_some(), "{parsed:?}");
269268
let want = json!({
270269
"level": "WARN",
271-
"target": "experimental.client.request",
270+
"target": NAME,
272271
});
273272
assert_eq!(Some(&object), want.as_object(), "{parsed:?}");
274273

275274
// Don't care about the formatted message, this is not a test for Error formatting.
276275
assert!(fields.remove("message").is_some(), "{parsed:?}");
277276
let want = json!({
277+
"otel_target": "test-artifact",
278278
"rpc.system.name": "http",
279279
"rpc.method": TEST_METHOD,
280280
"rpc.service": "test-service",

0 commit comments

Comments
 (0)