Line data Source code
1 1 : /* 2 : * Copyright (c) 2024 Mustafa Abdullah Kus, Sparse Technology 3 : * Copyright (c) 2024 Nordic Semiconductor 4 : * 5 : * SPDX-License-Identifier: Apache-2.0 6 : */ 7 : 8 : #ifndef ZEPHYR_INCLUDE_PROMETHEUS_COUNTER_H_ 9 : #define ZEPHYR_INCLUDE_PROMETHEUS_COUNTER_H_ 10 : 11 : /** 12 : * @file 13 : * 14 : * @brief Prometheus counter APIs. 15 : * 16 : * @addtogroup prometheus 17 : * @{ 18 : */ 19 : 20 : #include <stdint.h> 21 : 22 : #include <zephyr/sys/iterable_sections.h> 23 : #include <zephyr/net/prometheus/metric.h> 24 : 25 : /** 26 : * @brief Type used to represent a Prometheus counter metric. 27 : * 28 : * * References 29 : * * See https://prometheus.io/docs/concepts/metric_types/#counter 30 : */ 31 1 : struct prometheus_counter { 32 : /** Base of the Prometheus counter metric */ 33 1 : struct prometheus_metric base; 34 : /** Value of the Prometheus counter metric */ 35 1 : uint64_t value; 36 : /** User data */ 37 1 : void *user_data; 38 : }; 39 : 40 : /** 41 : * @brief Prometheus Counter definition. 42 : * 43 : * This macro defines a Counter metric. If you want to make the counter static, 44 : * then add "static" keyword before the PROMETHEUS_COUNTER_DEFINE. 45 : * 46 : * @param _name The counter metric name 47 : * @param _desc Counter description 48 : * @param _label Label for the metric. Additional labels can be added at runtime. 49 : * @param _collector Collector to map this metric. Can be set to NULL if it not yet known. 50 : * @param ... Optional user data specific to this metric instance. 51 : * 52 : * Example usage: 53 : * @code{.c} 54 : * 55 : * PROMETHEUS_COUNTER_DEFINE(http_request_counter, "HTTP request counter", 56 : * ({ .key = "http_request", .value = "request_count" }), 57 : * NULL); 58 : * @endcode 59 : */ 60 1 : #define PROMETHEUS_COUNTER_DEFINE(_name, _desc, _label, _collector, ...) \ 61 : STRUCT_SECTION_ITERABLE(prometheus_counter, _name) = { \ 62 : .base.name = STRINGIFY(_name), \ 63 : .base.type = PROMETHEUS_COUNTER, \ 64 : .base.description = _desc, \ 65 : .base.labels[0] = __DEBRACKET _label, \ 66 : .base.num_labels = 1, \ 67 : .base.collector = _collector, \ 68 : .value = 0ULL, \ 69 : .user_data = COND_CODE_0( \ 70 : NUM_VA_ARGS_LESS_1(LIST_DROP_EMPTY(__VA_ARGS__, _)), \ 71 : (NULL), \ 72 : (GET_ARG_N(1, __VA_ARGS__))), \ 73 : } 74 : 75 : /** 76 : * @brief Increment the value of a Prometheus counter metric 77 : * Increments the value of the specified counter metric by arbitrary amount. 78 : * @param counter Pointer to the counter metric to increment. 79 : * @param value Amount to increment the counter by. 80 : * @return 0 on success, negative errno on error. 81 : */ 82 1 : int prometheus_counter_add(struct prometheus_counter *counter, uint64_t value); 83 : 84 : /** 85 : * @brief Increment the value of a Prometheus counter metric 86 : * Increments the value of the specified counter metric by one. 87 : * @param counter Pointer to the counter metric to increment. 88 : * @return 0 on success, negative errno on error. 89 : */ 90 1 : static inline int prometheus_counter_inc(struct prometheus_counter *counter) 91 : { 92 : return prometheus_counter_add(counter, 1ULL); 93 : } 94 : 95 : /** 96 : * @brief Set the counter value to specific value. 97 : * The new value must be higher than the current value. This function can be used 98 : * if we cannot add individual increments to the counter but need to periodically 99 : * update the counter value. This function will add the difference between the 100 : * new value and the old value to the counter. 101 : * @param counter Pointer to the counter metric to increment. 102 : * @param value New value of the counter. 103 : * @return 0 on success, negative errno on error. 104 : */ 105 1 : int prometheus_counter_set(struct prometheus_counter *counter, uint64_t value); 106 : 107 : /** 108 : * @} 109 : */ 110 : 111 : #endif /* ZEPHYR_INCLUDE_PROMETHEUS_COUNTER_H_ */