From af7abf92cbc6755e548ec83b1ea6906eb7b701bb Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 3 Jun 2015 17:18:58 -0700 Subject: [PATCH] Enable runtime configuration of tracers --- include/grpc/grpc.h | 10 +++++ src/core/debug/trace.c | 42 +++++++++++-------- .../chttp2_socket_pair_with_grpc_trace.c | 4 ++ 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index 57bf2fad5abb6..e95a5f2e92c62 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -524,6 +524,16 @@ void grpc_server_shutdown_and_notify(grpc_server *server, void *tag); Implies grpc_server_shutdown() if one was not previously performed. */ void grpc_server_destroy(grpc_server *server); +/** Enable or disable a tracer. + + Tracers (usually controlled by the environment variable GRPC_TRACE) + allow printf-style debugging on GRPC internals, and are useful for + tracking down problems in the field. + + Use of this function is not strictly thread-safe, but the + thread-safety issues raised by it should not be of concern. */ +int grpc_tracer_set_enabled(const char *name, int enabled); + #ifdef __cplusplus } #endif diff --git a/src/core/debug/trace.c b/src/core/debug/trace.c index 32c35e7fb3a91..e0b502bb9cc73 100644 --- a/src/core/debug/trace.c +++ b/src/core/debug/trace.c @@ -35,6 +35,7 @@ #include +#include #include #include #include "src/core/support/env.h" @@ -80,27 +81,10 @@ static void parse(const char *s) { char **strings = NULL; size_t nstrings = 0; size_t i; - tracer *t; split(s, &strings, &nstrings); for (i = 0; i < nstrings; i++) { - const char *s = strings[i]; - if (0 == strcmp(s, "all")) { - for (t = tracers; t; t = t->next) { - *t->flag = 1; - } - } else { - int found = 0; - for (t = tracers; t; t = t->next) { - if (0 == strcmp(s, t->name)) { - *t->flag = 1; - found = 1; - } - } - if (!found) { - gpr_log(GPR_ERROR, "Unknown trace var: '%s'", s); - } - } + grpc_tracer_set_enabled(strings[i], 1); } for (i = 0; i < nstrings; i++) { @@ -121,3 +105,25 @@ void grpc_tracer_init(const char *env_var) { gpr_free(t); } } + +int grpc_tracer_set_enabled(const char *name, int enabled) { + tracer *t; + if (0 == strcmp(name, "all")) { + for (t = tracers; t; t = t->next) { + *t->flag = 1; + } + } else { + int found = 0; + for (t = tracers; t; t = t->next) { + if (0 == strcmp(name, t->name)) { + *t->flag = enabled; + found = 1; + } + } + if (!found) { + gpr_log(GPR_ERROR, "Unknown trace var: '%s'", name); + return 0; /* early return */ + } + } + return 1; +} diff --git a/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c b/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c index d32dbec25e732..0834987fbec1c 100644 --- a/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c +++ b/test/core/end2end/fixtures/chttp2_socket_pair_with_grpc_trace.c @@ -147,6 +147,10 @@ int main(int argc, char **argv) { grpc_test_init(argc, argv); grpc_init(); + GPR_ASSERT(0 == grpc_tracer_set_enabled("also-doesnt-exist", 0)); + GPR_ASSERT(1 == grpc_tracer_set_enabled("http", 1)); + GPR_ASSERT(1 == grpc_tracer_set_enabled("all", 1)); + for (i = 0; i < sizeof(configs) / sizeof(*configs); i++) { grpc_end2end_tests(configs[i]); }