0
0
Fork 0
mirror of https://github.com/netdata/netdata.git synced 2025-05-15 14:00:42 +00:00
netdata_netdata/web/api/queries/rrdr.c
Costa Tsaousis cd50bf4236
/api/v2 part 4 ()
* expose the order of group by

* key renames in json wrapper v2

* added group by context and group by units

* added view_average_values

* fix for view_average_values when percentage is specified

* option group-by-labels is enabling the exposure of all the labels that are used for each of the final grouped dimensions

* when executing group by queries, allocate one dimension data at a time - not all of them

* respect hidden dimensions

* cancel running data query on socket error

* use poll to detect socket errors

* use POLLRDHUP to detect half closed connections

* make sure POLLRDHUP is available

* do not destroy aral-by-size arals

* completed documentation of /api/v2/data.

* moved min, max back to view; updated swagger yaml and json

* default format for /api/v2/data is json2
2023-03-13 23:39:06 +02:00

143 lines
4.1 KiB
C

// SPDX-License-Identifier: GPL-3.0-or-later
#include "rrdr.h"
/*
static void rrdr_dump(RRDR *r)
{
long c, i;
RRDDIM *d;
fprintf(stderr, "\nCHART %s (%s)\n", r->st->id, r->st->name);
for(c = 0, d = r->st->dimensions; d ;c++, d = d->next) {
fprintf(stderr, "DIMENSION %s (%s), %s%s%s%s\n"
, d->id
, d->name
, (r->od[c] & RRDR_EMPTY)?"EMPTY ":""
, (r->od[c] & RRDR_RESET)?"RESET ":""
, (r->od[c] & RRDR_DIMENSION_HIDDEN)?"HIDDEN ":""
, (r->od[c] & RRDR_DIMENSION_NONZERO)?"NONZERO ":""
);
}
if(r->rows <= 0) {
fprintf(stderr, "RRDR does not have any values in it.\n");
return;
}
fprintf(stderr, "RRDR includes %d values in it:\n", r->rows);
// for each line in the array
for(i = 0; i < r->rows ;i++) {
NETDATA_DOUBLE *cn = &r->v[ i * r->d ];
RRDR_DIMENSION_FLAGS *co = &r->o[ i * r->d ];
// print the id and the timestamp of the line
fprintf(stderr, "%ld %ld ", i + 1, r->t[i]);
// for each dimension
for(c = 0, d = r->st->dimensions; d ;c++, d = d->next) {
if(unlikely(r->od[c] & RRDR_DIMENSION_HIDDEN)) continue;
if(unlikely(!(r->od[c] & RRDR_DIMENSION_NONZERO))) continue;
if(co[c] & RRDR_EMPTY)
fprintf(stderr, "null ");
else
fprintf(stderr, NETDATA_DOUBLE_FORMAT " %s%s%s%s "
, cn[c]
, (co[c] & RRDR_EMPTY)?"E":" "
, (co[c] & RRDR_RESET)?"R":" "
, (co[c] & RRDR_DIMENSION_HIDDEN)?"H":" "
, (co[c] & RRDR_DIMENSION_NONZERO)?"N":" "
);
}
fprintf(stderr, "\n");
}
}
*/
inline void rrdr_free(ONEWAYALLOC *owa, RRDR *r) {
if(unlikely(!r)) return;
for(size_t d = 0; d < r->d ;d++) {
string_freez(r->di[d]);
string_freez(r->dn[d]);
string_freez(r->du[d]);
}
query_target_release(r->internal.qt);
onewayalloc_freez(owa, r->t);
onewayalloc_freez(owa, r->v);
onewayalloc_freez(owa, r->o);
onewayalloc_freez(owa, r->od);
onewayalloc_freez(owa, r->di);
onewayalloc_freez(owa, r->dn);
onewayalloc_freez(owa, r->du);
onewayalloc_freez(owa, r->dp);
onewayalloc_freez(owa, r->dv);
onewayalloc_freez(owa, r->ar);
onewayalloc_freez(owa, r->gbc);
onewayalloc_freez(owa, r->dgbc);
if(r->dl) {
for(size_t d = 0; d < r->d ;d++)
dictionary_destroy(r->dl[d]);
onewayalloc_freez(owa, r->dl);
}
dictionary_destroy(r->label_keys);
if(r->group_by.r) {
// prevent accidental infinite recursion
r->group_by.r->group_by.r = NULL;
// do not release qt twice
r->group_by.r->internal.qt = NULL;
rrdr_free(owa, r->group_by.r);
}
onewayalloc_freez(owa, r);
}
RRDR *rrdr_create(ONEWAYALLOC *owa, QUERY_TARGET *qt, size_t dimensions, size_t points) {
if(unlikely(!qt))
return NULL;
// create the rrdr
RRDR *r = onewayalloc_callocz(owa, 1, sizeof(RRDR));
r->internal.owa = owa;
r->internal.qt = qt;
r->view.before = qt->window.before;
r->view.after = qt->window.after;
r->time_grouping.points_wanted = points;
r->d = (int)dimensions;
r->n = (int)points;
if(points && dimensions) {
r->v = onewayalloc_mallocz(owa, points * dimensions * sizeof(NETDATA_DOUBLE));
r->o = onewayalloc_mallocz(owa, points * dimensions * sizeof(RRDR_VALUE_FLAGS));
r->ar = onewayalloc_mallocz(owa, points * dimensions * sizeof(NETDATA_DOUBLE));
}
if(points) {
r->t = onewayalloc_callocz(owa, points, sizeof(time_t));
}
if(dimensions) {
r->od = onewayalloc_mallocz(owa, dimensions * sizeof(RRDR_DIMENSION_FLAGS));
r->di = onewayalloc_callocz(owa, dimensions, sizeof(STRING *));
r->dn = onewayalloc_callocz(owa, dimensions, sizeof(STRING *));
r->du = onewayalloc_callocz(owa, dimensions, sizeof(STRING *));
}
r->view.group = 1;
r->view.update_every = 1;
return r;
}