Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 1 | #pragma once |
| 2 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 3 | /*! \defgroup osmo_stat_item Statistics value item |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 4 | * @{ |
| 5 | */ |
| 6 | |
| 7 | /*! \file stat_item.h */ |
| 8 | |
| 9 | #include <stdint.h> |
| 10 | |
| 11 | #include <osmocom/core/linuxlist.h> |
| 12 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 13 | struct osmo_stat_item_desc; |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 14 | |
Jacob Erlbeck | b27b352 | 2015-10-12 18:47:09 +0200 | [diff] [blame] | 15 | #define STAT_ITEM_NOVALUE_ID 0 |
| 16 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 17 | struct osmo_stat_item_value { |
Jacob Erlbeck | b27b352 | 2015-10-12 18:47:09 +0200 | [diff] [blame] | 18 | int32_t id; |
| 19 | int32_t value; |
| 20 | }; |
| 21 | |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 22 | /*! \brief data we keep for each actual value */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 23 | struct osmo_stat_item { |
| 24 | const struct osmo_stat_item_desc *desc; |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 25 | /*! \brief the index of the freshest value */ |
| 26 | int32_t last_value_index; |
| 27 | /*! \brief offset to the freshest value in the value fifo */ |
| 28 | int16_t last_offs; |
| 29 | /*! \brief value fifo */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 30 | struct osmo_stat_item_value values[0]; |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 31 | }; |
| 32 | |
| 33 | /*! \brief statistics value description */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 34 | struct osmo_stat_item_desc { |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 35 | const char *name; /*!< \brief name of the item */ |
| 36 | const char *description;/*!< \brief description of the item */ |
| 37 | const char *unit; /*!< \brief unit of a value */ |
| 38 | unsigned int num_values;/*!< \brief number of values to store */ |
| 39 | int32_t default_value; |
| 40 | }; |
| 41 | |
| 42 | /*! \brief description of a statistics value group */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 43 | struct osmo_stat_item_group_desc { |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 44 | /*! \brief The prefix to the name of all values in this group */ |
| 45 | const char *group_name_prefix; |
| 46 | /*! \brief The human-readable description of the group */ |
| 47 | const char *group_description; |
Jacob Erlbeck | bc9d9ac | 2015-11-02 14:49:35 +0100 | [diff] [blame] | 48 | /*! \brief The class to which this group belongs */ |
| 49 | int class_id; |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 50 | /*! \brief The number of values in this group */ |
| 51 | const unsigned int num_items; |
| 52 | /*! \brief Pointer to array of value names */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 53 | const struct osmo_stat_item_desc *item_desc; |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 54 | }; |
| 55 | |
| 56 | /*! \brief One instance of a counter group class */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 57 | struct osmo_stat_item_group { |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 58 | /*! \brief Linked list of all value groups in the system */ |
| 59 | struct llist_head list; |
| 60 | /*! \brief Pointer to the counter group class */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 61 | const struct osmo_stat_item_group_desc *desc; |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 62 | /*! \brief The index of this value group within its class */ |
| 63 | unsigned int idx; |
| 64 | /*! \brief Actual counter structures below */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 65 | struct osmo_stat_item *items[0]; |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 66 | }; |
| 67 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 68 | struct osmo_stat_item_group *osmo_stat_item_group_alloc( |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 69 | void *ctx, |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 70 | const struct osmo_stat_item_group_desc *desc, |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 71 | unsigned int idx); |
| 72 | |
Holger Hans Peter Freyther | 495b0db | 2015-11-04 14:39:37 +0100 | [diff] [blame] | 73 | static inline void osmo_stat_item_group_udp_idx( |
| 74 | struct osmo_stat_item_group *grp, unsigned int idx) |
| 75 | { |
| 76 | grp->idx = idx; |
| 77 | } |
| 78 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 79 | void osmo_stat_item_group_free(struct osmo_stat_item_group *statg); |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 80 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 81 | void osmo_stat_item_set(struct osmo_stat_item *item, int32_t value); |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 82 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 83 | int osmo_stat_item_init(void *tall_ctx); |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 84 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 85 | struct osmo_stat_item_group *osmo_stat_item_get_group_by_name_idx( |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 86 | const char *name, const unsigned int idx); |
| 87 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 88 | const struct osmo_stat_item *osmo_stat_item_get_by_name( |
| 89 | const struct osmo_stat_item_group *statg, const char *name); |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 90 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 91 | /*! \brief Retrieve the next value from the osmo_stat_item object. |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 92 | * If a new value has been set, it is returned. The idx is used to decide |
| 93 | * which value to return. |
| 94 | * On success, *idx is updated to refer to the next unread value. If |
| 95 | * values have been missed due to FIFO overflow, *idx is incremented by |
| 96 | * (1 + num_lost). |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 97 | * This way, the osmo_stat_item object can be kept stateless from the reader's |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 98 | * perspective and therefore be used by several backends simultaneously. |
| 99 | * |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 100 | * \param val the osmo_stat_item object |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 101 | * \param idx identifies the next value to be read |
| 102 | * \param value a pointer to store the value |
| 103 | * \returns the increment of the index (0: no value has been read, |
| 104 | * 1: one value has been taken, |
| 105 | * (1+n): n values have been skipped, one has been taken) |
| 106 | */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 107 | int osmo_stat_item_get_next(const struct osmo_stat_item *item, int32_t *idx, int32_t *value); |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 108 | |
| 109 | /*! \brief Get the last (freshest) value */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 110 | static int32_t osmo_stat_item_get_last(const struct osmo_stat_item *item); |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 111 | |
| 112 | /*! \brief Skip all values of the item and update idx accordingly */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 113 | int osmo_stat_item_discard(const struct osmo_stat_item *item, int32_t *idx); |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 114 | |
Jacob Erlbeck | b27b352 | 2015-10-12 18:47:09 +0200 | [diff] [blame] | 115 | /*! \brief Skip all values of all items and update idx accordingly */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 116 | int osmo_stat_item_discard_all(int32_t *idx); |
Jacob Erlbeck | b27b352 | 2015-10-12 18:47:09 +0200 | [diff] [blame] | 117 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 118 | typedef int (*osmo_stat_item_handler_t)( |
| 119 | struct osmo_stat_item_group *, struct osmo_stat_item *, void *); |
Jacob Erlbeck | c6a7108 | 2015-10-19 14:04:38 +0200 | [diff] [blame] | 120 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 121 | typedef int (*osmo_stat_item_group_handler_t)(struct osmo_stat_item_group *, void *); |
Jacob Erlbeck | c6a7108 | 2015-10-19 14:04:38 +0200 | [diff] [blame] | 122 | |
| 123 | /*! \brief Iteate over all items |
| 124 | * \param[in] handle_item Call-back function, aborts if rc < 0 |
| 125 | * \param[in] data Private data handed through to \a handle_item |
| 126 | */ |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 127 | int osmo_stat_item_for_each_item(struct osmo_stat_item_group *statg, |
| 128 | osmo_stat_item_handler_t handle_item, void *data); |
Jacob Erlbeck | c6a7108 | 2015-10-19 14:04:38 +0200 | [diff] [blame] | 129 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 130 | int osmo_stat_item_for_each_group(osmo_stat_item_group_handler_t handle_group, void *data); |
Jacob Erlbeck | c6a7108 | 2015-10-19 14:04:38 +0200 | [diff] [blame] | 131 | |
Jacob Erlbeck | fc9533d | 2015-10-29 00:55:58 +0100 | [diff] [blame] | 132 | static inline int32_t osmo_stat_item_get_last(const struct osmo_stat_item *item) |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 133 | { |
Jacob Erlbeck | b27b352 | 2015-10-12 18:47:09 +0200 | [diff] [blame] | 134 | return item->values[item->last_offs].value; |
Jacob Erlbeck | 9732cb4 | 2015-10-01 20:43:53 +0200 | [diff] [blame] | 135 | } |
| 136 | /*! @} */ |