Skip to content

Commit 55fef54

Browse files
committed
feat(storage): add resource span attributes for ACO ( App Centric Observability ) for rewrite API in async client
1 parent f8a0cac commit 55fef54

4 files changed

Lines changed: 70 additions & 1 deletion

File tree

google/cloud/storage/internal/async/connection_tracing.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,11 @@ class AsyncConnectionTracing : public storage::AsyncConnection {
227227
std::shared_ptr<storage::AsyncRewriterConnection> RewriteObject(
228228
RewriteObjectParams p) override {
229229
auto const enabled = internal::TracingEnabled(p.options);
230+
if (!enabled) return impl_->RewriteObject(std::move(p));
231+
auto span = internal::MakeSpan("storage::AsyncConnection::RewriteObject");
232+
EnrichSpan(*span, p.options, p.request.destination_bucket());
230233
return MakeTracingAsyncRewriterConnection(
231-
impl_->RewriteObject(std::move(p)), enabled);
234+
impl_->RewriteObject(std::move(p)), std::move(span));
232235
}
233236

234237
future<StatusOr<google::storage::v2::Bucket>> GetBucket(

google/cloud/storage/internal/async/connection_tracing_test.cc

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,59 @@ TEST(ConnectionTracing, RewriteObject) {
539539
SpanHasEvents(EventNamed("gl-cpp.storage.rewrite.iterate")))));
540540
}
541541

542+
TEST(ConnectionTracing, RewriteObjectSpanEnrichment) {
543+
auto span_catcher = InstallSpanCatcher();
544+
PromiseWithOTelContext<StatusOr<google::storage::v2::Bucket>> p;
545+
546+
auto options = TracingEnabled().set<
547+
google::cloud::storage_experimental::OTelSpanEnrichmentOption>(true);
548+
auto mock = std::make_unique<MockAsyncConnection>();
549+
EXPECT_CALL(*mock, options).WillRepeatedly(Return(options));
550+
551+
EXPECT_CALL(*mock, GetBucket).WillOnce(expect_context(p));
552+
EXPECT_CALL(*mock, RewriteObject).WillOnce([] {
553+
auto rewriter = std::make_shared<MockAsyncRewriterConnection>();
554+
EXPECT_CALL(*rewriter, Iterate).WillOnce([] {
555+
return make_ready_future(make_status_or(MakeRewriteResponse()));
556+
});
557+
return rewriter;
558+
});
559+
560+
auto connection = MakeTracingAsyncConnection(std::move(mock));
561+
562+
// 1st call populates the cache
563+
google::storage::v2::GetBucketRequest req;
564+
req.set_name("projects/_/buckets/test-bucket");
565+
auto res1 = connection->GetBucket({req, options}).then(expect_no_context);
566+
google::storage::v2::Bucket bucket_meta;
567+
bucket_meta.set_project("projects/123456");
568+
bucket_meta.set_location("us-east1");
569+
bucket_meta.set_location_type("regional");
570+
p.set_value(make_status_or(std::move(bucket_meta)));
571+
ASSERT_STATUS_OK(res1.get());
572+
573+
(void)span_catcher->GetSpans();
574+
575+
// 2nd call: RewriteObject uses cached bucket metadata for span enrichment
576+
google::storage::v2::RewriteObjectRequest rewrite_req;
577+
rewrite_req.set_destination_bucket("projects/_/buckets/test-bucket");
578+
auto rewriter = connection->RewriteObject({rewrite_req, options});
579+
auto r1 = rewriter->Iterate().get();
580+
ASSERT_STATUS_OK(r1);
581+
582+
auto spans = span_catcher->GetSpans();
583+
EXPECT_THAT(
584+
spans,
585+
ElementsAre(AllOf(
586+
SpanNamed("storage::AsyncConnection::RewriteObject"),
587+
SpanWithStatus(opentelemetry::trace::StatusCode::kOk),
588+
SpanHasAttributes(
589+
OTelAttribute<std::string>("gcp.resource.destination.id",
590+
"projects/123456/buckets/test-bucket"),
591+
OTelAttribute<std::string>("gcp.resource.destination.location",
592+
"us-east1")))));
593+
}
594+
542595
TEST(ConnectionTracing, OpenError) {
543596
auto span_catcher = InstallSpanCatcher();
544597
PromiseWithOTelContext<

google/cloud/storage/internal/async/rewriter_connection_tracing.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ MakeTracingAsyncRewriterConnection(
6868
std::shared_ptr<storage::AsyncRewriterConnection> impl, bool enabled) {
6969
if (!enabled) return impl;
7070
auto span = internal::MakeSpan("storage::AsyncConnection::RewriteObject");
71+
return MakeTracingAsyncRewriterConnection(std::move(impl), std::move(span));
72+
}
73+
74+
std::shared_ptr<storage::AsyncRewriterConnection>
75+
MakeTracingAsyncRewriterConnection(
76+
std::shared_ptr<storage::AsyncRewriterConnection> impl,
77+
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span> span) {
7178
return std::make_shared<AsyncRewriterTracingConnection>(std::move(impl),
7279
std::move(span));
7380
}

google/cloud/storage/internal/async/rewriter_connection_tracing.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_STORAGE_INTERNAL_ASYNC_REWRITER_CONNECTION_TRACING_H
1717

1818
#include "google/cloud/storage/async/rewriter_connection.h"
19+
#include "google/cloud/internal/opentelemetry.h"
1920
#include "google/cloud/options.h"
2021
#include "google/cloud/version.h"
2122
#include <memory>
@@ -29,6 +30,11 @@ std::shared_ptr<storage::AsyncRewriterConnection>
2930
MakeTracingAsyncRewriterConnection(
3031
std::shared_ptr<storage::AsyncRewriterConnection> impl, bool enabled);
3132

33+
std::shared_ptr<storage::AsyncRewriterConnection>
34+
MakeTracingAsyncRewriterConnection(
35+
std::shared_ptr<storage::AsyncRewriterConnection> impl,
36+
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span> span);
37+
3238
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
3339
} // namespace storage_internal
3440
} // namespace cloud

0 commit comments

Comments
 (0)