Skip to content

Commit 0d6909f

Browse files
authored
fix(storage): Add telemetry tracing support for async stream Close() (googleapis#16118)
1 parent 8d79f18 commit 0d6909f

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,23 @@ class AsyncWriterConnectionTracing : public storage::AsyncWriterConnection {
116116
});
117117
}
118118

119+
future<Status> Close(storage::WritePayload p) override {
120+
internal::OTelScope scope(span_);
121+
auto size = static_cast<std::uint64_t>(p.size());
122+
return impl_->Close(std::move(p))
123+
.then([count = ++sent_count_, span = span_, size](auto f) {
124+
span->AddEvent(
125+
"gl-cpp.close",
126+
{
127+
{/*sc::kRpcMessageType=*/"rpc.message.type", "SENT"},
128+
{/*sc::kRpcMessageId=*/"rpc.message.id", count},
129+
{sc::thread::kThreadId, internal::CurrentThreadId()},
130+
{"gl-cpp.size", size},
131+
});
132+
return internal::EndSpan(*span, f.get());
133+
});
134+
}
135+
119136
future<StatusOr<std::int64_t>> Query() override {
120137
internal::OTelScope scope(span_);
121138
return impl_->Query().then([count = ++recv_count_, span = span_](auto f) {

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ auto ExpectFlush(std::int64_t id, std::uint64_t size) {
6868
return AllOf(EventNamed("gl-cpp.flush"), ExpectSent(id, size));
6969
}
7070

71+
auto ExpectClose(std::int64_t id, std::uint64_t size) {
72+
return AllOf(EventNamed("gl-cpp.close"), ExpectSent(id, size));
73+
}
74+
7175
auto ExpectQuery(std::int64_t id) {
7276
namespace sc = ::opentelemetry::semconv;
7377
return AllOf(EventNamed("gl-cpp.query"),
@@ -248,6 +252,48 @@ TEST(WriterConnectionTracing, Cancel) {
248252
sc::thread::kThreadId, _)))))));
249253
}
250254

255+
TEST(WriterConnectionTracing, Close) {
256+
auto span_catcher = InstallSpanCatcher();
257+
258+
auto mock = std::make_unique<MockAsyncWriterConnection>();
259+
EXPECT_CALL(*mock, Close).WillOnce([] {
260+
return make_ready_future(Status{});
261+
});
262+
auto actual = MakeTracingWriterConnection(
263+
internal::MakeSpan("test-span-name"), std::move(mock));
264+
auto status = actual->Close(WritePayload{std::string(1024, 'A')}).get();
265+
EXPECT_STATUS_OK(status);
266+
267+
auto spans = span_catcher->GetSpans();
268+
EXPECT_THAT(spans, ElementsAre(AllOf(
269+
SpanNamed("test-span-name"),
270+
SpanWithStatus(opentelemetry::trace::StatusCode::kOk),
271+
SpanHasInstrumentationScope(), SpanKindIsClient(),
272+
SpanHasEvents(ExpectClose(1, 1024)))));
273+
}
274+
275+
TEST(WriterConnectionTracing, CloseError) {
276+
auto span_catcher = InstallSpanCatcher();
277+
278+
auto mock = std::make_unique<MockAsyncWriterConnection>();
279+
EXPECT_CALL(*mock, Close).WillOnce([] {
280+
return make_ready_future(PermanentError());
281+
});
282+
auto actual = MakeTracingWriterConnection(
283+
internal::MakeSpan("test-span-name"), std::move(mock));
284+
auto status = actual->Close(WritePayload{std::string(1024, 'A')}).get();
285+
EXPECT_THAT(status, StatusIs(PermanentError().code()));
286+
287+
auto spans = span_catcher->GetSpans();
288+
EXPECT_THAT(
289+
spans,
290+
ElementsAre(AllOf(SpanNamed("test-span-name"),
291+
SpanWithStatus(opentelemetry::trace::StatusCode::kError,
292+
PermanentError().message()),
293+
SpanHasInstrumentationScope(), SpanKindIsClient(),
294+
SpanHasEvents(ExpectClose(1, 1024)))));
295+
}
296+
251297
} // namespace
252298
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
253299
} // namespace storage_internal

0 commit comments

Comments
 (0)