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

            
3
#include "envoy/common/time.h"
4
#include "envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.h"
5
#include "envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.validate.h"
6
#include "envoy/registry/registry.h"
7

            
8
#include "source/common/protobuf/utility.h"
9
#include "source/extensions/resource_monitors/cpu_utilization/cpu_utilization_monitor.h"
10
#include "source/extensions/resource_monitors/cpu_utilization/linux_cpu_stats_reader.h"
11

            
12
namespace Envoy {
13
namespace Extensions {
14
namespace ResourceMonitors {
15
namespace CpuUtilizationMonitor {
16

            
17
Server::ResourceMonitorPtr CpuUtilizationMonitorFactory::createResourceMonitorFromProtoTyped(
18
    const envoy::extensions::resource_monitors::cpu_utilization::v3::CpuUtilizationConfig& config,
19
4
    Server::Configuration::ResourceMonitorFactoryContext& context) {
20
  // In the future, the below can be configurable based on the operating system.
21
4
  std::unique_ptr<CpuStatsReader> cpu_stats_reader;
22
4
  if (config.mode() ==
23
4
      envoy::extensions::resource_monitors::cpu_utilization::v3::CpuUtilizationConfig::CONTAINER) {
24
    // Use factory method to create appropriate cgroup reader (v1 or v2)
25
2
    cpu_stats_reader = LinuxContainerCpuStatsReader::create(context.api().fileSystem(),
26
2
                                                            context.api().timeSource());
27
2
  } else {
28
2
    cpu_stats_reader = std::make_unique<LinuxCpuStatsReader>();
29
2
  }
30
4
  return std::make_unique<CpuUtilizationMonitor>(config, std::move(cpu_stats_reader));
31
4
}
32

            
33
/**
34
 * Static registration for the cpu resource monitor factory. @see RegistryFactory.
35
 */
36
REGISTER_FACTORY(CpuUtilizationMonitorFactory, Server::Configuration::ResourceMonitorFactory);
37

            
38
} // namespace CpuUtilizationMonitor
39
} // namespace ResourceMonitors
40
} // namespace Extensions
41
} // namespace Envoy