parent
e40d139536
commit
36edac7425
@ -0,0 +1,55 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdatomic.h>
|
||||||
|
|
||||||
|
struct route_metrics {
|
||||||
|
atomic_ulong total_requests;
|
||||||
|
atomic_ulong total_2XX;
|
||||||
|
atomic_ulong total_4XX;
|
||||||
|
atomic_ulong total_5XX;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
route_metrics_init(struct route_metrics *rm)
|
||||||
|
{
|
||||||
|
atomic_init(&rm->total_requests, 0);
|
||||||
|
atomic_init(&rm->total_2XX, 0);
|
||||||
|
atomic_init(&rm->total_4XX, 0);
|
||||||
|
atomic_init(&rm->total_5XX, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
route_metrics_increment_request(struct route_metrics *rm)
|
||||||
|
{
|
||||||
|
atomic_fetch_add(&rm->total_requests, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
route_metrics_increment_2XX(struct route_metrics *rm)
|
||||||
|
{
|
||||||
|
atomic_fetch_add(&rm->total_2XX, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
route_metrics_increment_4XX(struct route_metrics *rm)
|
||||||
|
{
|
||||||
|
atomic_fetch_add(&rm->total_4XX, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
route_metrics_increment_5XX(struct route_metrics *rm)
|
||||||
|
{
|
||||||
|
atomic_fetch_add(&rm->total_5XX, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
route_metrics_increment(struct route_metrics *rm, int status_code)
|
||||||
|
{
|
||||||
|
if (status_code >= 200 && status_code <= 299) {
|
||||||
|
route_metrics_increment_2XX(rm);
|
||||||
|
} else if (status_code >= 400 && status_code <= 499) {
|
||||||
|
route_metrics_increment_4XX(rm);
|
||||||
|
} else if (status_code >= 500 && status_code <= 599) {
|
||||||
|
route_metrics_increment_5XX(rm);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
#include <stdatomic.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "perf_window.h"
|
||||||
|
#include "tenant_functions.h"
|
||||||
|
|
||||||
|
// tenant_database_foreach_cb_t
|
||||||
|
|
||||||
|
static const int p50_idx = PERF_WINDOW_BUFFER_SIZE * 50 / 100;
|
||||||
|
static const int p90_idx = PERF_WINDOW_BUFFER_SIZE * 90 / 100;
|
||||||
|
|
||||||
|
void
|
||||||
|
render_routes(struct route *route, void *arg_one, void *arg_two)
|
||||||
|
{
|
||||||
|
FILE *ostream = (FILE *)arg_one;
|
||||||
|
struct tenant *tenant = (struct tenant *)arg_two;
|
||||||
|
|
||||||
|
#ifdef ADMISSIONS_CONTROL
|
||||||
|
uint64_t latency_p50 = perf_window_get_percentile(&route->admissions_info.perf_window, 50, p50_idx);
|
||||||
|
uint64_t latency_p90 = perf_window_get_percentile(&route->admissions_info.perf_window, 90, p90_idx);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint64_t total_requests = atomic_load(&route->metrics.total_requests);
|
||||||
|
uint64_t total_2XX = atomic_load(&route->metrics.total_2XX);
|
||||||
|
uint64_t total_4XX = atomic_load(&route->metrics.total_4XX);
|
||||||
|
uint64_t total_5XX = atomic_load(&route->metrics.total_5XX);
|
||||||
|
|
||||||
|
fprintf(ostream, "# TYPE %s_%s_total_requests counter\n", tenant->name, route->route);
|
||||||
|
fprintf(ostream, "%s_%s_total_requests: %lu\n", tenant->name, route->route, total_requests);
|
||||||
|
|
||||||
|
fprintf(ostream, "# TYPE %s_%s_total_2XX counter\n", tenant->name, route->route);
|
||||||
|
fprintf(ostream, "%s_%s_total_2XX: %lu\n", tenant->name, route->route, total_2XX);
|
||||||
|
|
||||||
|
fprintf(ostream, "# TYPE %s_%s_total_4XX counter\n", tenant->name, route->route);
|
||||||
|
fprintf(ostream, "%s_%s_total_4XX: %lu\n", tenant->name, route->route, total_4XX);
|
||||||
|
|
||||||
|
fprintf(ostream, "# TYPE %s_%s_total_5XX counter\n", tenant->name, route->route);
|
||||||
|
fprintf(ostream, "%s_%s_total_5XX: %lu\n", tenant->name, route->route, total_5XX);
|
||||||
|
|
||||||
|
#ifdef ADMISSIONS_CONTROL
|
||||||
|
fprintf(ostream, "# TYPE %s_%s_latency_p50 gauge\n", tenant->name, route->route);
|
||||||
|
fprintf(ostream, "%s_%s_latency_p50: %lu\n", tenant->name, route->route, latency_p50);
|
||||||
|
|
||||||
|
fprintf(ostream, "# TYPE %s_%s_latency_p90 gauge\n", tenant->name, route->route);
|
||||||
|
fprintf(ostream, "%s_%s_latency_p90: %lu\n", tenant->name, route->route, latency_p90);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
render_tenant_routers(struct tenant *tenant, void *arg_one, void *arg_two)
|
||||||
|
{
|
||||||
|
FILE *ostream = (FILE *)arg_one;
|
||||||
|
char *name = tenant->name;
|
||||||
|
|
||||||
|
http_router_foreach(&tenant->router, render_routes, ostream, tenant);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
metrics_server_route_level_metrics_render(FILE *ostream)
|
||||||
|
{
|
||||||
|
tenant_database_foreach(render_tenant_routers, ostream, NULL);
|
||||||
|
}
|
Loading…
Reference in new issue