Skip to content
This repository was archived by the owner on Jul 31, 2023. It is now read-only.

Commit 66ffd23

Browse files
authored
Adding support for propagating context and retrieving span from context. (#54)
Adding support for propagating context and retrieving span from context.
1 parent c6bfe2e commit 66ffd23

File tree

6 files changed

+67
-50
lines changed

6 files changed

+67
-50
lines changed

opencensus/plugins/grpc/internal/client_filter.cc

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ void CensusClientCallData::OnDoneRecvMessageCb(void *user_data,
8383
void CensusClientCallData::StartTransportStreamOpBatch(
8484
grpc_call_element *elem, grpc::TransportStreamOpBatch *op) {
8585
if (op->send_initial_metadata() != nullptr) {
86+
// TODO(jsking): Move GenerateClientContext to init callback after
87+
// grpc has been changed to populate census context at call initialization.
88+
census_context *ctxt = op->get_census_context();
89+
GenerateClientContext(
90+
method_, &context_,
91+
(ctxt == nullptr) ? nullptr : reinterpret_cast<CensusContext *>(ctxt));
8692
char tracing_buf[kMaxTracingLen];
8793
size_t tracing_len =
8894
context_.TraceContextSerialize(tracing_buf, kMaxTracingLen);
@@ -129,21 +135,20 @@ void CensusClientCallData::StartTransportStreamOpBatch(
129135

130136
grpc_error *CensusClientCallData::Init(grpc_call_element *elem,
131137
const grpc_call_element_args *args) {
132-
method_ = grpc_slice_ref_internal(args->path);
138+
path_ = grpc_slice_ref_internal(args->path);
133139
start_time_ = absl::Now();
134140
const char *method_str =
135-
GPR_SLICE_IS_EMPTY(method_)
141+
GPR_SLICE_IS_EMPTY(path_)
136142
? ""
137-
: reinterpret_cast<const char *>(GRPC_SLICE_START_PTR(method_));
138-
method_size_ = GRPC_SLICE_IS_EMPTY(method_) ? 0 : GRPC_SLICE_LENGTH(method_);
139-
absl::string_view method(method_str, method_size_);
140-
GenerateClientContext(method, &context_);
143+
: reinterpret_cast<const char *>(GRPC_SLICE_START_PTR(path_));
144+
method_ = absl::string_view(
145+
method_str, GRPC_SLICE_IS_EMPTY(path_) ? 0 : GRPC_SLICE_LENGTH(path_));
141146
GRPC_CLOSURE_INIT(&on_done_recv_message_, OnDoneRecvMessageCb, elem,
142147
grpc_schedule_on_exec_ctx);
143148
GRPC_CLOSURE_INIT(&on_done_recv_trailing_metadata_,
144149
OnDoneRecvTrailingMetadataCb, elem,
145150
grpc_schedule_on_exec_ctx);
146-
stats::Record({{RpcClientStartedCount(), 1}}, {{kMethodTagKey, method}});
151+
stats::Record({{RpcClientStartedCount(), 1}}, {{kMethodTagKey, method_}});
147152
return GRPC_ERROR_NONE;
148153
}
149154

@@ -164,11 +169,10 @@ void CensusClientCallData::Destroy(grpc_call_element *elem,
164169
{RpcClientFinishedCount(), 1},
165170
{RpcClientRequestCount(), sent_message_count_},
166171
{RpcClientResponseCount(), recv_message_count_}},
167-
{{kMethodTagKey, absl::string_view(reinterpret_cast<char *>(
168-
GRPC_SLICE_START_PTR(method_)),
169-
method_size_)},
172+
{{kMethodTagKey, method_},
170173
{kStatusTagKey, StatusCodeToString(final_info->final_status)}});
171-
grpc_slice_unref_internal(method_);
174+
grpc_slice_unref_internal(path_);
175+
context_.EndSpan();
172176
}
173177

174178
} // namespace opencensus

opencensus/plugins/grpc/internal/client_filter.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ namespace opencensus {
2929
class CensusClientCallData : public grpc::CallData {
3030
public:
3131
CensusClientCallData()
32-
: method_size_(0),
33-
recv_trailing_metadata_(nullptr),
32+
: recv_trailing_metadata_(nullptr),
3433
initial_on_done_recv_trailing_metadata_(nullptr),
3534
initial_on_done_recv_message_(nullptr),
3635
elapsed_time_(0),
@@ -39,7 +38,7 @@ class CensusClientCallData : public grpc::CallData {
3938
sent_message_count_(0) {
4039
memset(&stats_bin_, 0, sizeof(grpc_linked_mdelem));
4140
memset(&tracing_bin_, 0, sizeof(grpc_linked_mdelem));
42-
memset(&method_, 0, sizeof(grpc_slice));
41+
memset(&path_, 0, sizeof(grpc_slice));
4342
memset(&on_done_recv_trailing_metadata_, 0, sizeof(grpc_closure));
4443
memset(&on_done_recv_message_, 0, sizeof(grpc_closure));
4544
}
@@ -65,9 +64,8 @@ class CensusClientCallData : public grpc::CallData {
6564
grpc_linked_mdelem stats_bin_;
6665
grpc_linked_mdelem tracing_bin_;
6766
// Client method.
68-
grpc_slice method_;
69-
// Client method size.
70-
size_t method_size_;
67+
absl::string_view method_;
68+
grpc_slice path_;
7169
// The recv trailing metadata callbacks.
7270
grpc_metadata_batch *recv_trailing_metadata_;
7371
grpc_closure *initial_on_done_recv_trailing_metadata_;

opencensus/plugins/grpc/internal/filter.cc

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,17 @@ void GenerateServerContext(absl::string_view tracing, absl::string_view stats,
2626
new (context) CensusContext(method, parent_ctx);
2727
}
2828

29-
void GenerateClientContext(absl::string_view method, CensusContext *context) {
30-
// TODO: Change this so that it can be set to root or non-root span.
31-
new (context) CensusContext(method);
29+
void GenerateClientContext(absl::string_view method, CensusContext *ctxt,
30+
CensusContext *parent_ctxt) {
31+
if (parent_ctxt != nullptr) {
32+
trace::SpanContext span_ctxt = parent_ctxt->Context();
33+
trace::Span span = parent_ctxt->Span();
34+
if (span_ctxt.IsValid()) {
35+
new (ctxt) CensusContext(method, &span);
36+
return;
37+
}
38+
}
39+
new (ctxt) CensusContext(method);
3240
}
3341

3442
size_t ServerStatsSerialize(uint64_t server_elapsed_time, char *buf,
@@ -54,6 +62,10 @@ trace::SpanContext SpanContextFromCensusContext(const census_context *ctxt) {
5462
return reinterpret_cast<const CensusContext *>(ctxt)->Context();
5563
}
5664

65+
trace::Span SpanFromCensusContext(const census_context *ctxt) {
66+
return reinterpret_cast<const CensusContext *>(ctxt)->Span();
67+
}
68+
5769
absl::string_view StatusCodeToString(grpc_status_code code) {
5870
switch (code) {
5971
case GRPC_STATUS_OK:

opencensus/plugins/grpc/internal/filter.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,11 @@ class CensusContext {
3838
explicit CensusContext(absl::string_view name)
3939
: span_(trace::Span::StartSpan(name)) {}
4040

41-
CensusContext(absl::string_view name, const trace::SpanContext &parent_ctx)
42-
: span_(trace::Span::StartSpanWithRemoteParent(name, parent_ctx)) {}
41+
CensusContext(absl::string_view name, const trace::Span *parent)
42+
: span_(trace::Span::StartSpan(name, parent)) {}
43+
44+
CensusContext(absl::string_view name, const trace::SpanContext &parent_ctxt)
45+
: span_(trace::Span::StartSpanWithRemoteParent(name, parent_ctxt)) {}
4346

4447
// Serializes the outgoing trace context. Field IDs are 1 byte followed by
4548
// field data. A 1 byte version ID is always encoded first.
@@ -52,11 +55,13 @@ class CensusContext {
5255
// Serializes the outgoing stats context. Field IDs are 1 byte followed by
5356
// field data. A 1 byte version ID is always encoded first.
5457
size_t StatsContextSerialize(char *stats_buf, size_t stats_buf_size) {
55-
// TODO: Add implementation.
58+
// TODO: Add implementation. Waiting on stats tagging to be added.
5659
return 0;
5760
}
5861

5962
trace::SpanContext Context() const { return span_.context(); }
63+
trace::Span Span() const { return span_; }
64+
void EndSpan() { span_.End(); }
6065

6166
private:
6267
trace::Span span_;
@@ -81,18 +86,20 @@ void GenerateServerContext(absl::string_view tracing, absl::string_view stats,
8186
// If the current context is the default context then the newly created
8287
// span automatically becomes a root span. This should only be called with a
8388
// blank CensusContext as it overwrites it.
84-
void GenerateClientContext(absl::string_view method, CensusContext *context);
89+
void GenerateClientContext(absl::string_view method, CensusContext *ctxt,
90+
CensusContext *parent_ctx);
8591

8692
// Returns the incoming data size from the grpc call final info.
8793
uint64_t GetIncomingDataSize(const grpc_call_final_info *final_info);
8894

8995
// Returns the outgoing data size from the grpc call final info.
9096
uint64_t GetOutgoingDataSize(const grpc_call_final_info *final_info);
9197

92-
// This is a helper function which will return the SpanContext associated with
93-
// the census_context* stored by grpc. The user will need to call this for
94-
// manual propagation of tracing data.
98+
// These helper functions return the SpanContext and Span, respectively
99+
// associated with the census_context* stored by grpc. The user will need to
100+
// call this for manual propagation of tracing data.
95101
trace::SpanContext SpanContextFromCensusContext(const census_context *ctxt);
102+
trace::Span SpanFromCensusContext(const census_context *ctxt);
96103

97104
// Returns a string representation of the StatusCode enum.
98105
absl::string_view StatusCodeToString(grpc_status_code code);

opencensus/plugins/grpc/internal/server_filter.cc

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,14 @@ void CensusServerCallData::OnDoneRecvInitialMetadataCb(void *user_data,
9191
sml.tracing_slice = grpc_empty_slice();
9292
sml.census_proto = grpc_empty_slice();
9393
FilterInitialMetadata(initial_metadata, &sml);
94-
calld->method_ = grpc_slice_ref_internal(sml.path);
95-
const char *method_str = GRPC_SLICE_IS_EMPTY(calld->method_)
94+
calld->path_ = grpc_slice_ref_internal(sml.path);
95+
const char *method_str = GRPC_SLICE_IS_EMPTY(calld->path_)
9696
? ""
9797
: reinterpret_cast<const char *>(
98-
GRPC_SLICE_START_PTR(calld->method_));
99-
calld->method_size_ =
100-
GRPC_SLICE_IS_EMPTY(sml.path) ? 0 : GRPC_SLICE_LENGTH(sml.path);
98+
GRPC_SLICE_START_PTR(calld->path_));
99+
calld->method_ = absl::string_view(
100+
method_str,
101+
GRPC_SLICE_IS_EMPTY(sml.path) ? 0 : GRPC_SLICE_LENGTH(sml.path));
101102
const char *tracing_str =
102103
GRPC_SLICE_IS_EMPTY(sml.tracing_slice)
103104
? ""
@@ -114,14 +115,12 @@ void CensusServerCallData::OnDoneRecvInitialMetadataCb(void *user_data,
114115
? 0
115116
: GRPC_SLICE_LENGTH(sml.census_proto);
116117

117-
// TODO: Setup GenerateServerContext().
118-
GenerateServerContext(
119-
absl::string_view(tracing_str, tracing_str_len),
120-
absl::string_view(census_str, census_str_len), absl::string_view("", 0),
121-
absl::string_view(method_str, calld->method_size_), &calld->context_);
122-
123-
absl::string_view method(method_str, calld->method_size_);
124-
stats::Record({{RpcServerStartedCount(), 1}}, {{kMethodTagKey, method}});
118+
GenerateServerContext(absl::string_view(tracing_str, tracing_str_len),
119+
absl::string_view(census_str, census_str_len),
120+
/*primary_role*/ "", calld->method_,
121+
&calld->context_);
122+
stats::Record({{RpcServerStartedCount(), 1}},
123+
{{kMethodTagKey, calld->method_}});
125124

126125
grpc_slice_unref_internal(sml.tracing_slice);
127126
grpc_slice_unref_internal(sml.census_proto);
@@ -193,7 +192,6 @@ void CensusServerCallData::Destroy(grpc_call_element *elem,
193192
const uint64_t response_size = GetIncomingDataSize(final_info);
194193
double elapsed_time_ms = absl::ToDoubleMilliseconds(elapsed_time_);
195194
grpc_auth_context_release(auth_context_);
196-
grpc_slice_unref_internal(method_);
197195
stats::Record(
198196
{{RpcServerErrorCount(),
199197
final_info->final_status == GRPC_STATUS_OK ? 0 : 1},
@@ -203,10 +201,10 @@ void CensusServerCallData::Destroy(grpc_call_element *elem,
203201
{RpcServerRequestCount(), sent_message_count_},
204202
{RpcServerFinishedCount(), 1},
205203
{RpcServerResponseCount(), recv_message_count_}},
206-
{{kMethodTagKey, absl::string_view(reinterpret_cast<char *>(
207-
GRPC_SLICE_START_PTR(method_)),
208-
method_size_)},
204+
{{kMethodTagKey, method_},
209205
{kStatusTagKey, StatusCodeToString(final_info->final_status)}});
206+
grpc_slice_unref_internal(path_);
207+
context_.EndSpan();
210208
}
211209

212210
} // namespace opencensus

opencensus/plugins/grpc/internal/server_filter.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ namespace opencensus {
3131
class CensusServerCallData : public grpc::CallData {
3232
public:
3333
CensusServerCallData()
34-
: method_size_(0),
35-
gc_(nullptr),
34+
: gc_(nullptr),
3635
auth_context_(nullptr),
3736
recv_initial_metadata_(nullptr),
3837
initial_on_done_recv_initial_metadata_(nullptr),
@@ -41,7 +40,7 @@ class CensusServerCallData : public grpc::CallData {
4140
recv_message_count_(0),
4241
sent_message_count_(0) {
4342
memset(&census_bin_, 0, sizeof(grpc_linked_mdelem));
44-
memset(&method_, 0, sizeof(grpc_slice));
43+
memset(&path_, 0, sizeof(grpc_slice));
4544
memset(&on_done_recv_initial_metadata_, 0, sizeof(grpc_closure));
4645
memset(&on_done_recv_message_, 0, sizeof(grpc_closure));
4746
}
@@ -62,9 +61,8 @@ class CensusServerCallData : public grpc::CallData {
6261
private:
6362
CensusContext context_;
6463
// server method
65-
grpc_slice method_;
66-
// server method size
67-
size_t method_size_;
64+
absl::string_view method_;
65+
grpc_slice path_;
6866
// Pointer to the grpc_call element
6967
grpc_call *gc_;
7068
// Authorization context for the call.

0 commit comments

Comments
 (0)