From e92b2af75c9461f7d267002e826c2c8c5146d6d1 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Fri, 5 Jan 2024 09:32:34 +0100 Subject: [PATCH] cpu plugin: Add `usage_global_rate`. --- src/cpu.c | 24 ++++++++++++++++++++---- src/cpu_test.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/cpu.c b/src/cpu.c index 3856f41a9..19c20d418 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -429,17 +429,33 @@ static gauge_t usage_active_rate(usage_t u, size_t cpu) { return us.has_value ? us.rate : NAN; } +static gauge_t usage_global_rate(usage_t u, state_t state) { + size_t cpu_num = u.states_num / STATE_MAX; + usage_state_t us = {0}; + for (size_t i = 0; i < cpu_num; i++) { + gauge_t rate = usage_rate(u, i, state); + if (isnan(rate)) { + continue; + } + + us.rate += rate; + us.has_value = true; + } + + return us.has_value ? us.rate : NAN; +} + __attribute__((unused)) static gauge_t usage_rate(usage_t u, size_t cpu, state_t state) { + if (state == STATE_ACTIVE) { + return usage_active_rate(u, cpu); + } + size_t index = (cpu * STATE_MAX) + state; if (index >= u.states_num) { return NAN; } - if (state == STATE_ACTIVE) { - return usage_active_rate(u, cpu); - } - usage_state_t us = u.states[index]; return us.has_value ? us.rate : NAN; } diff --git a/src/cpu_test.c b/src/cpu_test.c index 6fbae097d..2140c4392 100644 --- a/src/cpu_test.c +++ b/src/cpu_test.c @@ -100,9 +100,48 @@ DEF_TEST(usage_active) { return 0; } +DEF_TEST(usage_global_rate) { + usage_t usage = {0}; + + cdtime_t t0 = TIME_T_TO_CDTIME_T(100); + derive_t cpu0_t0 = 1000; + derive_t cpu1_t0 = 2000; + + usage_init(&usage, t0); + usage_record(&usage, 0, STATE_USER, cpu0_t0); + usage_record(&usage, 1, STATE_USER, cpu1_t0); + + // Unable to calculate a rate with a single data point. + EXPECT_EQ_DOUBLE(NAN, usage_rate(usage, 0, STATE_USER)); + EXPECT_EQ_DOUBLE(NAN, usage_rate(usage, 1, STATE_USER)); + EXPECT_EQ_DOUBLE(NAN, usage_global_rate(usage, STATE_USER)); + EXPECT_EQ_DOUBLE(NAN, usage_global_rate(usage, STATE_ACTIVE)); + + cdtime_t t1 = t0 + TIME_T_TO_CDTIME_T(10); + derive_t cpu0_t1 = cpu0_t0 + 300; + derive_t cpu1_t1 = cpu1_t0 + 700; + + gauge_t want_cpu0_rate = 300.0 / 10.0; + gauge_t want_cpu1_rate = 700.0 / 10.0; + gauge_t want_global_rate = want_cpu0_rate + want_cpu1_rate; + + usage_init(&usage, t1); + usage_record(&usage, 0, STATE_USER, cpu0_t1); + usage_record(&usage, 1, STATE_USER, cpu1_t1); + + EXPECT_EQ_DOUBLE(want_cpu0_rate, usage_rate(usage, 0, STATE_USER)); + EXPECT_EQ_DOUBLE(want_cpu1_rate, usage_rate(usage, 1, STATE_USER)); + EXPECT_EQ_DOUBLE(want_global_rate, usage_global_rate(usage, STATE_USER)); + EXPECT_EQ_DOUBLE(want_global_rate, usage_global_rate(usage, STATE_ACTIVE)); + + usage_reset(&usage); + return 0; +} + int main(void) { RUN_TEST(usage_simple_rate); RUN_TEST(usage_active); + RUN_TEST(usage_global_rate); END_TEST; } -- 2.47.2