diff options
author | 2018-03-06 23:21:04 -0800 | |
---|---|---|
committer | 2018-03-06 23:21:04 -0800 | |
commit | 503099b1ccced021a914b76a8eacf9375550e794 (patch) | |
tree | 0c238baf3d339d56068dbbd36d984193da9b2f67 | |
parent | 07ed0396a900d01dc2b2142892417254e52eca77 (diff) |
Redoing render, about to take things away
-rw-r--r-- | src/core/lib/channel/channel_trace.cc | 39 | ||||
-rw-r--r-- | src/core/lib/channel/channel_trace.h | 19 | ||||
-rw-r--r-- | test/core/channel/channel_trace_test.cc | 14 | ||||
-rw-r--r-- | test/cpp/client/channel_trace_proto_json_test.cc | 34 |
4 files changed, 70 insertions, 36 deletions
diff --git a/src/core/lib/channel/channel_trace.cc b/src/core/lib/channel/channel_trace.cc index 08f6f72d63..558c852c01 100644 --- a/src/core/lib/channel/channel_trace.cc +++ b/src/core/lib/channel/channel_trace.cc @@ -43,14 +43,15 @@ namespace grpc_core { ChannelTrace::TraceEvent::TraceEvent( grpc_slice data, grpc_error* error, grpc_connectivity_state connectivity_state, - RefCountedPtr<ChannelTrace> referenced_tracer) + RefCountedPtr<ChannelTrace> referenced_tracer, ReferencedType type) : data_(data), error_(error), timestamp_(grpc_millis_to_timespec(grpc_core::ExecCtx::Get()->Now(), GPR_CLOCK_REALTIME)), connectivity_state_(connectivity_state), next_(nullptr), - referenced_tracer_(std::move(referenced_tracer)) {} + referenced_tracer_(std::move(referenced_tracer)), + referenced_type_(type) {} ChannelTrace::TraceEvent::TraceEvent(grpc_slice data, grpc_error* error, grpc_connectivity_state connectivity_state) @@ -69,7 +70,6 @@ ChannelTrace::TraceEvent::~TraceEvent() { ChannelTrace::ChannelTrace(size_t max_events) : channel_uuid_(-1), num_events_logged_(0), - num_children_seen_(0), list_size_(0), max_list_size_(max_events), head_trace_(nullptr), @@ -116,15 +116,25 @@ void ChannelTrace::AddTraceEventHelper(TraceEvent* new_trace_event) { } } -void ChannelTrace::AddTraceEvent( +void ChannelTrace::AddTraceEventReferencingChannel( grpc_slice data, grpc_error* error, grpc_connectivity_state connectivity_state, RefCountedPtr<ChannelTrace> referenced_tracer) { if (max_list_size_ == 0) return; // tracing is disabled if max_events == 0 - ++num_children_seen_; // create and fill up the new event AddTraceEventHelper(New<TraceEvent>(data, error, connectivity_state, - std::move(referenced_tracer))); + std::move(referenced_tracer), Channel)); +} + +void ChannelTrace::AddTraceEventReferencingSubchannel( + grpc_slice data, grpc_error* error, + grpc_connectivity_state connectivity_state, + RefCountedPtr<ChannelTrace> referenced_tracer) { + if (max_list_size_ == 0) return; // tracing is disabled if max_events == 0 + // create and fill up the new event + AddTraceEventHelper(New<TraceEvent>(data, error, connectivity_state, + std::move(referenced_tracer), + Subchannel)); } void ChannelTrace::AddTraceEvent(grpc_slice data, grpc_error* error, @@ -178,8 +188,15 @@ void ChannelTrace::TraceEvent::RenderTraceEvent(grpc_json* json) const { if (referenced_tracer_ != nullptr) { char* uuid_str; gpr_asprintf(&uuid_str, "%" PRIdPTR, referenced_tracer_->channel_uuid_); - json_iterator = grpc_json_create_child(json_iterator, json, "child_ref", - uuid_str, GRPC_JSON_NUMBER, true); + grpc_json* child_ref = grpc_json_create_child( + json_iterator, json, + (referenced_type_ == Channel) ? "channelRef" : "subchannelRef", + nullptr, GRPC_JSON_OBJECT, false); + json_iterator = grpc_json_create_child( + nullptr, child_ref, + (referenced_type_ == Channel) ? "channelId" : "subchannelId", + uuid_str, GRPC_JSON_STRING, true); + json_iterator = child_ref; } } @@ -191,10 +208,10 @@ char* ChannelTrace::RenderTrace() const { gpr_asprintf(&num_events_logged_str, "%" PRId64, num_events_logged_); grpc_json* json_iterator = nullptr; json_iterator = - grpc_json_create_child(json_iterator, json, "num_events_logged", - num_events_logged_str, GRPC_JSON_NUMBER, true); + grpc_json_create_child(json_iterator, json, "numEventsLogged", + num_events_logged_str, GRPC_JSON_STRING, true); json_iterator = - grpc_json_create_child(json_iterator, json, "creation_time", + grpc_json_create_child(json_iterator, json, "creationTime", fmt_time(time_created_), GRPC_JSON_STRING, true); grpc_json* events = grpc_json_create_child(json_iterator, json, "events", nullptr, GRPC_JSON_ARRAY, false); diff --git a/src/core/lib/channel/channel_trace.h b/src/core/lib/channel/channel_trace.h index 536f51a1f6..86270138d8 100644 --- a/src/core/lib/channel/channel_trace.h +++ b/src/core/lib/channel/channel_trace.h @@ -51,15 +51,21 @@ class ChannelTrace : public RefCounted<ChannelTrace> { // TODO(ncteisen): Once channelz is implemented, the events should reference // the overall channelz object, not just the ChannelTrace object. - void AddTraceEvent(grpc_slice data, grpc_error* error, - grpc_connectivity_state connectivity_state, - RefCountedPtr<ChannelTrace> referenced_tracer); + void AddTraceEventReferencingChannel( + grpc_slice data, grpc_error* error, + grpc_connectivity_state connectivity_state, + RefCountedPtr<ChannelTrace> referenced_tracer); + void AddTraceEventReferencingSubchannel( + grpc_slice data, grpc_error* error, + grpc_connectivity_state connectivity_state, + RefCountedPtr<ChannelTrace> referenced_tracer); // Returns the tracing data rendered as a grpc json string. // The string is owned by the caller and must be freed. char* RenderTrace() const; private: + enum ReferencedType { Channel, Subchannel }; // Private class to encapsulate all the data and bookkeeping needed for a // a trace event. class TraceEvent { @@ -69,7 +75,8 @@ class ChannelTrace : public RefCounted<ChannelTrace> { // overall channelz object, not just the ChannelTrace object TraceEvent(grpc_slice data, grpc_error* error, grpc_connectivity_state connectivity_state, - RefCountedPtr<ChannelTrace> referenced_tracer); + RefCountedPtr<ChannelTrace> referenced_tracer, + ReferencedType type); // Constructor for a TraceEvent that does not reverence a different // channel. @@ -94,6 +101,9 @@ class ChannelTrace : public RefCounted<ChannelTrace> { TraceEvent* next_; // the tracer object for the (sub)channel that this trace event refers to. RefCountedPtr<ChannelTrace> referenced_tracer_; + // the type that the referenced tracer points to. Unused if this trace + // does not point to any channel or subchannel + ReferencedType referenced_type_; }; // TraceEvent // Internal helper to add and link in a trace event @@ -102,7 +112,6 @@ class ChannelTrace : public RefCounted<ChannelTrace> { gpr_mu tracer_mu_; intptr_t channel_uuid_; uint64_t num_events_logged_; - uint64_t num_children_seen_; size_t list_size_; size_t max_list_size_; TraceEvent* head_trace_; diff --git a/test/core/channel/channel_trace_test.cc b/test/core/channel/channel_trace_test.cc index ea0c6be912..beb823eacf 100644 --- a/test/core/channel/channel_trace_test.cc +++ b/test/core/channel/channel_trace_test.cc @@ -142,7 +142,7 @@ TEST_P(ChannelTracerTest, ComplexTest) { AddSimpleTrace(tracer); AddSimpleTrace(tracer); RefCountedPtr<ChannelTrace> sc1 = MakeRefCounted<ChannelTrace>(GetParam()); - tracer->AddTraceEvent(grpc_slice_from_static_string("subchannel one created"), + tracer->AddTraceEventReferencingSubchannel(grpc_slice_from_static_string("subchannel one created"), GRPC_ERROR_NONE, GRPC_CHANNEL_IDLE, sc1); ValidateChannelTrace(tracer, 3, GetParam()); AddSimpleTrace(sc1); @@ -158,9 +158,9 @@ TEST_P(ChannelTracerTest, ComplexTest) { ValidateChannelTrace(tracer, 5, GetParam()); ValidateTraceDataMatchedUuidLookup(tracer); RefCountedPtr<ChannelTrace> sc2 = MakeRefCounted<ChannelTrace>(GetParam()); - tracer->AddTraceEvent(grpc_slice_from_static_string("subchannel two created"), + tracer->AddTraceEventReferencingChannel(grpc_slice_from_static_string("LB channel two created"), GRPC_ERROR_NONE, GRPC_CHANNEL_IDLE, sc2); - tracer->AddTraceEvent( + tracer->AddTraceEventReferencingSubchannel( grpc_slice_from_static_string("subchannel one inactive"), GRPC_ERROR_NONE, GRPC_CHANNEL_IDLE, sc1); ValidateChannelTrace(tracer, 7, GetParam()); @@ -185,22 +185,22 @@ TEST_P(ChannelTracerTest, TestNesting) { AddSimpleTrace(tracer); AddSimpleTrace(tracer); RefCountedPtr<ChannelTrace> sc1 = MakeRefCounted<ChannelTrace>(GetParam()); - tracer->AddTraceEvent(grpc_slice_from_static_string("subchannel one created"), + tracer->AddTraceEventReferencingChannel(grpc_slice_from_static_string("subchannel one created"), GRPC_ERROR_NONE, GRPC_CHANNEL_IDLE, sc1); AddSimpleTrace(sc1); RefCountedPtr<ChannelTrace> conn1 = MakeRefCounted<ChannelTrace>(GetParam()); // nesting one level deeper. - sc1->AddTraceEvent(grpc_slice_from_static_string("connection one created"), + sc1->AddTraceEventReferencingSubchannel(grpc_slice_from_static_string("connection one created"), GRPC_ERROR_NONE, GRPC_CHANNEL_IDLE, conn1); AddSimpleTrace(conn1); AddSimpleTrace(tracer); AddSimpleTrace(tracer); RefCountedPtr<ChannelTrace> sc2 = MakeRefCounted<ChannelTrace>(GetParam()); - tracer->AddTraceEvent(grpc_slice_from_static_string("subchannel two created"), + tracer->AddTraceEventReferencingSubchannel(grpc_slice_from_static_string("subchannel two created"), GRPC_ERROR_NONE, GRPC_CHANNEL_IDLE, sc2); // this trace should not get added to the parents children since it is already // present in the tracer. - tracer->AddTraceEvent( + tracer->AddTraceEventReferencingChannel( grpc_slice_from_static_string("subchannel one inactive"), GRPC_ERROR_NONE, GRPC_CHANNEL_IDLE, sc1); AddSimpleTrace(tracer); diff --git a/test/cpp/client/channel_trace_proto_json_test.cc b/test/cpp/client/channel_trace_proto_json_test.cc index d68adb360f..98cf676236 100644 --- a/test/cpp/client/channel_trace_proto_json_test.cc +++ b/test/cpp/client/channel_trace_proto_json_test.cc @@ -50,24 +50,32 @@ TEST(ChannelTraceTest, ProtoJsonTest) { RefCountedPtr<ChannelTrace> tracer = MakeRefCounted<ChannelTrace>(10); AddSimpleTrace(tracer); AddSimpleTrace(tracer); - tracer->AddTraceEvent( - grpc_slice_from_static_string("trace three"), - grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"), - GRPC_ERROR_INT_HTTP2_ERROR, 2), - GRPC_CHANNEL_IDLE); - tracer->AddTraceEvent(grpc_slice_from_static_string("trace four"), - GRPC_ERROR_NONE, GRPC_CHANNEL_SHUTDOWN); - std::string json_str = tracer->RenderTrace(); - gpr_log(GPR_ERROR, "%s", json_str.c_str()); + RefCountedPtr<ChannelTrace> sc1 = MakeRefCounted<ChannelTrace>(10); + tracer->AddTraceEventReferencingSubchannel(grpc_slice_from_static_string("subchannel one created"), + GRPC_ERROR_NONE, GRPC_CHANNEL_IDLE, sc1); + AddSimpleTrace(sc1); + AddSimpleTrace(sc1); + AddSimpleTrace(sc1); + RefCountedPtr<ChannelTrace> sc2 = MakeRefCounted<ChannelTrace>(10); + tracer->AddTraceEventReferencingChannel(grpc_slice_from_static_string("LB channel two created"), + GRPC_ERROR_NONE, GRPC_CHANNEL_IDLE, sc2); + tracer->AddTraceEventReferencingSubchannel( + grpc_slice_from_static_string("subchannel one inactive"), GRPC_ERROR_NONE, + GRPC_CHANNEL_IDLE, sc1); + std::string tracer_json_str = tracer->RenderTrace(); + gpr_log(GPR_ERROR, "%s", tracer_json_str.c_str()); grpc::channelz::ChannelTrace channel_trace; google::protobuf::util::JsonParseOptions options; options.ignore_unknown_fields = true; ASSERT_EQ(google::protobuf::util::JsonStringToMessage( - json_str, &channel_trace, options), + tracer_json_str, &channel_trace, options), google::protobuf::util::Status::OK); - std::string str; - google::protobuf::TextFormat::PrintToString(channel_trace, &str); - gpr_log(GPR_ERROR, "%s", str.c_str()); + std::string proto_json_str; + ASSERT_EQ(google::protobuf::util::MessageToJsonString(channel_trace, &proto_json_str), google::protobuf::util::Status::OK); + gpr_log(GPR_ERROR, "%s", proto_json_str.c_str()); + tracer.reset(nullptr); + sc1.reset(nullptr); + sc2.reset(nullptr); } } // namespace testing |