blob: 0703e3818a7be3cc3166854f97cb3130de146c05 [file]
/*
* Copyright (c) 2024 Mustafa Abdullah Kus, Sparse Technology
* Copyright (c) 2024 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_PROMETHEUS_GAUGE_H_
#define ZEPHYR_INCLUDE_PROMETHEUS_GAUGE_H_
/**
* @file
*
* @brief Prometheus gauge APIs.
*
* @addtogroup prometheus
* @{
*/
#include <zephyr/sys/iterable_sections.h>
#include <zephyr/net/prometheus/metric.h>
/**
* @brief Type used to represent a Prometheus gauge metric.
*
* * References
* * See https://prometheus.io/docs/concepts/metric_types/#gauge
*/
struct prometheus_gauge {
/** Base of the Prometheus gauge metric */
struct prometheus_metric base;
/** Value of the Prometheus gauge metric */
double value;
/** User data */
void *user_data;
};
/**
* @brief Prometheus Gauge definition.
*
* This macro defines a Gauge metric. If you want to make the gauge static,
* then add "static" keyword before the PROMETHEUS_GAUGE_DEFINE.
*
* @param _name The gauge metric name.
* @param _desc Gauge description
* @param _label Label for the metric. Additional labels can be added at runtime.
* @param _collector Collector to map this metric. Can be set to NULL if it not yet known.
* @param ... Optional user data specific to this metric instance.
*
* Example usage:
* @code{.c}
*
* PROMETHEUS_GAUGE_DEFINE(http_request_gauge, "HTTP request gauge",
* ({ .key = "http_request", .value = "request_count" }),
* NULL);
*
* @endcode
*/
#define PROMETHEUS_GAUGE_DEFINE(_name, _desc, _label, _collector, ...) \
STRUCT_SECTION_ITERABLE(prometheus_gauge, _name) = { \
.base.name = STRINGIFY(_name), \
.base.type = PROMETHEUS_GAUGE, \
.base.description = _desc, \
.base.labels[0] = __DEBRACKET _label, \
.base.num_labels = 1, \
.base.collector = _collector, \
.value = 0.0, \
.user_data = COND_CODE_0( \
NUM_VA_ARGS_LESS_1(LIST_DROP_EMPTY(__VA_ARGS__, _)), \
(NULL), \
(GET_ARG_N(1, __VA_ARGS__))), \
}
/**
* @brief Set the value of a Prometheus gauge metric
*
* Sets the value of the specified gauge metric to the given value.
*
* @param gauge Pointer to the gauge metric to set.
* @param value Value to set the gauge metric to.
*
* @return 0 on success, -EINVAL if the value is negative.
*/
int prometheus_gauge_set(struct prometheus_gauge *gauge, double value);
/**
* @}
*/
#endif /* ZEPHYR_INCLUDE_PROMETHEUS_GAUGE_H_ */