1
#include "source/extensions/resource_monitors/cpu_utilization/cpu_utilization_monitor.h"
2

            
3
#include <dirent.h>
4
#include <unistd.h>
5

            
6
#include <array>
7
#include <cstdlib>
8
#include <fstream>
9
#include <iostream>
10
#include <sstream>
11
#include <string>
12
#include <thread>
13

            
14
#include "envoy/common/exception.h"
15

            
16
#include "source/common/common/assert.h"
17
#include "source/common/common/fmt.h"
18
#include "source/common/common/thread.h"
19

            
20
#include "absl/strings/str_split.h"
21

            
22
namespace Envoy {
23
namespace Extensions {
24
namespace ResourceMonitors {
25
namespace CpuUtilizationMonitor {
26

            
27
// The dampening alpha value used for EWMA calculation.
28
// The value is chosen to be very small to give past calculations higher priority.
29
// This helps in reducing the impact of sudden spikes or drops in CPU utilization.
30
constexpr double DAMPENING_ALPHA = 0.05;
31

            
32
CpuUtilizationMonitor::CpuUtilizationMonitor(
33
    const envoy::extensions::resource_monitors::cpu_utilization::v3::
34
        CpuUtilizationConfig& /*config*/,
35
    std::unique_ptr<CpuStatsReader> cpu_stats_reader)
36
9
    : cpu_stats_reader_(std::move(cpu_stats_reader)) {
37
  // Initialize by calling getUtilization() once to establish baseline
38
9
  (void)cpu_stats_reader_->getUtilization();
39
9
}
40

            
41
13
void CpuUtilizationMonitor::updateResourceUsage(Server::ResourceUpdateCallbacks& callbacks) {
42
13
  absl::StatusOr<double> utilization_result = cpu_stats_reader_->getUtilization();
43

            
44
13
  if (!utilization_result.ok()) {
45
5
    const auto& error = EnvoyException(std::string(utilization_result.status().message()));
46
5
    callbacks.onFailure(error);
47
5
    return;
48
5
  }
49

            
50
8
  const double current_utilization = utilization_result.value();
51

            
52
  // Debug logging
53
8
  ENVOY_LOG_MISC(trace, "CPU utilization: {}", current_utilization);
54

            
55
  // The new utilization is calculated/smoothed using EWMA
56
8
  utilization_ = current_utilization * DAMPENING_ALPHA + (1 - DAMPENING_ALPHA) * utilization_;
57

            
58
8
  Server::ResourceUsage usage;
59
8
  usage.resource_pressure_ = utilization_;
60

            
61
8
  callbacks.onSuccess(usage);
62
8
}
63

            
64
} // namespace CpuUtilizationMonitor
65
} // namespace ResourceMonitors
66
} // namespace Extensions
67
} // namespace Envoy