Asterisk - The Open Source Telephony Project GIT-master-545c459
Loading...
Searching...
No Matches
Data Structures | Macros | Functions | Variables
bridges.c File Reference

Prometheus Bridge Metrics. More...

#include "asterisk.h"
#include "asterisk/stasis_bridges.h"
#include "asterisk/res_prometheus.h"
#include "prometheus_internal.h"
Include dependency graph for bridges.c:

Go to the source code of this file.

Data Structures

struct  bridge_metric_defs
 

Macros

#define BRIDGES_CHANNELS_COUNT_HELP   "Number of channels in the bridge."
 

Functions

int bridge_metrics_init (void)
 Initialize bridge metrics.
 
static void bridge_metrics_unload_cb (void)
 
static void bridges_scrape_cb (struct ast_str **response)
 
static void get_bridge_channel_count (struct prometheus_metric *metric, struct ast_bridge_snapshot *snapshot)
 

Variables

struct bridge_metric_defs bridge_metric_defs []
 
struct prometheus_callback bridges_callback
 
static struct prometheus_metrics_provider provider
 

Detailed Description

Prometheus Bridge Metrics.

Author
Matt Jordan mjord.nosp@m.an@d.nosp@m.igium.nosp@m..com

Definition in file bridges.c.

Macro Definition Documentation

◆ BRIDGES_CHANNELS_COUNT_HELP

#define BRIDGES_CHANNELS_COUNT_HELP   "Number of channels in the bridge."

Definition at line 33 of file bridges.c.

Function Documentation

◆ bridge_metrics_init()

int bridge_metrics_init ( void  )

Initialize bridge metrics.

Return values
0success
-1error

Definition at line 212 of file bridges.c.

213{
216
217 return 0;
218}
struct prometheus_callback bridges_callback
Definition bridges.c:189
static struct prometheus_metrics_provider provider
Definition bridges.c:207
void prometheus_metrics_provider_register(const struct prometheus_metrics_provider *provider)
Register a metrics provider.
int prometheus_callback_register(struct prometheus_callback *callback)

References bridges_callback, prometheus_callback_register(), prometheus_metrics_provider_register(), and provider.

Referenced by load_module().

◆ bridge_metrics_unload_cb()

static void bridge_metrics_unload_cb ( void  )
static

Definition at line 198 of file bridges.c.

199{
201}
void prometheus_callback_unregister(struct prometheus_callback *callback)
Remove a registered callback.

References bridges_callback, and prometheus_callback_unregister().

◆ bridges_scrape_cb()

static void bridges_scrape_cb ( struct ast_str **  response)
static

Definition at line 78 of file bridges.c.

79{
81 struct ao2_container *bridge_cache;
82 struct ao2_container *bridges;
83 struct ao2_iterator it_bridges;
84 struct ast_bridge *bridge;
86 struct prometheus_metric **bridge_metrics;
87 char eid_str[32];
88 int j, num_bridges, num_outputs = 0;
91 "asterisk_bridges_count",
92 "Current bridge count.",
93 NULL
94 );
95
96 ast_eid_to_str(eid_str, sizeof(eid_str), &ast_eid_default);
97
98 bridge_cache = ast_bridges();
99 if (!bridge_cache) {
100 return;
101 }
102
103 bridges = ao2_container_clone(bridge_cache, 0);
104 ao2_ref(bridge_cache, -1);
105 if (!bridges) {
106 return;
107 }
108
109 num_bridges = ao2_container_count(bridges);
110
111 /* Current endpoint count */
112 PROMETHEUS_METRIC_SET_LABEL(&bridge_count, 0, "eid", eid_str);
113 snprintf(bridge_count.value, sizeof(bridge_count.value), "%d", num_bridges);
114 prometheus_metric_to_string(&bridge_count, response);
115
116 if (num_bridges == 0) {
117 ao2_ref(bridges, -1);
118 return;
119 }
120
121 if (!config || !config->bridges_detail_metrics_enabled) {
122 ao2_ref(bridges, -1);
123 return;
124 }
125
126 metrics = ast_calloc(ARRAY_LEN(bridge_metric_defs) * num_bridges, sizeof(*metrics));
127 if (!metrics) {
128 ao2_ref(bridges, -1);
129 return;
130 }
131
132 bridge_metrics = ast_calloc(ARRAY_LEN(bridge_metric_defs), sizeof(bridge_metrics));
133 if (!bridge_metrics) {
135 ao2_ref(bridges, -1);
136 return;
137 }
138
139 /* Bridge dependent values */
140 it_bridges = ao2_iterator_init(bridges, 0);
141 for (; (bridge = ao2_iterator_next(&it_bridges)); ao2_ref(bridge, -1)) {
142 struct ast_bridge_snapshot *snapshot;
143
144 /* Invisible bridges don't get shown externally and have no snapshot */
146 continue;
147 }
148
149 snapshot = ast_bridge_get_snapshot(bridge);
150 if (!snapshot) {
151 continue;
152 }
153
154 for (j = 0; j < ARRAY_LEN(bridge_metric_defs); j++) {
155 int index = num_outputs++;
156
157 metrics[index].type = PROMETHEUS_METRIC_GAUGE;
158 ast_copy_string(metrics[index].name, bridge_metric_defs[j].name, sizeof(metrics[index].name));
159 metrics[index].help = bridge_metric_defs[j].help;
160 PROMETHEUS_METRIC_SET_LABEL(&metrics[index], 0, "eid", eid_str);
161 PROMETHEUS_METRIC_SET_LABEL(&metrics[index], 1, "id", (snapshot->uniqueid));
162 PROMETHEUS_METRIC_SET_LABEL(&metrics[index], 2, "tech", (snapshot->technology));
163 PROMETHEUS_METRIC_SET_LABEL(&metrics[index], 3, "subclass", (snapshot->subclass));
164 PROMETHEUS_METRIC_SET_LABEL(&metrics[index], 4, "creator", (snapshot->creator));
165 PROMETHEUS_METRIC_SET_LABEL(&metrics[index], 5, "name", (snapshot->name));
166 bridge_metric_defs[j].get_value(&metrics[index], snapshot);
167
168 if (bridge_metrics[j] == NULL) {
169 bridge_metrics[j] = &metrics[index];
170 } else {
171 AST_LIST_INSERT_TAIL(&bridge_metrics[j]->children, &metrics[index], entry);
172 }
173 }
174 ao2_ref(snapshot, -1);
175 }
176 ao2_iterator_destroy(&it_bridges);
177
178 for (j = 0; j < ARRAY_LEN(bridge_metric_defs); j++) {
179 if (bridge_metrics[j]) {
180 prometheus_metric_to_string(bridge_metrics[j], response);
181 }
182 }
183
184 ast_free(bridge_metrics);
186 ao2_ref(bridges, -1);
187}
#define ast_free(a)
Definition astmm.h:180
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
#define ao2_iterator_next(iter)
Definition astobj2.h:1911
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ao2_cleanup(obj)
Definition astobj2.h:1934
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define ao2_container_clone(orig, flags)
Create a clone/copy of the given container.
Definition astobj2.h:1419
static struct ao2_container * bridges
Definition bridge.c:132
struct ao2_container * ast_bridges(void)
Returns the global bridges container.
Definition bridge.c:196
@ AST_BRIDGE_FLAG_INVISIBLE
static const char config[]
static const char name[]
Definition format_mp3.c:68
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
struct @509 metrics
#define PROMETHEUS_METRIC_SET_LABEL(metric, label, n, v)
Convenience macro for setting a label / value in a metric.
#define PROMETHEUS_METRIC_STATIC_INITIALIZATION(mtype, n, h, cb)
Convenience macro for initializing a metric on the stack.
@ PROMETHEUS_METRIC_GAUGE
A metric whose value can bounce around like a jackrabbit.
void prometheus_metric_to_string(struct prometheus_metric *metric, struct ast_str **output)
Convert a metric (and its children) into Prometheus compatible text.
struct prometheus_general_config * prometheus_general_config_get(void)
Retrieve the current configuration of the module.
#define NULL
Definition resample.c:96
struct ast_bridge_snapshot * ast_bridge_get_snapshot(struct ast_bridge *bridge)
Returns the current snapshot for the bridge.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
Generic container type.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition astobj2.h:1821
Structure that contains a snapshot of information about a bridge.
Definition bridge.h:318
const ast_string_field creator
Definition bridge.h:332
const ast_string_field uniqueid
Definition bridge.h:332
const ast_string_field technology
Definition bridge.h:332
const ast_string_field name
Definition bridge.h:332
const ast_string_field subclass
Definition bridge.h:332
Structure that contains information about a bridge.
Definition bridge.h:355
struct ast_flags feature_flags
Definition bridge.h:375
void(*const get_value)(struct prometheus_metric *metric, struct ast_bridge_snapshot *snapshot)
Callback function to generate a metric value for a given bridge.
Definition bridges.c:63
const char * help
Help text to display.
Definition bridges.c:55
Prometheus general configuration.
An actual, honest to god, metric.
char value[PROMETHEUS_MAX_VALUE_LENGTH]
The current value.
#define ast_test_flag(p, flag)
Definition utils.h:64
#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:981
char * ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid)
Convert an EID to a string.
Definition utils.c:2873
#define ARRAY_LEN(a)
Definition utils.h:706
struct ast_eid ast_eid_default
Global EID.
Definition options.c:94

References ao2_cleanup, ao2_container_clone, ao2_container_count(), ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ARRAY_LEN, AST_BRIDGE_FLAG_INVISIBLE, ast_bridge_get_snapshot(), ast_bridges(), ast_calloc, ast_copy_string(), ast_eid_default, ast_eid_to_str(), ast_free, AST_LIST_INSERT_TAIL, ast_test_flag, bridges, config, ast_bridge_snapshot::creator, ast_bridge::feature_flags, bridge_metric_defs::get_value, bridge_metric_defs::help, metrics, name, ast_bridge_snapshot::name, NULL, prometheus_general_config_get(), PROMETHEUS_METRIC_GAUGE, PROMETHEUS_METRIC_SET_LABEL, PROMETHEUS_METRIC_STATIC_INITIALIZATION, prometheus_metric_to_string(), RAII_VAR, ast_bridge_snapshot::subclass, ast_bridge_snapshot::technology, ast_bridge_snapshot::uniqueid, and prometheus_metric::value.

◆ get_bridge_channel_count()

static void get_bridge_channel_count ( struct prometheus_metric metric,
struct ast_bridge_snapshot snapshot 
)
static

Definition at line 42 of file bridges.c.

43{
44 snprintf(metric->value, sizeof(metric->value), "%d", snapshot->num_channels);
45}
unsigned int num_channels
Definition bridge.h:341

References ast_bridge_snapshot::num_channels, and prometheus_metric::value.

Variable Documentation

◆ bridge_metric_defs

◆ bridges_callback

struct prometheus_callback bridges_callback
Initial value:
= {
.name = "bridges callback",
.callback_fn = bridges_scrape_cb,
}
static void bridges_scrape_cb(struct ast_str **response)
Definition bridges.c:78

Definition at line 189 of file bridges.c.

189 {
190 .name = "bridges callback",
191 .callback_fn = bridges_scrape_cb,
192};

Referenced by bridge_metrics_init(), and bridge_metrics_unload_cb().

◆ provider

struct prometheus_metrics_provider provider
static