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_SUMMARY_H_ 9 : #define ZEPHYR_INCLUDE_PROMETHEUS_SUMMARY_H_ 10 : 11 : /** 12 : * @file 13 : * 14 : * @brief Prometheus summary APIs. 15 : * 16 : * @addtogroup prometheus 17 : * @{ 18 : */ 19 : 20 : #include <zephyr/sys/iterable_sections.h> 21 : #include <zephyr/net/prometheus/metric.h> 22 : 23 : #include <stddef.h> 24 : 25 : /** 26 : * @brief Prometheus summary quantile definition. 27 : * 28 : * This structure defines a Prometheus summary quantile. 29 : */ 30 1 : struct prometheus_summary_quantile { 31 : /** Quantile of the summary */ 32 1 : double quantile; 33 : /** Value of the quantile */ 34 1 : double value; 35 : /** User data */ 36 1 : void *user_data; 37 : }; 38 : 39 : /** 40 : * @brief Type used to represent a Prometheus summary metric. 41 : * 42 : * * References 43 : * * See https://prometheus.io/docs/concepts/metric_types/#summary 44 : */ 45 1 : struct prometheus_summary { 46 : /** Base of the Prometheus summary metric */ 47 1 : struct prometheus_metric base; 48 : /** Array of quantiles associated with the Prometheus summary metric */ 49 1 : struct prometheus_summary_quantile *quantiles; 50 : /** Number of quantiles associated with the Prometheus summary metric */ 51 1 : size_t num_quantiles; 52 : /** Sum of all observed values in the summary metric */ 53 1 : double sum; 54 : /** Total count of observations in the summary metric */ 55 1 : unsigned long count; 56 : /** User data */ 57 1 : void *user_data; 58 : }; 59 : 60 : /** 61 : * @brief Prometheus Summary definition. 62 : * 63 : * This macro defines a Summary metric. If you want to make the summary static, 64 : * then add "static" keyword before the PROMETHEUS_SUMMARY_DEFINE. 65 : * 66 : * @param _name The summary metric name. 67 : * @param _desc Summary description 68 : * @param _label Label for the metric. Additional labels can be added at runtime. 69 : * @param _collector Collector to map this metric. Can be set to NULL if it not yet known. 70 : * @param ... Optional user data specific to this metric instance. 71 : * 72 : * 73 : * Example usage: 74 : * @code{.c} 75 : * 76 : * PROMETHEUS_SUMMARY_DEFINE(http_request_summary, "HTTP request summary", 77 : * ({ .key = "request_latency", 78 : * .value = "request_latency_seconds" }), NULL); 79 : * 80 : * @endcode 81 : */ 82 : 83 1 : #define PROMETHEUS_SUMMARY_DEFINE(_name, _desc, _label, _collector, ...) \ 84 : STRUCT_SECTION_ITERABLE(prometheus_summary, _name) = { \ 85 : .base.name = STRINGIFY(_name), \ 86 : .base.type = PROMETHEUS_SUMMARY, \ 87 : .base.description = _desc, \ 88 : .base.labels[0] = __DEBRACKET _label, \ 89 : .base.num_labels = 1, \ 90 : .base.collector = _collector, \ 91 : .quantiles = NULL, \ 92 : .num_quantiles = 0, \ 93 : .sum = 0.0, \ 94 : .count = 0U, \ 95 : .user_data = COND_CODE_0( \ 96 : NUM_VA_ARGS_LESS_1(LIST_DROP_EMPTY(__VA_ARGS__, _)), \ 97 : (NULL), \ 98 : (GET_ARG_N(1, __VA_ARGS__))), \ 99 : } 100 : 101 : /** 102 : * @brief Observes a value in a Prometheus summary metric 103 : * 104 : * Observes the specified value in the given summary metric. 105 : * 106 : * @param summary Pointer to the summary metric to observe. 107 : * @param value Value to observe in the summary metric. 108 : * @return 0 on success, -EINVAL if the value is negative. 109 : */ 110 1 : int prometheus_summary_observe(struct prometheus_summary *summary, double value); 111 : 112 : /** 113 : * @brief Set the summary value to specific value. 114 : * The new value must be higher than the current value. This function can be used 115 : * if we cannot add individual increments to the summary but need to periodically 116 : * update the counter value. This function will add the difference between the 117 : * new value and the old value to the summary fields. 118 : * @param summary Pointer to the summary metric to increment. 119 : * @param value New value of the summary. 120 : * @param count New counter value of the summary. 121 : * @return 0 on success, negative errno on error. 122 : */ 123 1 : int prometheus_summary_observe_set(struct prometheus_summary *summary, 124 : double value, unsigned long count); 125 : 126 : /** 127 : * @} 128 : */ 129 : 130 : #endif /* ZEPHYR_INCLUDE_PROMETHEUS_SUMMARY_H_ */