Asterisk - The Open Source Telephony Project  18.5.0
Data Structures | Macros | Enumerations | Functions
res_prometheus.h File Reference
#include "asterisk/lock.h"
#include "asterisk/linkedlists.h"
#include "asterisk/stringfields.h"
Include dependency graph for res_prometheus.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  prometheus_callback
 Defines a callback that will be invoked when the HTTP route is called. More...
 
struct  prometheus_general_config
 Prometheus general configuration. More...
 
struct  prometheus_label
 A label that further defines a metric. More...
 
struct  prometheus_metric
 An actual, honest to god, metric. More...
 
struct  prometheus_metrics_provider
 A function table for a metrics provider. More...
 

Macros

#define PROMETHEUS_MAX_LABEL_LENGTH   128
 How long a label value can be. More...
 
#define PROMETHEUS_MAX_LABELS   8
 How many labels a single metric can have. More...
 
#define PROMETHEUS_MAX_NAME_LENGTH   64
 How long a label name can be. More...
 
#define PROMETHEUS_MAX_VALUE_LENGTH   32
 How large of a value we can store. More...
 
#define PROMETHEUS_METRIC_SET_LABEL(metric, label, n, v)
 Convenience macro for setting a label / value in a metric. More...
 
#define PROMETHEUS_METRIC_STATIC_INITIALIZATION(mtype, n, h, cb)
 Convenience macro for initializing a metric on the stack. More...
 

Enumerations

enum  prometheus_metric_allocation_strategy { PROMETHEUS_METRIC_ALLOCD = 0, PROMETHEUS_METRIC_MALLOCD }
 How the metric was allocated. More...
 
enum  prometheus_metric_type { PROMETHEUS_METRIC_COUNTER = 0, PROMETHEUS_METRIC_GAUGE }
 Prometheus metric type. More...
 

Functions

int prometheus_callback_register (struct prometheus_callback *callback)
 
void prometheus_callback_unregister (struct prometheus_callback *callback)
 Remove a registered callback. More...
 
struct prometheus_metricprometheus_counter_create (const char *name, const char *help)
 Create a malloc'd counter metric. More...
 
struct prometheus_metricprometheus_gauge_create (const char *name, const char *help)
 Create a malloc'd gauge metric. More...
 
void * prometheus_general_config_alloc (void)
 Allocate a new configuration object. More...
 
struct prometheus_general_configprometheus_general_config_get (void)
 Retrieve the current configuration of the module. More...
 
void prometheus_general_config_set (struct prometheus_general_config *config)
 Set the configuration for the module. More...
 
void prometheus_metric_free (struct prometheus_metric *metric)
 Destroy a metric and all its children. More...
 
int prometheus_metric_register (struct prometheus_metric *metric)
 
int prometheus_metric_registered_count (void)
 
void prometheus_metric_to_string (struct prometheus_metric *metric, struct ast_str **output)
 Convert a metric (and its children) into Prometheus compatible text. More...
 
int prometheus_metric_unregister (struct prometheus_metric *metric)
 Remove a registered metric. More...
 
void prometheus_metrics_provider_register (const struct prometheus_metrics_provider *provider)
 Register a metrics provider. More...
 

Macro Definition Documentation

◆ PROMETHEUS_MAX_LABEL_LENGTH

#define PROMETHEUS_MAX_LABEL_LENGTH   128

How long a label value can be.

Definition at line 49 of file res_prometheus.h.

◆ PROMETHEUS_MAX_LABELS

#define PROMETHEUS_MAX_LABELS   8

How many labels a single metric can have.

Definition at line 39 of file res_prometheus.h.

Referenced by prometheus_metric_cmp(), and prometheus_metric_full_to_string().

◆ PROMETHEUS_MAX_NAME_LENGTH

#define PROMETHEUS_MAX_NAME_LENGTH   64

How long a label name can be.

Definition at line 44 of file res_prometheus.h.

◆ PROMETHEUS_MAX_VALUE_LENGTH

#define PROMETHEUS_MAX_VALUE_LENGTH   32

How large of a value we can store.

Definition at line 54 of file res_prometheus.h.

◆ PROMETHEUS_METRIC_SET_LABEL

#define PROMETHEUS_METRIC_SET_LABEL (   metric,
  label,
  n,
 
)
Value:
do { \
ast_assert((label) < PROMETHEUS_MAX_LABELS); \
ast_copy_string((metric)->labels[(label)].name, (n), sizeof((metric)->labels[(label)].name)); \
ast_copy_string((metric)->labels[(label)].value, (v), sizeof((metric)->labels[(label)].value)); \
} while (0)
int value
Definition: syslog.c:37
#define PROMETHEUS_MAX_LABELS
How many labels a single metric can have.
struct prometheus_label labels[PROMETHEUS_MAX_LABELS]
The metric&#39;s labels.
static const char name[]
Definition: cdr_mysql.c:74

Convenience macro for setting a label / value in a metric.

Parameters
metricThe metric to set the label on
labelPosition of the label to set
nName of the label
vValue of the label

When creating nested metrics, it's helpful to set their label after they have been declared but before they have been registered. This macro acts as a convenience function to set the labels properly on a declared metric.

Note
Setting labels after registration will lead to a "bad time"

Example Usage:

test_gauge_child_two, 0, "key_one", "value_two");
test_gauge_child_two, 1, "key_two", "value_two");

Definition at line 321 of file res_prometheus.h.

Referenced by AST_TEST_DEFINE(), bridges_scrape_cb(), channels_scrape_cb(), endpoints_scrape_cb(), prometheus_config_post_apply(), and registry_message_cb().

◆ PROMETHEUS_METRIC_STATIC_INITIALIZATION

#define PROMETHEUS_METRIC_STATIC_INITIALIZATION (   mtype,
  n,
  h,
  cb 
)

Convenience macro for initializing a metric on the stack.

Parameters
mtypeThe metric type. See prometheus_metric_type
nName of the metric
hHelp text for the metric
cbCallback function. Optional; may be NULL

When initializing a metric on the stack, various fields have to be provided to initialize the metric correctly. This macro can be used to simplify the process.

Example Usage:

struct prometheus_metric test_counter_one =
"test_counter_one",
"A test counter",
NULL);
struct prometheus_metric test_counter_two =
"test_counter_two",
"A test counter",

Definition at line 287 of file res_prometheus.h.

Referenced by AST_TEST_DEFINE(), bridges_scrape_cb(), channels_scrape_cb(), endpoints_scrape_cb(), prometheus_metric_callback(), and registry_message_cb().

Enumeration Type Documentation

◆ prometheus_metric_allocation_strategy

How the metric was allocated.

Note
Clearly, you don't want to get this wrong.
Enumerator
PROMETHEUS_METRIC_ALLOCD 

The metric was allocated on the stack.

PROMETHEUS_METRIC_MALLOCD 

The metric was allocated on the heap.

Definition at line 140 of file res_prometheus.h.

140  {
141  /*!
142  * \brief The metric was allocated on the stack
143  */
145  /*!
146  * \brief The metric was allocated on the heap
147  */
149 };
The metric was allocated on the stack.
The metric was allocated on the heap.

◆ prometheus_metric_type

Prometheus metric type.

Note
Clearly, at some point, we should support summaries and histograms. As an initial implementation, counters / gauges give us quite a bit of functionality.
Enumerator
PROMETHEUS_METRIC_COUNTER 

A metric whose value always goes up.

PROMETHEUS_METRIC_GAUGE 

Definition at line 124 of file res_prometheus.h.

124  {
125  /*!
126  * \brief A metric whose value always goes up
127  */
129  /*
130  * \brief A metric whose value can bounce around like a jackrabbit
131  */
133 };
A metric whose value always goes up.

Function Documentation

◆ prometheus_callback_register()

int prometheus_callback_register ( struct prometheus_callback callback)

Register a metric callback

Parameters
callbackThe callback to register
Return values
0success
-1error

Definition at line 535 of file res_prometheus.c.

References ast_strlen_zero, AST_VECTOR_APPEND, prometheus_callback::callback_fn, lock, prometheus_callback::name, SCOPED_MUTEX, and scrape_lock.

Referenced by AST_TEST_DEFINE(), bridge_metrics_init(), channel_metrics_init(), and endpoint_metrics_init().

536 {
538 
539  if (!callback || !callback->callback_fn || ast_strlen_zero(callback->name)) {
540  return -1;
541  }
542 
543  AST_VECTOR_APPEND(&callbacks, callback);
544 
545  return 0;
546 }
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition: vector.h:256
const char * name
The name of our callback (always useful for debugging)
#define ast_strlen_zero(foo)
Definition: strings.h:52
void(* callback_fn)(struct ast_str **output)
The callback function to invoke.
#define SCOPED_MUTEX(varname, lock)
scoped lock specialization for mutexes
Definition: lock.h:587
ast_mutex_t lock
Definition: app_meetme.c:1091
static ast_mutex_t scrape_lock
Lock that protects data structures during an HTTP scrape.

◆ prometheus_callback_unregister()

void prometheus_callback_unregister ( struct prometheus_callback callback)

Remove a registered callback.

Parameters
callbackThe callback to unregister

Definition at line 548 of file res_prometheus.c.

References AST_VECTOR_GET, AST_VECTOR_REMOVE, AST_VECTOR_SIZE, lock, prometheus_callback::name, SCOPED_MUTEX, and scrape_lock.

Referenced by AST_TEST_DEFINE(), bridge_metrics_unload_cb(), channel_metrics_unload_cb(), and endpoint_metrics_unload_cb().

549 {
551  int i;
552 
553  for (i = 0; i < AST_VECTOR_SIZE(&callbacks); i++) {
554  struct prometheus_callback *entry = AST_VECTOR_GET(&callbacks, i);
555 
556  if (!strcmp(callback->name, entry->name)) {
557  AST_VECTOR_REMOVE(&callbacks, i, 1);
558  return;
559  }
560  }
561 }
const char * name
The name of our callback (always useful for debugging)
#define SCOPED_MUTEX(varname, lock)
scoped lock specialization for mutexes
Definition: lock.h:587
ast_mutex_t lock
Definition: app_meetme.c:1091
static ast_mutex_t scrape_lock
Lock that protects data structures during an HTTP scrape.
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:682
Definition: search.h:40
#define AST_VECTOR_REMOVE(vec, idx, preserve_ordered)
Remove an element from a vector by index.
Definition: vector.h:412
Defines a callback that will be invoked when the HTTP route is called.
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:611

◆ prometheus_counter_create()

struct prometheus_metric* prometheus_counter_create ( const char *  name,
const char *  help 
)

Create a malloc'd counter metric.

Note
The metric must be registered after creation
Parameters
nameThe name of the metric
helpHelp text for the metric
Return values
prometheus_metricon success
NULLon error

Definition at line 452 of file res_prometheus.c.

References NULL, PROMETHEUS_METRIC_COUNTER, prometheus_metric_create(), and prometheus_metric::type.

Referenced by AST_TEST_DEFINE().

453 {
454  struct prometheus_metric *metric;
455 
457  if (!metric) {
458  return NULL;
459  }
461 
462  return metric;
463 }
An actual, honest to god, metric.
A metric whose value always goes up.
enum prometheus_metric_type type
What type of metric we are.
#define NULL
Definition: resample.c:96
static struct prometheus_metric * prometheus_metric_create(const char *name, const char *help)
const char * help
Pointer to a static string defining this metric&#39;s help text.
static const char name[]
Definition: cdr_mysql.c:74

◆ prometheus_gauge_create()

struct prometheus_metric* prometheus_gauge_create ( const char *  name,
const char *  help 
)

Create a malloc'd gauge metric.

Note
The metric must be registered after creation
Parameters
nameThe name of the metric
helpHelp text for the metric
Return values
prometheus_metricon success
NULLon error

Definition at line 439 of file res_prometheus.c.

References NULL, prometheus_metric_create(), PROMETHEUS_METRIC_GAUGE, and prometheus_metric::type.

Referenced by AST_TEST_DEFINE(), and registry_message_cb().

440 {
441  struct prometheus_metric *metric;
442 
444  if (!metric) {
445  return NULL;
446  }
447  metric->type = PROMETHEUS_METRIC_GAUGE;
448 
449  return metric;
450 }
An actual, honest to god, metric.
enum prometheus_metric_type type
What type of metric we are.
#define NULL
Definition: resample.c:96
static struct prometheus_metric * prometheus_metric_create(const char *name, const char *help)
const char * help
Pointer to a static string defining this metric&#39;s help text.
static const char name[]
Definition: cdr_mysql.c:74

◆ prometheus_general_config_alloc()

void* prometheus_general_config_alloc ( void  )

Allocate a new configuration object.

The returned object is an AO2 ref counted object

Return values
NULLon error
configon success

Definition at line 726 of file res_prometheus.c.

References ao2_alloc, ast_string_field_init, config, NULL, and prometheus_general_config_dtor().

Referenced by config_alloc(), and module_config_alloc().

727 {
729 
730  config = ao2_alloc(sizeof(*config), prometheus_general_config_dtor);
731  if (!config || ast_string_field_init(config, 32)) {
732  return NULL;
733  }
734 
735  return config;
736 }
char * config
Definition: conf2ael.c:66
Prometheus general configuration.
#define NULL
Definition: resample.c:96
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:353
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:411
static void prometheus_general_config_dtor(void *obj)

◆ prometheus_general_config_get()

struct prometheus_general_config* prometheus_general_config_get ( void  )

Retrieve the current configuration of the module.

Note
This should primarily be done for testing purposes.

config is an AO2 ref counted object

Return values
NULLon error
configon success

Definition at line 738 of file res_prometheus.c.

References ao2_bump, ao2_cleanup, ao2_global_obj_ref, NULL, and RAII_VAR.

Referenced by prometheus_show_status(), reload_module(), and test_init_cb().

739 {
741 
742  if (!mod_cfg) {
743  return NULL;
744  }
745  ao2_bump(mod_cfg->general);
746 
747  return mod_cfg->general;
748 }
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
#define NULL
Definition: resample.c:96
#define ao2_bump(obj)
Definition: astobj2.h:491
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
The configuration settings for this module.
Definition: cdr.c:222
#define ao2_cleanup(obj)
Definition: astobj2.h:1958

◆ prometheus_general_config_set()

void prometheus_general_config_set ( struct prometheus_general_config config)

Set the configuration for the module.

Note
This should primarily be done for testing purposes

This is not a ref-stealing function. The reference count to config will be incremented as a result of calling this method.

Definition at line 750 of file res_prometheus.c.

References ao2_cleanup, ao2_global_obj_ref, ao2_replace, prometheus_config_post_apply(), and RAII_VAR.

Referenced by AST_TEST_DEFINE(), test_cleanup_cb(), and test_init_cb().

751 {
753 
754  if (!mod_cfg) {
755  return;
756  }
757  ao2_replace(mod_cfg->general, config);
759 }
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
The configuration settings for this module.
Definition: cdr.c:222
#define ao2_replace(dst, src)
Definition: astobj2.h:517
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
static void prometheus_config_post_apply(void)
Post-apply callback for the config framework.

◆ prometheus_metric_free()

void prometheus_metric_free ( struct prometheus_metric metric)

Destroy a metric and all its children.

Note
If you still want the children, make sure you remove the head of the children list first.
Parameters
metricThe metric to destroy

Definition at line 392 of file res_prometheus.c.

References prometheus_metric::allocation_strategy, ast_free, AST_LIST_REMOVE_HEAD, ast_mutex_destroy, prometheus_metric::children, prometheus_metric::lock, PROMETHEUS_METRIC_ALLOCD, and PROMETHEUS_METRIC_MALLOCD.

Referenced by AST_TEST_DEFINE(), prometheus_metric_free_wrapper(), prometheus_metric_unregister(), and unload_module().

393 {
394  struct prometheus_metric *child;
395 
396  if (!metric) {
397  return;
398  }
399 
400  while ((child = AST_LIST_REMOVE_HEAD(&metric->children, entry))) {
401  prometheus_metric_free(child);
402  }
403  ast_mutex_destroy(&metric->lock);
404 
406  return;
407  } else if (metric->allocation_strategy == PROMETHEUS_METRIC_MALLOCD) {
408  ast_free(metric);
409  }
410 }
An actual, honest to god, metric.
enum prometheus_metric_allocation_strategy allocation_strategy
How this metric was allocated.
The metric was allocated on the stack.
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
struct prometheus_metric::@312 children
A list of children metrics.
#define ast_free(a)
Definition: astmm.h:182
ast_mutex_t lock
A lock protecting the metric value.
Definition: search.h:40
The metric was allocated on the heap.
#define ast_mutex_destroy(a)
Definition: lock.h:186
void prometheus_metric_free(struct prometheus_metric *metric)
Destroy a metric and all its children.

◆ prometheus_metric_register()

int prometheus_metric_register ( struct prometheus_metric metric)

Register a metric for collection

Parameters
metricThe metric to register
Return values
0success
-1error

Definition at line 287 of file res_prometheus.c.

References ast_debug, AST_LIST_INSERT_TAIL, AST_LIST_TRAVERSE, ast_log, AST_LOG_NOTICE, AST_LOG_WARNING, AST_VECTOR_APPEND, AST_VECTOR_GET, AST_VECTOR_SIZE, prometheus_metric::children, lock, prometheus_metric::name, prometheus_metric_cmp(), SCOPED_MUTEX, and scrape_lock.

Referenced by AST_TEST_DEFINE(), prometheus_config_post_apply(), and registry_message_cb().

288 {
290  int i;
291 
292  if (!metric) {
293  return -1;
294  }
295 
296  for (i = 0; i < AST_VECTOR_SIZE(&metrics); i++) {
297  struct prometheus_metric *existing = AST_VECTOR_GET(&metrics, i);
298  struct prometheus_metric *child;
299 
300  if (prometheus_metric_cmp(existing, metric)) {
302  "Refusing registration of existing Prometheus metric: %s\n",
303  metric->name);
304  return -1;
305  }
306 
307  AST_LIST_TRAVERSE(&existing->children, child, entry) {
308  if (prometheus_metric_cmp(child, metric)) {
310  "Refusing registration of existing Prometheus metric: %s\n",
311  metric->name);
312  return -1;
313  }
314  }
315 
316  if (!strcmp(metric->name, existing->name)) {
317  ast_debug(3, "Nesting metric '%s' as child (%p) under existing (%p)\n",
318  metric->name, metric, existing);
319  AST_LIST_INSERT_TAIL(&existing->children, metric, entry);
320  return 0;
321  }
322  }
323 
324  ast_debug(3, "Tracking new root metric '%s'\n", metric->name);
325  if (AST_VECTOR_APPEND(&metrics, metric)) {
326  ast_log(AST_LOG_WARNING, "Failed to grow vector to make room for Prometheus metric: %s\n",
327  metric->name);
328  return -1;
329  }
330 
331  return 0;
332 }
An actual, honest to god, metric.
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition: vector.h:256
#define AST_LOG_WARNING
Definition: logger.h:279
#define AST_LOG_NOTICE
Definition: logger.h:268
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
#define SCOPED_MUTEX(varname, lock)
scoped lock specialization for mutexes
Definition: lock.h:587
ast_mutex_t lock
Definition: app_meetme.c:1091
struct prometheus_metric::@312 children
A list of children metrics.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
char name[PROMETHEUS_MAX_NAME_LENGTH]
Our metric name.
static ast_mutex_t scrape_lock
Lock that protects data structures during an HTTP scrape.
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:682
static int prometheus_metric_cmp(struct prometheus_metric *left, struct prometheus_metric *right)
Definition: search.h:40
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:611

◆ prometheus_metric_registered_count()

int prometheus_metric_registered_count ( void  )

The current number of registered metrics

Return values
Thecurrent number of registered metrics

Definition at line 280 of file res_prometheus.c.

References AST_VECTOR_SIZE, lock, SCOPED_MUTEX, and scrape_lock.

Referenced by AST_TEST_DEFINE().

281 {
283 
284  return AST_VECTOR_SIZE(&metrics);
285 }
#define SCOPED_MUTEX(varname, lock)
scoped lock specialization for mutexes
Definition: lock.h:587
ast_mutex_t lock
Definition: app_meetme.c:1091
static ast_mutex_t scrape_lock
Lock that protects data structures during an HTTP scrape.
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:611

◆ prometheus_metric_to_string()

void prometheus_metric_to_string ( struct prometheus_metric metric,
struct ast_str **  output 
)

Convert a metric (and its children) into Prometheus compatible text.

Parameters
metricThe metric to convert to a string
[out]outputThe ast_str string to populate with the metric(s)

Definition at line 521 of file res_prometheus.c.

References AST_LIST_TRAVERSE, ast_str_append(), prometheus_metric::children, prometheus_metric::help, prometheus_metric::name, prometheus_metric_full_to_string(), prometheus_metric_type_to_string(), and prometheus_metric::type.

Referenced by AST_TEST_DEFINE(), bridges_scrape_cb(), channels_scrape_cb(), endpoints_scrape_cb(), http_callback(), prometheus_metric_callback(), and scrape_metrics().

523 {
524  struct prometheus_metric *child;
525 
526  ast_str_append(output, 0, "# HELP %s %s\n", metric->name, metric->help);
527  ast_str_append(output, 0, "# TYPE %s %s\n", metric->name,
529  prometheus_metric_full_to_string(metric, output);
530  AST_LIST_TRAVERSE(&metric->children, child, entry) {
531  prometheus_metric_full_to_string(child, output);
532  }
533 }
An actual, honest to god, metric.
enum prometheus_metric_type type
What type of metric we are.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
static void prometheus_metric_full_to_string(struct prometheus_metric *metric, struct ast_str **output)
struct prometheus_metric::@312 children
A list of children metrics.
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
const char * help
Pointer to a static string defining this metric&#39;s help text.
char name[PROMETHEUS_MAX_NAME_LENGTH]
Our metric name.
Definition: search.h:40
static const char * prometheus_metric_type_to_string(enum prometheus_metric_type type)

◆ prometheus_metric_unregister()

int prometheus_metric_unregister ( struct prometheus_metric metric)

Remove a registered metric.

Parameters
metricThe metric to unregister
Note
Unregistering also destroys the metric, if found
Return values
0The metric was found, unregistered, and disposed of
-1The metric was not found

Definition at line 334 of file res_prometheus.c.

References ast_debug, AST_LIST_INSERT_TAIL, AST_LIST_REMOVE_CURRENT, AST_LIST_REMOVE_HEAD, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_VECTOR_GET, AST_VECTOR_INSERT_AT, AST_VECTOR_REMOVE, AST_VECTOR_SIZE, prometheus_metric::children, lock, prometheus_metric::name, prometheus_metric_cmp(), prometheus_metric_free(), SCOPED_MUTEX, and scrape_lock.

Referenced by AST_TEST_DEFINE(), prometheus_config_post_apply(), prometheus_metric_free_wrapper(), registration_deleted_observer(), and registration_loaded_observer().

335 {
336  if (!metric) {
337  return -1;
338  }
339 
340  {
342  int i;
343 
344  ast_debug(3, "Removing metric '%s'\n", metric->name);
345  for (i = 0; i < AST_VECTOR_SIZE(&metrics); i++) {
346  struct prometheus_metric *existing = AST_VECTOR_GET(&metrics, i);
347 
348  /*
349  * If this is a complete match, remove the matching metric
350  * and place its children back into the list
351  */
352  if (prometheus_metric_cmp(existing, metric)) {
353  struct prometheus_metric *root;
354 
355  AST_VECTOR_REMOVE(&metrics, i, 1);
356  root = AST_LIST_REMOVE_HEAD(&existing->children, entry);
357  if (root) {
358  struct prometheus_metric *child;
359  AST_LIST_TRAVERSE_SAFE_BEGIN(&existing->children, child, entry) {
361  AST_LIST_INSERT_TAIL(&root->children, child, entry);
362  }
364  AST_VECTOR_INSERT_AT(&metrics, i, root);
365  }
366  prometheus_metric_free(existing);
367  return 0;
368  }
369 
370  /*
371  * Name match, but labels don't match. Find the matching entry with
372  * labels and remove it along with all of its children
373  */
374  if (!strcmp(existing->name, metric->name)) {
375  struct prometheus_metric *child;
376 
377  AST_LIST_TRAVERSE_SAFE_BEGIN(&existing->children, child, entry) {
378  if (prometheus_metric_cmp(child, metric)) {
380  prometheus_metric_free(child);
381  return 0;
382  }
383  }
385  }
386  }
387  }
388 
389  return -1;
390 }
An actual, honest to god, metric.
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define SCOPED_MUTEX(varname, lock)
scoped lock specialization for mutexes
Definition: lock.h:587
ast_mutex_t lock
Definition: app_meetme.c:1091
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
struct prometheus_metric::@312 children
A list of children metrics.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
char name[PROMETHEUS_MAX_NAME_LENGTH]
Our metric name.
static ast_mutex_t scrape_lock
Lock that protects data structures during an HTTP scrape.
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:682
static int prometheus_metric_cmp(struct prometheus_metric *left, struct prometheus_metric *right)
#define AST_VECTOR_INSERT_AT(vec, idx, elem)
Insert an element at a specific position in a vector, growing the vector if needed.
Definition: vector.h:338
Definition: search.h:40
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528
void prometheus_metric_free(struct prometheus_metric *metric)
Destroy a metric and all its children.
#define AST_VECTOR_REMOVE(vec, idx, preserve_ordered)
Remove an element from a vector by index.
Definition: vector.h:412
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:611

◆ prometheus_metrics_provider_register()

void prometheus_metrics_provider_register ( const struct prometheus_metrics_provider provider)

Register a metrics provider.

Parameters
providerThe provider function table to register

Definition at line 871 of file res_prometheus.c.

References AST_VECTOR_APPEND, and providers.

Referenced by bridge_metrics_init(), channel_metrics_init(), cli_init(), endpoint_metrics_init(), and pjsip_outbound_registration_metrics_init().

872 {
873  AST_VECTOR_APPEND(&providers, provider);
874 }
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition: vector.h:256
struct ao2_container * providers