| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #include "api_v1_calls.h" |
| 4 | |
| 5 | #ifndef ENABLE_DBENGINE |
| 6 | int web_client_api_request_v1_dbengine_stats(RRDHOST *host __maybe_unused, struct web_client *w __maybe_unused, char *url __maybe_unused) { |
| 7 | return HTTP_RESP_NOT_FOUND; |
| 8 | } |
| 9 | #else |
| 10 | static void web_client_api_v1_dbengine_stats_for_tier(BUFFER *wb, size_t tier) { |
| 11 | RRDENG_SIZE_STATS stats = rrdeng_size_statistics(multidb_ctx[tier]); |
| 12 | |
| 13 | buffer_sprintf(wb, |
| 14 | "\n\t\t\"default_granularity_secs\":%zu" |
| 15 | ",\n\t\t\"sizeof_datafile\":%zu" |
| 16 | ",\n\t\t\"sizeof_page_in_cache\":%zu" |
| 17 | ",\n\t\t\"sizeof_point_data\":%zu" |
| 18 | ",\n\t\t\"sizeof_page_data\":%zu" |
| 19 | ",\n\t\t\"pages_per_extent\":%zu" |
| 20 | ",\n\t\t\"datafiles\":%zu" |
| 21 | ",\n\t\t\"extents\":%zu" |
| 22 | ",\n\t\t\"extents_pages\":%zu" |
| 23 | ",\n\t\t\"points\":%zu" |
| 24 | ",\n\t\t\"metrics\":%zu" |
| 25 | ",\n\t\t\"metrics_pages\":%zu" |
| 26 | ",\n\t\t\"extents_compressed_bytes\":%zu" |
| 27 | ",\n\t\t\"pages_uncompressed_bytes\":%zu" |
| 28 | ",\n\t\t\"pages_duration_secs\":%lld" |
| 29 | ",\n\t\t\"single_point_pages\":%zu" |
| 30 | ",\n\t\t\"first_t\":%ld" |
| 31 | ",\n\t\t\"last_t\":%ld" |
| 32 | ",\n\t\t\"database_retention_secs\":%lld" |
| 33 | ",\n\t\t\"average_compression_savings\":%0.2f" |
| 34 | ",\n\t\t\"average_point_duration_secs\":%0.2f" |
| 35 | ",\n\t\t\"average_metric_retention_secs\":%0.2f" |
| 36 | ",\n\t\t\"ephemeral_metrics_per_day_percent\":%0.2f" |
| 37 | ",\n\t\t\"average_page_size_bytes\":%0.2f" |
| 38 | ",\n\t\t\"estimated_concurrently_collected_metrics\":%zu" |
| 39 | ",\n\t\t\"currently_collected_metrics\":%zu" |
| 40 | ",\n\t\t\"disk_space\":%zu" |
| 41 | ",\n\t\t\"max_disk_space\":%zu" |
| 42 | , stats.default_granularity_secs |
| 43 | , stats.sizeof_datafile |
| 44 | , stats.sizeof_page_in_cache |
| 45 | , stats.sizeof_point_data |
| 46 | , stats.sizeof_page_data |
| 47 | , stats.pages_per_extent |
| 48 | , stats.datafiles |
| 49 | , stats.extents |
| 50 | , stats.extents_pages |
| 51 | , stats.points |
| 52 | , stats.metrics |
| 53 | , stats.metrics_pages |
| 54 | , stats.extents_compressed_bytes |
| 55 | , stats.pages_uncompressed_bytes |
| 56 | , (long long)stats.pages_duration_secs |
| 57 | , stats.single_point_pages |
| 58 | , stats.first_time_s |
| 59 | , stats.last_time_s |
| 60 | , (long long)stats.database_retention_secs |
| 61 | , stats.average_compression_savings |
| 62 | , stats.average_point_duration_secs |
| 63 | , stats.average_metric_retention_secs |
| 64 | , stats.ephemeral_metrics_per_day_percent |
| 65 | , stats.average_page_size_bytes |
| 66 | , stats.estimated_concurrently_collected_metrics |
| 67 | , stats.currently_collected_metrics |
| 68 | , stats.disk_space |
| 69 | , stats.max_disk_space |
| 70 | ); |
| 71 | } |
| 72 | |
| 73 | int api_v1_dbengine_stats(RRDHOST *host __maybe_unused, struct web_client *w, char *url __maybe_unused) { |
| 74 | if (!netdata_ready_load()) |
| 75 | return HTTP_RESP_SERVICE_UNAVAILABLE; |
| 76 | |
| 77 | BUFFER *wb = w->response.data; |
| 78 | buffer_flush(wb); |
| 79 | |
| 80 | if(!dbengine_enabled) { |
| 81 | buffer_strcat(wb, "dbengine is not enabled"); |
| 82 | return HTTP_RESP_NOT_FOUND; |
| 83 | } |
| 84 | |
| 85 | wb->content_type = CT_APPLICATION_JSON; |
| 86 | buffer_no_cacheable(wb); |
| 87 | buffer_strcat(wb, "{"); |
| 88 | for(size_t tier = 0; tier < nd_profile.storage_tiers;tier++) { |
| 89 | buffer_sprintf(wb, "%s\n\t\"tier%zu\": {", tier?",":"", tier); |
| 90 | web_client_api_v1_dbengine_stats_for_tier(wb, tier); |
| 91 | buffer_strcat(wb, "\n\t}"); |
| 92 | } |
| 93 | buffer_strcat(wb, "\n}"); |
| 94 | |
| 95 | return HTTP_RESP_OK; |
| 96 | } |
| 97 | #endif |