value.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "value.h"
  3. inline NETDATA_DOUBLE rrdr2value(RRDR *r, long i, RRDR_OPTIONS options, int *all_values_are_null, NETDATA_DOUBLE *anomaly_rate) {
  4. size_t c;
  5. NETDATA_DOUBLE *cn = &r->v[ i * r->d ];
  6. RRDR_VALUE_FLAGS *co = &r->o[ i * r->d ];
  7. NETDATA_DOUBLE *ar = &r->ar[ i * r->d ];
  8. NETDATA_DOUBLE sum = 0, min = 0, max = 0, v;
  9. int all_null = 1, init = 1;
  10. NETDATA_DOUBLE total_anomaly_rate = 0;
  11. // for each dimension
  12. for (c = 0; c < r->d ; c++) {
  13. if(!rrdr_dimension_should_be_exposed(r->od[c], options))
  14. continue;
  15. NETDATA_DOUBLE n = cn[c];
  16. if(unlikely(init)) {
  17. if(n > 0) {
  18. min = 0;
  19. max = n;
  20. }
  21. else {
  22. min = n;
  23. max = 0;
  24. }
  25. init = 0;
  26. }
  27. if(likely(!(co[c] & RRDR_VALUE_EMPTY))) {
  28. all_null = 0;
  29. sum += n;
  30. }
  31. if(n < min) min = n;
  32. if(n > max) max = n;
  33. total_anomaly_rate += ar[c];
  34. }
  35. if(anomaly_rate) {
  36. if(!r->d) *anomaly_rate = 0;
  37. else *anomaly_rate = total_anomaly_rate / (NETDATA_DOUBLE)r->d;
  38. }
  39. if(unlikely(all_null)) {
  40. if(likely(all_values_are_null))
  41. *all_values_are_null = 1;
  42. return 0;
  43. }
  44. else {
  45. if(likely(all_values_are_null))
  46. *all_values_are_null = 0;
  47. }
  48. if(options & RRDR_OPTION_MIN2MAX)
  49. v = max - min;
  50. else
  51. v = sum;
  52. return v;
  53. }
  54. QUERY_VALUE rrdmetric2value(RRDHOST *host,
  55. struct rrdcontext_acquired *rca, struct rrdinstance_acquired *ria, struct rrdmetric_acquired *rma,
  56. time_t after, time_t before,
  57. RRDR_OPTIONS options, RRDR_TIME_GROUPING time_group_method, const char *time_group_options,
  58. size_t tier, time_t timeout, QUERY_SOURCE query_source, STORAGE_PRIORITY priority
  59. ) {
  60. QUERY_TARGET_REQUEST qtr = {
  61. .version = 1,
  62. .host = host,
  63. .rca = rca,
  64. .ria = ria,
  65. .rma = rma,
  66. .after = after,
  67. .before = before,
  68. .points = 1,
  69. .options = options,
  70. .time_group_method = time_group_method,
  71. .time_group_options = time_group_options,
  72. .tier = tier,
  73. .timeout_ms = timeout,
  74. .query_source = query_source,
  75. .priority = priority,
  76. };
  77. ONEWAYALLOC *owa = onewayalloc_create(16 * 1024);
  78. QUERY_TARGET *qt = query_target_create(&qtr);
  79. RRDR *r = rrd2rrdr(owa, qt);
  80. QUERY_VALUE qv;
  81. if(!r || rrdr_rows(r) == 0) {
  82. qv = (QUERY_VALUE) {
  83. .value = NAN,
  84. .anomaly_rate = NAN,
  85. .sp = {
  86. .count = 0,
  87. .min = NAN,
  88. .max = NAN,
  89. .sum = NAN,
  90. .anomaly_count = 0,
  91. },
  92. .duration_ut = (r) ? r->internal.qt->timings.executed_ut - r->internal.qt->timings.received_ut : 0,
  93. };
  94. }
  95. else {
  96. qv = (QUERY_VALUE) {
  97. .after = r->view.after,
  98. .before = r->view.before,
  99. .points_read = r->stats.db_points_read,
  100. .result_points = r->stats.result_points_generated,
  101. .sp = {
  102. .count = 0,
  103. },
  104. .duration_ut = r->internal.qt->timings.executed_ut - r->internal.qt->timings.received_ut,
  105. };
  106. for(size_t d = 0; d < r->internal.qt->query.used ;d++) {
  107. if(!rrdr_dimension_should_be_exposed(r->internal.qt->query.array[d].status, options))
  108. continue;
  109. storage_point_merge_to(qv.sp, r->internal.qt->query.array[d].query_points);
  110. }
  111. for(size_t t = 0; t < storage_tiers ;t++)
  112. qv.storage_points_per_tier[t] = r->internal.qt->db.tiers[t].points;
  113. long i = (!(options & RRDR_OPTION_REVERSED))?(long)rrdr_rows(r) - 1:0;
  114. int all_values_are_null = 0;
  115. qv.value = rrdr2value(r, i, options, &all_values_are_null, &qv.anomaly_rate);
  116. if(all_values_are_null) {
  117. qv.value = NAN;
  118. qv.anomaly_rate = NAN;
  119. }
  120. }
  121. rrdr_free(owa, r);
  122. query_target_release(qt);
  123. onewayalloc_destroy(owa);
  124. return qv;
  125. }