173 lines
5.0 KiB
C
173 lines
5.0 KiB
C
/**
|
|
* @file addons/metrics.h
|
|
* @brief Metrics module.
|
|
*
|
|
* The metrics module extracts metrics from components and makes them available
|
|
* through a unified component interface.
|
|
*/
|
|
|
|
#ifdef FLECS_METRICS
|
|
|
|
/**
|
|
* @defgroup c_addons_metrics Metrics
|
|
* @brief Collect user-defined metrics from ECS data.
|
|
*
|
|
* \ingroup c_addons
|
|
* @{
|
|
*/
|
|
|
|
#ifndef FLECS_METRICS_H
|
|
#define FLECS_METRICS_H
|
|
|
|
#ifndef FLECS_META
|
|
#define FLECS_META
|
|
#endif
|
|
|
|
#ifndef FLECS_UNITS
|
|
#define FLECS_UNITS
|
|
#endif
|
|
|
|
#ifndef FLECS_PIPELINE
|
|
#define FLECS_PIPELINE
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
FLECS_API extern ECS_COMPONENT_DECLARE(FlecsMetrics);
|
|
|
|
/** Tag added to metrics, and used as first element of metric kind pair */
|
|
FLECS_API extern ECS_TAG_DECLARE(EcsMetric);
|
|
|
|
/** Metric that has monotonically increasing value */
|
|
FLECS_API extern ECS_TAG_DECLARE(EcsCounter);
|
|
|
|
/** Counter metric that is auto-incremented by source value */
|
|
FLECS_API extern ECS_TAG_DECLARE(EcsCounterIncrement);
|
|
|
|
/** Counter metric that counts the number of entities with an id */
|
|
FLECS_API extern ECS_TAG_DECLARE(EcsCounterId);
|
|
|
|
/** Metric that represents current value */
|
|
FLECS_API extern ECS_TAG_DECLARE(EcsGauge);
|
|
|
|
/** Tag added to metric instances */
|
|
FLECS_API extern ECS_TAG_DECLARE(EcsMetricInstance);
|
|
|
|
/** Component with metric instance value */
|
|
FLECS_API extern ECS_COMPONENT_DECLARE(EcsMetricValue);
|
|
|
|
/** Component with entity source of metric instance */
|
|
FLECS_API extern ECS_COMPONENT_DECLARE(EcsMetricSource);
|
|
|
|
typedef struct EcsMetricValue {
|
|
double value;
|
|
} EcsMetricValue;
|
|
|
|
typedef struct EcsMetricSource {
|
|
ecs_entity_t entity;
|
|
} EcsMetricSource;
|
|
|
|
typedef struct ecs_metric_desc_t {
|
|
int32_t _canary;
|
|
|
|
/** Entity associated with metric */
|
|
ecs_entity_t entity;
|
|
|
|
/** Entity associated with member that stores metric value. Must not be set
|
|
* at the same time as id. Cannot be combined with EcsCounterId. */
|
|
ecs_entity_t member;
|
|
|
|
/* Member dot expression. Can be used instead of member and supports nested
|
|
* members. Must be set together with id and should not be set at the same
|
|
* time as member. */
|
|
const char *dotmember;
|
|
|
|
/** Tracks whether entities have the specified component id. Must not be set
|
|
* at the same time as member. */
|
|
ecs_id_t id;
|
|
|
|
/** If id is a (R, *) wildcard and relationship R has the OneOf property,
|
|
* setting this value to true will track individual targets.
|
|
* If the kind is EcsCountId and the id is a (R, *) wildcard, this value
|
|
* will create a metric per target. */
|
|
bool targets;
|
|
|
|
/** Must be EcsGauge, EcsCounter, EcsCounterIncrement or EcsCounterId */
|
|
ecs_entity_t kind;
|
|
|
|
/** Description of metric. Will only be set if FLECS_DOC addon is enabled */
|
|
const char *brief;
|
|
} ecs_metric_desc_t;
|
|
|
|
/** Create a new metric.
|
|
* Metrics are entities that store values measured from a range of different
|
|
* properties in the ECS storage. Metrics provide a single unified interface to
|
|
* discovering and reading these values, which can be useful for monitoring
|
|
* utilities, or for debugging.
|
|
*
|
|
* Examples of properties that can be measured by metrics are:
|
|
* - Component member values
|
|
* - How long an entity has had a specific component
|
|
* - How long an entity has had a specific target for a relationship
|
|
* - How many entities have a specific component
|
|
*
|
|
* Metrics can either be created as a "gauge" or "counter". A gauge is a metric
|
|
* that represents the value of something at a specific point in time, for
|
|
* example "velocity". A counter metric represents a value that is monotonically
|
|
* increasing, for example "miles driven".
|
|
*
|
|
* There are three different kinds of counter metric kinds:
|
|
* - EcsCounter
|
|
* When combined with a member, this will store the actual value of the member
|
|
* in the metric. This is useful for values that are already counters, such as
|
|
* a MilesDriven component.
|
|
* This kind creates a metric per entity that has the member/id.
|
|
*
|
|
* - EcsCounterIncrement
|
|
* When combined with a member, this will increment the value of the metric by
|
|
* the value of the member * delta_time. This is useful for values that are
|
|
* not counters, such as a Velocity component.
|
|
* This kind creates a metric per entity that has the member.
|
|
*
|
|
* - EcsCounterId
|
|
* This metric kind will count the number of entities with a specific
|
|
* (component) id. This kind creates a single metric instance for regular ids,
|
|
* and a metric instance per target for wildcard ids when targets is set.
|
|
*
|
|
* @param world The world.
|
|
* @param desc Metric description.
|
|
* @return The metric entity.
|
|
*/
|
|
FLECS_API
|
|
ecs_entity_t ecs_metric_init(
|
|
ecs_world_t *world,
|
|
const ecs_metric_desc_t *desc);
|
|
|
|
/** Shorthand for creating a metric with ecs_metric_init.
|
|
*
|
|
* Example:
|
|
* ecs_metric(world, {
|
|
* .member = ecs_lookup_fullpath(world, "Position.x")
|
|
* .kind = EcsGauge
|
|
* });
|
|
*/
|
|
#define ecs_metric(world, ...)\
|
|
ecs_metric_init(world, &(ecs_metric_desc_t) __VA_ARGS__ )
|
|
|
|
/* Module import */
|
|
FLECS_API
|
|
void FlecsMetricsImport(
|
|
ecs_world_t *world);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/** @} */
|
|
|
|
#endif
|