diff options
author | Alistair Veitch <aveitch@google.com> | 2015-08-27 13:16:00 -0700 |
---|---|---|
committer | Alistair Veitch <aveitch@google.com> | 2015-08-27 13:16:00 -0700 |
commit | 9a09982e2dd193a91430ba70ed4e446d8d96e363 (patch) | |
tree | 2898fc894b357f6998ca102b989f82c8c2e325e6 /include/grpc/census.h | |
parent | 072a6f8f6561b93964df26a261bddb063ee5d2cd (diff) |
view and aggregation API
Diffstat (limited to 'include/grpc/census.h')
-rw-r--r-- | include/grpc/census.h | 236 |
1 files changed, 138 insertions, 98 deletions
diff --git a/include/grpc/census.h b/include/grpc/census.h index db3e89685a..968f5825a5 100644 --- a/include/grpc/census.h +++ b/include/grpc/census.h @@ -159,114 +159,154 @@ int census_tag_set_next(census_tag_set_iterator *it, census_tag_const *tag); invalidated, and should not be used once close is called. */ void census_tag_set_close(census_tag_set_iterator *it); -/* A census statistic to be recorded comprises two parts: an ID for the - * particular statistic and the value to be recorded against it. */ +/* Core stats collection API's. There following concepts are used: + * Aggregation: A collection of values. Census supports the following + aggregation types: + Scalar - a single scalar value. Typically used for keeping (e.g.) + counts of events. + Distribution - statistical distribution information, used for + recording average, standard deviation etc. + Histogram - a histogram of measurements falling in defined bucket + boundaries. + Window - a count of events that happen in reolling time window. + New aggregation types can be added by the user, if desired (see + census_register_aggregation()). + * Metric: Each measurement is for a single metric. Examples include RPC + latency, CPU seconds consumed, and bytes transmitted. + * View: A view is a tag set, in which the tag values are regular expressions, + combined with an arbitrary number of aggregations and their initialization + parameters. + + Each metric can have an arbitrary number of views by which it will be + broken down. For every measurement recorded, they are broken down by + unique tag combinations, and recorded in each matvhing view/aggregation. +*/ + +/* A single value to be recorded comprises two parts: an ID for the particular + * metric and the value to be recorded against it. */ typedef struct { - int id; + gpr_int32 metric_id; double value; -} census_stat; +} census_value; + +/* Record new usage values against the given context. */ +void census_record_usage(census_context *context, census_value *values, + size_t nvalues); + +/** Structure used to describe an aggregation type. */ +typedef struct { + /* Create a new aggregation. The pointer returned can be used in future calls + to free(), record(), data() and reset(). */ + void *(*create)(const void *create_arg); + /* Destroy an aggregation created by create() */ + void (*free)(void *aggregation); + /* Record a new value against aggregation. */ + void (*record)(void *aggregation, double value); + /* Return current aggregation data. The caller must cast this object into + the correct type for the aggregation result. The object returned can be + freed by using free_data(). */ + const void *(*data)(const void *aggregation); + /* destroy an aggregation result eturned from get_aggregation(). */ + void (*free_data)(const void *data); + /* Reset an aggregation to default (zero) values. */ + void (*reset)(void *aggregation); +} census_aggregation_descriptor; + +/** Register a new aggregation type. + @param descriptor Describes aggregation + @return An identifier that can be used to identify the aggregation in other + census functions. */ +gpr_int32 census_register_aggregation( + const census_aggregation_descriptor *descriptor); + +/* Aggregation Identifiers for built-in census aggregations. */ +#define CENSUS_AGGREGATION_ID_SCALAR ((gpr_int32)0) +#define CENSUS_AGGREGATION_ID_DISTRIBUTION ((gpr_int32)1) +#define CENSUS_AGGREGATION_ID_HISTOGRAM ((gpr_int32)2) +#define CENSUS_AGGREGATION_ID_WINDOW ((gpr_int32)3) + +/** Information needed to instantiate a new aggregation. Used in view + construction via census_define_view(). */ +typedef struct { + gpr_int32 id; /* aggregation ID */ + const void + *create_arg; /* Argument to be used for aggregation initialization. */ +} census_aggregation; -/* Record new stats against the given context. */ -void census_record_stat(census_context *context, census_stat *stats, - size_t nstats); +/** Type representing a single view. */ +typedef struct census_view census_view; -/* Stats Configuration - Census clients can use these functions and structures - to extend and define what stats get recorded for what measurements. */ +/** Create a new view. + @param tags tags that define the view + @param aggregations aggregations to associate with the view + @param naggregations number of aggregations -/** Stats types supported by census. */ -typedef enum { - CENSUS_STAT_SCALAR = 0, /* Simple scalar */ - CENSUS_STAT_DISTRIBUTION = 1, /* count, average, variance */ - CENSUS_STAT_HISTOGRAM = 2, /* Histogram. */ - CENSUS_STAT_WINDOW = 3, /* Count over a time window. */ - CENSUS_STAT_NSTATS = 4 /* Total number of stats types. */ -} census_stat_type; + @return A new census view +*/ +const census_view *census_define_view(const census_tag_set *tags, + const census_aggregation *aggregations, + size_t naggregations); -/* - Each stats type differs in how it is initialized, how it is represented, and - the results it provides. The following structures allow us to use a generic - type for each of those. - - Types referenced (one for each stat type in census_stat_type, by creation - arguments, output blob, and object representation. */ - -typedef struct census_stat_scalar_create_arg census_stat_scalar_create_arg; -typedef struct census_stat_distribution_create_arg - census_stat_distribution_create_arg; -typedef struct census_stat_histogram_create_arg - census_stat_histogram_create_arg; -typedef struct census_stat_window_create_arg census_stat_window_create_arg; - -/** - Type for representing information to construct a new instance of a given - stats type (e.g. histogram bucket boundaries). +/** Number of aggregations associated with view. */ +size_t census_view_naggregations(const census_view *view); + +/** Get tags associated with view. */ +const census_tag_set *census_view_tags(const census_view *view); + +/** Get aggregations associated with a view. */ +const census_aggregation *census_view_aggregrations(const census_view *view); + +/** Associate a given view with a metric. Every metric can have many different + views. + @param metric_id Identifier of metric with which to attah the view + @param view View to attach to the metric + @return A view identifier: can be used to retrieve aggregation data from + the view using census_view_data(). */ +gpr_int64 census_attach_view(gpr_int32 metric_id, const census_view *view); + +/** Holds aggregation data, as it applies to a particular view. This structure + is used as one component of the data returned from census_get_view_data(). */ typedef struct { - census_stat_type stat_type; /* The "real" type of the stat. */ - union { - const census_stat_scalar_create_arg *scalar_arg; - const census_stat_distribution_create_arg *distribution_arg; - const census_stat_histogram_create_arg *histogram_arg; - const census_stat_window_create_arg *window_arg; - } -} census_stat_create_arg; - -/** - Type for representing a single stats result. */ + /** Aggregation index in original view. Use as (e.g.) + census_view_aggregations(view)[index] to get the original + census_aggregation structure. */ + size_t index; + /** Data as returned from the data() function for the relevant + aggregation descriptor. It is the user responsibility to cast this to the + correct type for the aggregation. */ + void *data; +} census_aggregation_data; + +/** Holds all the aggregation data for a particular view instantiation. Forms + part of the data returned by census_get_view_data(). */ typedef struct { - const census_tag_set *view; /* Unique tags associated with this result. */ - census_stat_type stat_type; - union { - const census_stat_scalar_result *scalar_result; - const census_stat_distribution_result *distribution_result; - const census_stat_histogram_result *histogram_result; - const census_stat_window_result *window_result; - } -} census_stat_result; - -/** - Generic type for representing a stat "object". -*/ -typdef struct { - census_stat_type stat_type; - union { - census_stat_scalar *scalar; - census_stat_distribution *distribution; - census_stat_histogram *histogram; - census_stat_window *window; - } -} census_stat; - -/** - Structure holding function pointers and associated information needed to - manipulate a statstics "object". Every stats type must provide an instance - of this structure. */ + const census_tag_set *tags; /* Tags for this set of aggregations */ + size_t naggregations; /* Number of aggregations in data. */ + const census_aggregation_data *data; /* Aggregation data */ +} census_view_aggregation_data; + +/** Census view data as returned by census_get_view_data(). */ typedef struct { - /* Create a new statistic. The pointer returned can be used in future calls - to clone_stat(), destroy_stat(), record_stat() and get_stats(). */ - (census_stat *) (*create_stat)(const census_stat_create_arg *create_arg); - /* Create a new statistic, using an existing one as base. */ - (census_stat *) (*clone_stat)(const census_stat *stat); - /* destroy a stats object created by {create,clone}_stat(). */ - (void) (*destroy_stat)(census_stat *stat); - /* Record a new value against a given statistics object instance. */ - (void) (*record_stat)(census_stat *stat, double value); - /* Return current state of a stat. The object returned can be freed by - using destroy_stats_result(). */ - (const census_stat_result *) (*get_stat)(const census_stat *stat); - /* destroy a stats result object, as returned from get_stat(). */ - (void) (*destroy_stats_result)(census_stat_result *result); - /* Reset a stats values. */ - (void) (*reset_stat)(census_stat *stat); -} census_stat; - -gpr_int32 census_define_view(const census_tag_set *view); - -gpr_int32 census_define_stat(gpr_int32 metric_id, gpr_int32 view_id, - const census_stat *stat, - const census_stat_create_arg *create_arg); - -census_stat_result *census_get_stat(gpr_int32 stat_id, gpr_int32 *nstats); + const census_view *view; /* Original view */ + size_t n_tag_sets; /* Number of unique tag sets that matched view. */ + const census_view_aggregation_data *data; /* n_tag_sets entries */ +} census_view_data; + +/** Get data from aggregations associated with a view. + @param view_id View identifier returned from census_attach_view + @param aggregation_indices Indexes of aggregations (relative to original view) + for which to return current data. This parameter is ignored if + nindices == 0. + @param nindices. Number of entries in aggregation_indices. If this is set to + 0, then all aggregations for the current view are returned. +*/ +const census_view_data *census_get_view_data(gpr_int64 view_id, + size_t *aggregation_indices, + size_t nindices); + +/** Reset all view data to zero for the specified view id. */ +void census_reset_view_data(gpr_int64 view_id); #ifdef __cplusplus } |