Skip to content

File syn_metrics.h

File List > src > syntropic > util > syn_metrics.h

Go to the documentation of this file

#ifndef SYN_METRICS_H
#define SYN_METRICS_H

#include "../common/syn_defs.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    SYN_METRIC_TYPE_COUNTER, 
    SYN_METRIC_TYPE_GAUGE    
} SYN_MetricType;

typedef union {
    uint64_t counter; 
    int32_t gauge;    
} SYN_MetricVal;

typedef struct SYN_Metric {
    const char *name;        
    const char *help;        
    SYN_MetricType type;     
    SYN_MetricVal val;       
    bool registered;         
    struct SYN_Metric *next; 
} SYN_Metric;

#if SYN_USE_METRICS

#define SYN_METRIC_DECLARE(var, _name, _help, _type) \
    static SYN_Metric var = {.name = _name,          \
                             .help = _help,          \
                             .type = _type,          \
                             .val = {0},             \
                             .registered = false,    \
                             .next = NULL}

#define SYN_METRIC_REGISTER(m) syn_metric_register(&(m))

#define SYN_METRIC_INC(m)                      \
    do {                                       \
        if ((m).type == SYN_METRIC_TYPE_GAUGE) \
            (m).val.gauge++;                   \
        else                                   \
            (m).val.counter++;                 \
    } while (0)

#define SYN_METRIC_ADD(m, v)                   \
    do {                                       \
        if ((m).type == SYN_METRIC_TYPE_GAUGE) \
            (m).val.gauge += (int32_t)(v);     \
        else                                   \
            (m).val.counter += (v);            \
    } while (0)

#define SYN_METRIC_DEC(m)                      \
    do {                                       \
        if ((m).type == SYN_METRIC_TYPE_GAUGE) \
            (m).val.gauge--;                   \
    } while (0)

#define SYN_METRIC_SUB(m, v)                   \
    do {                                       \
        if ((m).type == SYN_METRIC_TYPE_GAUGE) \
            (m).val.gauge -= (v);              \
    } while (0)

#define SYN_METRIC_SET(m, v)                   \
    do {                                       \
        if ((m).type == SYN_METRIC_TYPE_GAUGE) \
            (m).val.gauge = (v);               \
    } while (0)

void syn_metrics_init(void);

struct SYN_Router;
void syn_metrics_set_router(struct SYN_Router *r);

void syn_metrics_record(const char *name, float value);

void syn_metrics_count(const char *name, int32_t delta);

void syn_metric_register(SYN_Metric *m);

void syn_metrics_foreach(void (*cb)(const SYN_Metric *m, void *ctx), void *ctx);

#else /* !SYN_USE_METRICS */

#define SYN_METRIC_DECLARE(var, name, help, type)
#define SYN_METRIC_REGISTER(m) ((void)0)
#define SYN_METRIC_INC(m) ((void)0)
#define SYN_METRIC_ADD(m, v) ((void)0)
#define SYN_METRIC_DEC(m) ((void)0)
#define SYN_METRIC_SUB(m, v) ((void)0)
#define SYN_METRIC_SET(m, v) ((void)0)

static inline void syn_metrics_init(void)
{
}
static inline void syn_metrics_record(const char *name, float value)
{
    (void)name;
    (void)value;
}
static inline void syn_metrics_count(const char *name, int32_t delta)
{
    (void)name;
    (void)delta;
}

static inline void syn_metrics_foreach(void (*cb)(const struct SYN_Metric *m, void *ctx), void *ctx)
{
    (void)cb;
    (void)ctx;
}

#endif /* SYN_USE_METRICS */

#ifdef __cplusplus
}
#endif

#endif /* SYN_METRICS_H */