1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#ifndef AWS_COMMON_STATISTICS_H
#define AWS_COMMON_STATISTICS_H
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <aws/common/common.h>
#include <aws/common/package.h>
#include <aws/common/stdint.h>
AWS_PUSH_SANE_WARNING_LEVEL
struct aws_array_list;
typedef uint32_t aws_crt_statistics_category_t;
/* Each library gets space for 2^^8 category entries */
enum {
AWS_CRT_STATISTICS_CATEGORY_STRIDE_BITS = 8,
};
#define AWS_CRT_STATISTICS_CATEGORY_STRIDE (1U << AWS_CRT_STATISTICS_CATEGORY_STRIDE_BITS)
#define AWS_CRT_STATISTICS_CATEGORY_BEGIN_RANGE(x) ((x)*AWS_CRT_STATISTICS_CATEGORY_STRIDE)
#define AWS_CRT_STATISTICS_CATEGORY_END_RANGE(x) (((x) + 1) * AWS_CRT_STATISTICS_CATEGORY_STRIDE - 1)
/**
* The common-specific range of the aws_crt_statistics_category cross-library enum.
*
* This enum functions as an RTTI value that lets statistics handler's interpret (via cast) a
* specific statistics structure if the RTTI value is understood.
*
* Common doesn't have any statistics structures presently, so its range is essentially empty.
*
*/
enum aws_crt_common_statistics_category {
AWSCRT_STAT_CAT_INVALID = AWS_CRT_STATISTICS_CATEGORY_BEGIN_RANGE(AWS_C_COMMON_PACKAGE_ID)
};
/**
* Pattern-struct that functions as a base "class" for all statistics structures. To conform
* to the pattern, a statistics structure must have its first member be the category. In that
* case it becomes "safe" to cast from aws_crt_statistics_base to the specific statistics structure
* based on the category value.
*/
struct aws_crt_statistics_base {
aws_crt_statistics_category_t category;
};
/**
* The start and end time, in milliseconds-since-epoch, that a set of statistics was gathered over.
*/
struct aws_crt_statistics_sample_interval {
uint64_t begin_time_ms;
uint64_t end_time_ms;
};
struct aws_crt_statistics_handler;
/*
* Statistics intake function. The array_list is a list of pointers to aws_crt_statistics_base "derived" (via
* pattern) objects. The handler should iterate the list and downcast elements whose RTTI category it understands,
* while skipping those it does not understand.
*/
typedef void(aws_crt_statistics_handler_process_statistics_fn)(
struct aws_crt_statistics_handler *handler,
struct aws_crt_statistics_sample_interval *interval,
struct aws_array_list *stats,
void *context);
/*
* Destroys a statistics handler implementation
*/
typedef void(aws_crt_statistics_handler_destroy_fn)(struct aws_crt_statistics_handler *handler);
/*
* The period, in milliseconds, that the handler would like to be informed of statistics. Statistics generators are
* not required to honor this value, but should if able.
*/
typedef uint64_t(aws_crt_statistics_handler_get_report_interval_ms_fn)(struct aws_crt_statistics_handler *);
/**
* Vtable for functions that all statistics handlers must implement
*/
struct aws_crt_statistics_handler_vtable {
aws_crt_statistics_handler_process_statistics_fn *process_statistics;
aws_crt_statistics_handler_destroy_fn *destroy;
aws_crt_statistics_handler_get_report_interval_ms_fn *get_report_interval_ms;
};
/**
* Base structure for all statistics handler implementations.
*
* A statistics handler is an object that listens to a stream of polymorphic (via the category RTTI enum) statistics
* structures emitted from some arbitrary source. In the initial implementation, statistics handlers are primarily
* attached to channels, where they monitor IO throughput and state data (from channel handlers) to determine a
* connection's health.
*
* Statistics handlers are a generalization of the timeout and bandwidth filters that are often associated with
* SDK network connections. Configurable, default implementations are defined at the protocol level (http, etc...)
* where they can be attached at connection (channel) creation time.
*/
struct aws_crt_statistics_handler {
struct aws_crt_statistics_handler_vtable *vtable;
struct aws_allocator *allocator;
void *impl;
};
AWS_EXTERN_C_BEGIN
/**
* Submits a list of statistics objects to a statistics handler for processing
*
* handler - the statistics handler that will process the statistics objects
* interval - time period over which the statistics were gathered
* stats - list of pointers to structures that can be case to aws_crt_statistics_base (i.e. have category as a first
* member)
* context - (optional) additional context specific to where the statistics handler has been attached
*/
AWS_COMMON_API
void aws_crt_statistics_handler_process_statistics(
struct aws_crt_statistics_handler *handler,
struct aws_crt_statistics_sample_interval *interval,
struct aws_array_list *stats,
void *context);
/**
* Queries the frequency (via an interval in milliseconds) which a statistics handler would like to be informed
* of statistics.
*/
AWS_COMMON_API
uint64_t aws_crt_statistics_handler_get_report_interval_ms(struct aws_crt_statistics_handler *handler);
/**
* completely destroys a statistics handler. The handler's cleanup function must clean up the impl portion completely
* (including its allocation, if done separately).
*/
AWS_COMMON_API
void aws_crt_statistics_handler_destroy(struct aws_crt_statistics_handler *handler);
AWS_EXTERN_C_END
AWS_POP_SANE_WARNING_LEVEL
#endif /* AWS_COMMON_STATISTICS_H */
|