aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/grpc/census.h174
1 files changed, 149 insertions, 25 deletions
diff --git a/include/grpc/census.h b/include/grpc/census.h
index a32da6f364..e2bef9add3 100644
--- a/include/grpc/census.h
+++ b/include/grpc/census.h
@@ -46,11 +46,12 @@ extern "C" {
/* Identify census functionality that can be enabled via census_initialize(). */
enum census_functions {
- CENSUS_NONE = 0, /* Do not enable census. */
- CENSUS_TRACING = 1, /* Enable census tracing. */
- CENSUS_STATS = 2, /* Enable Census stats collection. */
- CENSUS_CPU = 4, /* Enable Census CPU usage collection. */
- CENSUS_ALL = CENSUS_TRACING | CENSUS_STATS | CENSUS_CPU
+ CENSUS_NONE = 0, /* Do not enable census. */
+ CENSUS_TRACING = 1, /* Enable distributed tracing. */
+ CENSUS_STATS = 2, /* Enable stats collection. */
+ CENSUS_CPU = 4, /* Enable CPU usage collection. */
+ CENSUS_ACTIVE_OPS = 8, /* Trace Active operations. */
+ CENSUS_ALL = CENSUS_TRACING | CENSUS_STATS | CENSUS_CPU | CENSUS_ACTIVE_OPS
};
/* Shutdown and startup census subsystem. The 'functions' argument should be
@@ -100,26 +101,149 @@ int census_context_deserialize(const char *buffer, census_context **context);
* future census calls will result in undefined behavior. */
void census_context_destroy(census_context *context);
-/* Start a new logical tracing "operation". The operation ends when
- * census_trace_end_op() is called. */
-void census_trace_start_op(census_context *context);
-+ service method start time,
- peer ? +sampled ?
-
- /* End a tracing operation. Must be matched with an earlier
- * census_start_op().
- */
- void
- census_trace_end_op(census_context *context);
-+ 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);
-
-census_active_ops_as_html() + struct or char *query ops
- census_sampled_ops_as_html()
+/* Distributed traces can have a number of options. */
+enum census_trace_mask_values {
+ CENSUS_TRACE_MASK_NONE = 0, /* Default, empty flags */
+ CENSUS_TRACE_MASK_IS_SAMPLED = 1, /* RPC tracing enabled for this context. */
+};
+
+/** Get the current trace mask associated with this context. The value returned
+ 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
+ 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
+ following:
+
+ CPU accounting: If enabled, census will measure the thread CPU time
+ consumed between operation start and end times.
+
+ Active operations: Census will maintain information on all currently
+ active operations.
+
+ 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).
+
+ The following functions serve to delineate the start and stop points for
+ each logical operation. */
+/**
+ Start a client rpc operation. 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
+ 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
+ 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.
+
+ @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);
+
+/**
+ 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.
+ */
+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);
+
+/**
+ 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:
+ - 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
+ 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 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.
+
+ @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);
+
+/** End a tracing operation. Must be matched with an earlier
+ * census_start_*_op*() call. */
+void census_trace_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 */);
#ifdef __cplusplus
}