Skip to content
Snippets Groups Projects
Commit fab27644 authored by Craig Tiller's avatar Craig Tiller
Browse files

Merge pull request #2242 from a-veitch/external_api_2

add client side census context
parents 44a4ef3b e2aa4879
Branches
Tags
No related merge requests found
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
struct grpc_call; struct grpc_call;
struct grpc_completion_queue; struct grpc_completion_queue;
struct census_context;
namespace grpc { namespace grpc {
...@@ -107,6 +108,10 @@ class ClientContext { ...@@ -107,6 +108,10 @@ class ClientContext {
creds_ = creds; creds_ = creds;
} }
// Get and set census context
void set_census_context(census_context* ccp) { census_context_ = ccp; }
census_context* get_census_context() const { return census_context_; }
void TryCancel(); void TryCancel();
private: private:
...@@ -154,6 +159,7 @@ class ClientContext { ...@@ -154,6 +159,7 @@ class ClientContext {
gpr_timespec deadline_; gpr_timespec deadline_;
grpc::string authority_; grpc::string authority_;
std::shared_ptr<Credentials> creds_; std::shared_ptr<Credentials> creds_;
census_context* census_context_;
std::multimap<grpc::string, grpc::string> send_initial_metadata_; std::multimap<grpc::string, grpc::string> send_initial_metadata_;
std::multimap<grpc::string, grpc::string> recv_initial_metadata_; std::multimap<grpc::string, grpc::string> recv_initial_metadata_;
std::multimap<grpc::string, grpc::string> trailing_metadata_; std::multimap<grpc::string, grpc::string> trailing_metadata_;
......
...@@ -61,6 +61,10 @@ enum census_functions { ...@@ -61,6 +61,10 @@ enum census_functions {
int census_initialize(int functions); int census_initialize(int functions);
void census_shutdown(); void census_shutdown();
/* If any census feature has been initialized, this funtion will return a
* non-zero value. */
int census_available();
/* Internally, Census relies on a context, which should be propagated across /* Internally, Census relies on a context, which should be propagated across
* RPC's. From the RPC subsystems viewpoint, this is an opaque data structure. * RPC's. From the RPC subsystems viewpoint, this is an opaque data structure.
* A context must be used as the first argument to all other census * A context must be used as the first argument to all other census
......
...@@ -34,12 +34,28 @@ ...@@ -34,12 +34,28 @@
#include <grpc/census.h> #include <grpc/census.h>
#include "src/core/census/grpc_context.h" #include "src/core/census/grpc_context.h"
void *grpc_census_context_create() { static void grpc_census_context_destroy(void *context) {
census_context *context; census_context_destroy((census_context *)context);
census_context_deserialize(NULL, &context);
return (void *)context;
} }
void grpc_census_context_destroy(void *context) { void grpc_census_call_set_context(grpc_call *call, census_context *context) {
census_context_destroy((census_context *)context); if (!census_available()) {
return;
}
if (context == NULL) {
if (grpc_call_is_client(call)) {
census_context *context_ptr;
census_context_deserialize(NULL, &context_ptr);
grpc_call_context_set(call, GRPC_CONTEXT_TRACING, context_ptr,
grpc_census_context_destroy);
} else {
/* TODO(aveitch): server side context code to be implemented. */
}
} else {
grpc_call_context_set(call, GRPC_CONTEXT_TRACING, context, NULL);
}
}
census_context *grpc_census_call_get_context(grpc_call *call) {
return (census_context *)grpc_call_context_get(call, GRPC_CONTEXT_TRACING);
} }
...@@ -36,7 +36,22 @@ ...@@ -36,7 +36,22 @@
#ifndef CENSUS_GRPC_CONTEXT_H #ifndef CENSUS_GRPC_CONTEXT_H
#define CENSUS_GRPC_CONTEXT_H #define CENSUS_GRPC_CONTEXT_H
void *grpc_census_context_create(); #include <grpc/census.h>
void grpc_census_context_destroy(void *context); #include "src/core/surface/call.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Set census context for the call; Must be called before first call to
grpc_call_start_batch(). */
void grpc_census_call_set_context(grpc_call *call, census_context *context);
/* Retrieve the calls current census context. */
census_context *grpc_census_call_get_context(grpc_call *call);
#ifdef __cplusplus
}
#endif
#endif /* CENSUS_GRPC_CONTEXT_H */ #endif /* CENSUS_GRPC_CONTEXT_H */
...@@ -48,3 +48,5 @@ int census_initialize(int functions) { ...@@ -48,3 +48,5 @@ int census_initialize(int functions) {
} }
void census_shutdown() { census_fns_enabled = CENSUS_NONE; } void census_shutdown() { census_fns_enabled = CENSUS_NONE; }
int census_available() { return (census_fns_enabled != CENSUS_NONE); }
...@@ -298,8 +298,6 @@ grpc_call *grpc_call_create(grpc_channel *channel, grpc_completion_queue *cq, ...@@ -298,8 +298,6 @@ grpc_call *grpc_call_create(grpc_channel *channel, grpc_completion_queue *cq,
if (call->is_client) { if (call->is_client) {
call->request_set[GRPC_IOREQ_SEND_TRAILING_METADATA] = REQSET_DONE; call->request_set[GRPC_IOREQ_SEND_TRAILING_METADATA] = REQSET_DONE;
call->request_set[GRPC_IOREQ_SEND_STATUS] = REQSET_DONE; call->request_set[GRPC_IOREQ_SEND_STATUS] = REQSET_DONE;
call->context[GRPC_CONTEXT_TRACING].value = grpc_census_context_create();
call->context[GRPC_CONTEXT_TRACING].destroy = grpc_census_context_destroy;
} }
GPR_ASSERT(add_initial_metadata_count < MAX_SEND_INITIAL_METADATA_COUNT); GPR_ASSERT(add_initial_metadata_count < MAX_SEND_INITIAL_METADATA_COUNT);
for (i = 0; i < add_initial_metadata_count; i++) { for (i = 0; i < add_initial_metadata_count; i++) {
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/slice.h> #include <grpc/support/slice.h>
#include "src/core/census/grpc_context.h"
#include "src/core/profiling/timers.h" #include "src/core/profiling/timers.h"
#include <grpc++/channel_arguments.h> #include <grpc++/channel_arguments.h>
#include <grpc++/client_context.h> #include <grpc++/client_context.h>
...@@ -68,6 +69,7 @@ Call Channel::CreateCall(const RpcMethod& method, ClientContext* context, ...@@ -68,6 +69,7 @@ Call Channel::CreateCall(const RpcMethod& method, ClientContext* context,
? target_.c_str() ? target_.c_str()
: context->authority().c_str(), : context->authority().c_str(),
context->raw_deadline()); context->raw_deadline());
grpc_census_call_set_context(c_call, context->get_census_context());
GRPC_TIMER_MARK(GRPC_PTAG_CPP_CALL_CREATED, c_call); GRPC_TIMER_MARK(GRPC_PTAG_CPP_CALL_CREATED, c_call);
context->set_call(c_call, shared_from_this()); context->set_call(c_call, shared_from_this());
return Call(c_call, this, cq); return Call(c_call, this, cq);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment