add all new content

pull/2668/head
Alistair Veitch 10 years ago
parent a924b31d28
commit e6d0ad317e
  1. 3
      BUILD
  2. 3
      Makefile
  3. 1
      build.json
  4. 1
      gRPC.podspec
  5. 220
      include/grpc/census.h
  6. 13
      src/core/census/context.c
  7. 15
      src/core/census/grpc_context.c
  8. 57
      src/core/census/operation.c
  9. 24
      src/core/census/tracing.c
  10. 1
      tools/doxygen/Doxyfile.core.internal
  11. 2
      tools/run_tests/sources_and_headers.json
  12. 2
      vsprojects/grpc/grpc.vcxproj
  13. 3
      vsprojects/grpc/grpc.vcxproj.filters
  14. 2
      vsprojects/grpc_unsecure/grpc_unsecure.vcxproj
  15. 3
      vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters

@ -386,6 +386,7 @@ cc_library(
"src/core/transport/transport_op_string.c",
"src/core/census/context.c",
"src/core/census/initialize.c",
"src/core/census/operation.c",
"src/core/census/record_stat.c",
"src/core/census/tracing.c",
],
@ -626,6 +627,7 @@ cc_library(
"src/core/transport/transport_op_string.c",
"src/core/census/context.c",
"src/core/census/initialize.c",
"src/core/census/operation.c",
"src/core/census/record_stat.c",
"src/core/census/tracing.c",
],
@ -1113,6 +1115,7 @@ objc_library(
"src/core/transport/transport_op_string.c",
"src/core/census/context.c",
"src/core/census/initialize.c",
"src/core/census/operation.c",
"src/core/census/record_stat.c",
"src/core/census/tracing.c",
],

@ -3856,6 +3856,7 @@ LIBGRPC_SRC = \
src/core/transport/transport_op_string.c \
src/core/census/context.c \
src/core/census/initialize.c \
src/core/census/operation.c \
src/core/census/record_stat.c \
src/core/census/tracing.c \
@ -4125,6 +4126,7 @@ LIBGRPC_UNSECURE_SRC = \
src/core/transport/transport_op_string.c \
src/core/census/context.c \
src/core/census/initialize.c \
src/core/census/operation.c \
src/core/census/record_stat.c \
src/core/census/tracing.c \
@ -18761,7 +18763,6 @@ test/cpp/qps/timer.cc: $(OPENSSL_DEP)
test/cpp/util/benchmark_config.cc: $(OPENSSL_DEP)
test/cpp/util/cli_call.cc: $(OPENSSL_DEP)
test/cpp/util/create_test_channel.cc: $(OPENSSL_DEP)
test/cpp/util/fake_credentials.cc: $(OPENSSL_DEP)
test/cpp/util/subprocess.cc: $(OPENSSL_DEP)
test/cpp/util/test_config.cc: $(OPENSSL_DEP)
endif

@ -24,6 +24,7 @@
"src": [
"src/core/census/context.c",
"src/core/census/initialize.c",
"src/core/census/operation.c",
"src/core/census/record_stat.c",
"src/core/census/tracing.c"
]

@ -395,6 +395,7 @@ Pod::Spec.new do |s|
'src/core/transport/transport_op_string.c',
'src/core/census/context.c',
'src/core/census/initialize.c',
'src/core/census/operation.c',
'src/core/census/record_stat.c',
'src/core/census/tracing.c'

@ -69,12 +69,14 @@ int census_supported(void);
/** Return the census features currently enabled. */
int census_enabled(void);
/* Internally, Census relies on a context, which should be propagated across
* 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
* functions. Conceptually, contexts should be thought of as specific to
* single RPC/thread. The context can be serialized for passing across the
* wire. */
/**
Context is a handle used by census to represent the current tracing and
tagging information. Contexts should be propagated across RPC's. Contexts
are created by any of the census_start_*_op() functions. A context is
typically used as argument to most census functions. Conceptually, contexts
should be thought of as specific to single RPC/thread. The context can be
serialized for passing across the wire, via census_context_serialize().
*/
typedef struct census_context census_context;
/* This function is called by the RPC subsystem whenever it needs to get a
@ -91,19 +93,6 @@ typedef struct census_context census_context;
size_t census_context_serialize(const census_context *context, char *buffer,
size_t buf_size);
/* Create a new census context, possibly from a serialized buffer. If 'buffer'
* is non-NULL, it is assumed that it is a buffer encoded by
* census_context_serialize(). If `buffer` is NULL, a new, empty context is
* created. The decoded/new contest is returned in 'context'.
*
* Returns 0 if no errors, non-zero if buffer is incorrectly formatted, in
* which case a new empty context will be returned. */
int census_context_deserialize(const char *buffer, census_context **context);
/* The given context is destroyed. Once destroyed, using the context in
* future census calls will result in undefined behavior. */
void census_context_destroy(census_context *context);
/* Distributed traces can have a number of options. */
enum census_trace_mask_values {
CENSUS_TRACE_MASK_NONE = 0, /* Default, empty flags */
@ -114,13 +103,15 @@ enum census_trace_mask_values {
will be the logical or of census_trace_mask_values values. */
int census_trace_mask(const census_context *context);
/* The concept of "operation" is a fundamental concept for Census. An
operation is a logical representation of a action in a RPC-using system. It
is most typically used to represent a single RPC, or a significant sub-part
thereof (e.g. a single logical "read" RPC to a distributed storage system
might do several other actions in parallel, from looking up metadata
/** Set the trace mask associated with a context. */
void census_set_trace_mask(int trace_mask);
/* The concept of "operation" is a fundamental concept for Census. In an RPC
system, and operation typcially represents a single RPC, or a significant
sub-part thereof (e.g. a single logical "read" RPC to a distributed storage
system might do several other actions in parallel, from looking up metadata
indices to making requests of other services - each of these could be a
sub-operation with the larger RPC operation. Census uses operations for the
sub-operation with the larger RPC operation). Census uses operations for the
following:
CPU accounting: If enabled, census will measure the thread CPU time
@ -131,123 +122,152 @@ int census_trace_mask(const census_context *context);
Distributed tracing: Each operation serves as a logical trace span.
Stats collection: Stats are broken down operation (e.g. latency
breakdown for each service/method combination).
Stats collection: Stats are broken down by operation (e.g. latency
breakdown for each unique RPC path).
The following functions serve to delineate the start and stop points for
each logical operation. */
/**
This structure (opaquely) represents a timestamp as used by census to
record the time at which an RPC operation begins.
*/
typedef struct census_timestamp census_timestamp;
/**
Mark the beginning of an RPC operation. The information required to call the
functions to record the start of RPC operations (both client and server) may
not be callable at the true start time of the operation, due to information
not being available (e.g. the census context data will not be available in a
server RPC until at least initial metadata has been processed). To ensure
correct CPU accounting and latency recording, RPC systems can call this
function to get the timestamp of operation beginning. This can later be used
as an argument to census_start_{client,server}_rpc_op(). NB: for correct
CPU accounting, the system must guarantee that the same thread is used
for all request processing after this function is called.
@return A timestamp representing the operation start time.
*/
census_timestamp *census_start_rpc_op_timestamp(void);
/**
Represent functions to map RPC name ID to service/method names. Census
breaks down all RPC stats by service and method names. We leave the
definition and format of these to the RPC system. For efficiency purposes,
we encode these as a single 64 bit identifier, and allow the RPC system to
provide a structure for functions that can convert these to service and
method strings.
TODO(aveitch): Instead of providing this as an argument to the rpc_start_op()
functions, maybe it should be set once at census initialization.
*/
typedef struct {
const char *(*get_rpc_service_name)(gpr_int64 id);
const char *(*get_rpc_method_name)(gpr_int64 id);
} census_rpc_name_info;
/**
Start a client rpc operation. This function will create a new context. If
Start a client rpc operation. This function should be called as early in the
client RPC path as possible. This function will create a new context. If
the context argument is non-null, then the new context will inherit all
its properties, with the following changes:
- create a new operation ID for the new context, marking it as a child of
the previous operation.
- use the new RPC service/method/peer information for tracing and stats
- use the new RPC path and peer information for tracing and stats
collection purposes, rather than those from the original context
- if trace_mask is non-zero, update the trace mask entries associated with
the original context.
If the context argument is NULL, then a new root context is created. This
If the context argument is NULL, then a new root context is created. This
is particularly important for tracing purposes (the trace spans generated
will be unassociated with any other trace spans, except those
downstream). Whatever it's value, the trace_mask will be used for tracing
operations associated with the new context.
@param context The base context. Can be NULL.
@param service RPC service name. On some systems, may include other
parts of RPC identification (e.g. host on gRPC systems).
@param method RPC method name
@param peer RPC peer
@param trace_mask An or of census_trace_mask_values values
@param start_time If NULL, the time of function call is used as the
start time for the operation. If non-NULL, then the time should be in the
past, when the operation was deemed to have started. This is used when
the other information used as arguments is not yet available.
downstream). The trace_mask will be used for tracing operations associated
with the new context.
In some RPC systems (e.g. where load balancing is used), peer information
may not be available at the time the operation starts. In this case, use a
NULL value for peer, and set it later using the
census_set_rpc_client_peer() function.
@param context The parent context. Can be NULL.
@param rpc_name_id The rpc name identifier to be associated with this RPC.
@param rpc_name_info Used to decode rpc_name_id.
@param peer RPC peer. If not available at the time, NULL can be used,
and a later census_set_rpc_client_peer() call made.
@param trace_mask An OR of census_trace_mask_values values. Only used in
the creation of a new root context (context == NULL).
@param start_time A timestamp returned from census_start_rpc_op_timestamp().
Can be NULL. Used to set the true time the operation
begins.
@return A new census context.
*/
census_context *census_start_client_rpc_op(census_context *context,
const char *service,
const char *method, const char *peer,
int trace_mask,
gpr_timespec *start_time);
census_context *census_start_client_rpc_op(
const census_context *context, gpr_int64 rpc_name_id,
const census_rpc_name_info *rpc_name_info, const char *peer, int trace_mask,
const census_timestamp *start_time);
/**
Indicate the start of a server rpc operation, updating the current
context (which should have been created from census_context_deserialize()
(as passed from the client side of the RPC operation) or census_start_op().
- if trace_mask is non-zero, update the trace mask entries associated with
the original context.
@param context The base context. Cannot be NULL.
@param service RPC service name. On some systems, may include other
parts of RPC identification (e.g. host on gRPC systems).
@param method RPC method name
@param peer RPC peer
@param trace_mask An or of census_trace_mask_values values
@param start_time If NULL, the time of function call is used as the
start time for the operation. If non-NULL, then the time should be in the
past, when the operation was deemed to have started. This is used when
the other information used as arguments is not yet available.
Add peer information to a context representing a client RPC operation.
*/
void census_set_rpc_client_peer(census_context *context, const char *peer);
/**
Start a server RPC operation. Returns a new context to be used in future
census calls. If buffer is non-NULL, then the buffer contents should
represent the client context, as generated by census_context_serialize().
If buffer is NULL, a new root context is created.
@param buffer Buffer containing bytes output from census_context_serialize().
@param rpc_name_id The rpc name identifier to be associated with this RPC.
@param rpc_name_info Used to decode rpc_name_id.
@param peer RPC peer.
@param trace_mask An OR of census_trace_mask_values values. Only used in
the creation of a new root context (buffer == NULL).
@param start_time A timestamp returned from census_start_rpc_op_timestamp().
Can be NULL. Used to set the true time the operation
begins.
@return A new census context.
*/
void census_start_server_rpc_op(census_context *context, const char *service,
const char *method, const char *peer,
int trace_mask, gpr_timespec *start_time);
census_context *census_start_server_rpc_op(
const char *buffer, gpr_int64 rpc_name_id,
const census_rpc_name_info *rpc_name_info, const char *peer, int trace_mask,
census_timestamp *start_time);
/**
Start a new, non-RPC census operation. In general, this function works very
similarly to census_start_client_rpc_op, with the primary differennce being
the abscence of peer information, and the replacement of service and method
names with the more general family/name. If the context argument is
non-null, then the new context will inherit all its properties, with the
following changes:
Start a new, non-RPC operation. In general, this function works very
similarly to census_start_client_rpc_op, with the primary difference being
the replacement of host/path information with the more generic family/name
tags. If the context argument is non-null, then the new context will
inherit all its properties, with the following changes:
- create a new operation ID for the new context, marking it as a child of
the previous operation.
- use the family and name information for tracing and stats collection
purposes, rather than those from the original context
- if trace_mask is non-zero, update the trace mask entries associated with
the original context.
If the context argument is NULL, then a new root context is created. This
If the context argument is NULL, then a new root context is created. This
is particularly important for tracing purposes (the trace spans generated
will be unassociated with any other trace spans, except those
downstream). Whatever it's value, the trace_mask will be used for tracing
downstream). The trace_mask will be used for tracing
operations associated with the new context.
@param context The base context. Can be NULL.
@param family Family name to associate with the trace
@param name Name within family to associated with traces/stats
@param trace_mask An or of census_trace_mask_values values
@param start_time If NULL, the time of function call is used as the
start time for the operation. If non-NULL, then the time should be in the
past, when the operation was deemed to have started. This is used when
the other information used as arguments is not yet available.
@param trace_mask An OR of census_trace_mask_values values. Only used if
context is NULL.
@return A new census context.
*/
census_context *census_start_op(census_context *context, const char *family,
const char *name, int trace_mask,
gpr_timespec *start_time);
const char *name, int trace_mask);
/** End a tracing operation. Must be matched with an earlier
* census_start_*_op*() call. */
void census_trace_end_op(census_context *context, int status);
/** End an operation started by any of the census_start_*_op*() calls. */
void census_end_op(census_context *context, int status);
/** Insert a trace record into the trace stream. The record consists of an
* arbitrary size buffer, the size of which is provided in 'n'. */
void census_trace_print(census_context *context, const char *buffer, size_t n);
/** Retrieve active ops as a proto. Note that since we don't have proto
manipulation available in the grpc core yet, arguments etc. are left
unspecified for now. */
void census_get_active_ops_as_proto(/* pointer to proto */);
/** Retrieve all active trace records as a proto. Note that since we don't
have proto manipulation available in the grpc core yet, arguments etc. are
left unspecified for now. This function will clear existing trace
records. */
void census_get_trace_as_proto(/* pointer to proto */);
/* A census statistic to be recorded comprises two parts: an ID for the
* particular statistic and the value to be recorded against it. */
typedef struct {

@ -44,16 +44,3 @@ size_t census_context_serialize(const census_context *context, char *buffer,
/* TODO(aveitch): implement serialization */
return 0;
}
int census_context_deserialize(const char *buffer, census_context **context) {
int ret = 0;
if (buffer != NULL) {
/* TODO(aveitch): implement deserialization. */
ret = 1;
}
*context = gpr_malloc(sizeof(census_context));
memset(*context, 0, sizeof(census_context));
return ret;
}
void census_context_destroy(census_context *context) { gpr_free(context); }

@ -35,24 +35,11 @@
#include <grpc/grpc.h>
#include "src/core/surface/call.h"
static void grpc_census_context_destroy(void *context) {
census_context_destroy((census_context *)context);
}
void grpc_census_call_set_context(grpc_call *call, census_context *context) {
if (census_enabled() == CENSUS_FEATURE_NONE) {
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 {
if (context != NULL) {
grpc_call_context_set(call, GRPC_CONTEXT_TRACING, context, NULL);
}
}

@ -0,0 +1,57 @@
/*
* Copyright 2015, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <grpc/census.h>
/* TODO(aveitch): These are all placeholder implementations. */
census_timestamp *census_start_rpc_op_timestamp(void) { return NULL; }
census_context *census_start_client_rpc_op(
const census_context *context, gpr_int64 rpc_name_id,
const census_rpc_name_info *rpc_name_info, const char *peer, int trace_mask,
const census_timestamp *start_time) {
return NULL;
}
census_context *census_start_server_rpc_op(
const char *buffer, gpr_int64 rpc_name_id,
const census_rpc_name_info *rpc_name_info, const char *peer, int trace_mask,
census_timestamp *start_time) {
return NULL;
}
census_context *census_start_op(census_context *context, const char *family,
const char *name, int trace_mask) {
return NULL;
}
void census_end_op(census_context *context, int status) {}

@ -39,29 +39,7 @@ int census_trace_mask(const census_context *context) {
return CENSUS_TRACE_MASK_NONE;
}
census_context *census_start_client_rpc_op(census_context *context,
const char *service,
const char *method, const char *peer,
int trace_mask,
gpr_timespec *start_time) {
return NULL;
}
void census_start_server_rpc_op(census_context *context, const char *service,
const char *method, const char *peer,
int trace_mask, gpr_timespec *start_time) {}
census_context *census_start_op(census_context *context, const char *family,
const char *name, int trace_mask,
gpr_timespec *start_time) {
return NULL;
}
void census_trace_end_op(census_context *context, int status) {}
void census_set_trace_mask(int trace_mask) {}
void census_trace_print(census_context *context, const char *buffer, size_t n) {
}
void census_get_active_ops_as_proto(/* pointer to proto */) {}
void census_get_trace_as_proto(/* pointer to proto */) {}

@ -1021,6 +1021,7 @@ src/core/transport/transport.c \
src/core/transport/transport_op_string.c \
src/core/census/context.c \
src/core/census/initialize.c \
src/core/census/operation.c \
src/core/census/record_stat.c \
src/core/census/tracing.c \
include/grpc/support/alloc.h \

@ -11056,6 +11056,7 @@
"src/core/census/context.h",
"src/core/census/grpc_context.c",
"src/core/census/initialize.c",
"src/core/census/operation.c",
"src/core/census/record_stat.c",
"src/core/census/rpc_stat_id.h",
"src/core/census/tracing.c",
@ -11509,6 +11510,7 @@
"src/core/census/context.h",
"src/core/census/grpc_context.c",
"src/core/census/initialize.c",
"src/core/census/operation.c",
"src/core/census/record_stat.c",
"src/core/census/rpc_stat_id.h",
"src/core/census/tracing.c",

@ -623,6 +623,8 @@
</ClCompile>
<ClCompile Include="..\..\src\core\census\initialize.c">
</ClCompile>
<ClCompile Include="..\..\src\core\census\operation.c">
</ClCompile>
<ClCompile Include="..\..\src\core\census\record_stat.c">
</ClCompile>
<ClCompile Include="..\..\src\core\census\tracing.c">

@ -415,6 +415,9 @@
<ClCompile Include="..\..\src\core\census\initialize.c">
<Filter>src\core\census</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\census\operation.c">
<Filter>src\core\census</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\census\record_stat.c">
<Filter>src\core\census</Filter>
</ClCompile>

@ -556,6 +556,8 @@
</ClCompile>
<ClCompile Include="..\..\src\core\census\initialize.c">
</ClCompile>
<ClCompile Include="..\..\src\core\census\operation.c">
</ClCompile>
<ClCompile Include="..\..\src\core\census\record_stat.c">
</ClCompile>
<ClCompile Include="..\..\src\core\census\tracing.c">

@ -346,6 +346,9 @@
<ClCompile Include="..\..\src\core\census\initialize.c">
<Filter>src\core\census</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\census\operation.c">
<Filter>src\core\census</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\census\record_stat.c">
<Filter>src\core\census</Filter>
</ClCompile>

Loading…
Cancel
Save