Files
DedicatedServerCourse/Plugins/GameLiftPlugin/Source/AWSSDK/Include/aws/common/statistics.h
2026-02-28 12:32:28 -05:00

147 lines
5.3 KiB
C

#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 */