-
Notifications
You must be signed in to change notification settings - Fork 4.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a CPU utilization resource monitor for overload manager (#34713)
Commit Message: Add a CPU utilization resource monitor for overload manager. i.e. this can be configured to reject requests once CPU Utilization reaches a certain brownout point. Signed-off-by: Can Cecen <[email protected]>
- Loading branch information
Showing
23 changed files
with
756 additions
and
1 deletion.
There are no files selected for viewing
Validating CODEOWNERS rules …
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 9 additions & 0 deletions
9
api/envoy/extensions/resource_monitors/cpu_utilization/v3/BUILD
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# DO NOT EDIT. This file is generated by tools/proto_format/proto_sync.py. | ||
|
||
load("@envoy_api//bazel:api_build_system.bzl", "api_proto_package") | ||
|
||
licenses(["notice"]) # Apache 2 | ||
|
||
api_proto_package( | ||
deps = ["@com_github_cncf_xds//udpa/annotations:pkg"], | ||
) |
19 changes: 19 additions & 0 deletions
19
api/envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.proto
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
syntax = "proto3"; | ||
|
||
package envoy.extensions.resource_monitors.cpu_utilization.v3; | ||
|
||
import "udpa/annotations/status.proto"; | ||
|
||
option java_package = "io.envoyproxy.envoy.extensions.resource_monitors.cpu_utilization.v3"; | ||
option java_outer_classname = "CpuUtilizationProto"; | ||
option java_multiple_files = true; | ||
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/resource_monitors/cpu_utilization/v3;cpu_utilizationv3"; | ||
option (udpa.annotations.file_status).package_version_status = ACTIVE; | ||
|
||
// [#protodoc-title: CPU utilization] | ||
// [#extension: envoy.resource_monitors.cpu_utilization] | ||
|
||
// The CPU utilization resource monitor reports the Envoy process the CPU Utilization of the entire host. | ||
// Today, this only works on Linux and is calculated using the stats in the /proc/stat file. | ||
message CpuUtilizationConfig { | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
55 changes: 55 additions & 0 deletions
55
.../configuration/operations/overload_manager/_include/cpu_utilization_monitor_overload.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
static_resources: | ||
listeners: | ||
- address: | ||
socket_address: | ||
address: 0.0.0.0 | ||
port_value: 8000 | ||
filter_chains: | ||
- filters: | ||
- name: envoy.filters.network.http_connection_manager | ||
typed_config: | ||
'@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager | ||
stat_prefix: ingress_http | ||
http_filters: | ||
- name: envoy.filters.http.router | ||
typed_config: | ||
'@type': type.googleapis.com/envoy.extensions.filters.http.router.v3.Router | ||
route_config: | ||
name: local_route | ||
virtual_hosts: | ||
- domains: | ||
- '*' | ||
name: local_service | ||
routes: | ||
- match: {prefix: "/"} | ||
route: {cluster: default_service} | ||
clusters: | ||
- name: default_service | ||
load_assignment: | ||
cluster_name: default_service | ||
endpoints: | ||
- lb_endpoints: | ||
- endpoint: | ||
address: | ||
socket_address: | ||
address: 127.0.0.1 | ||
port_value: 10001 | ||
admin: | ||
address: | ||
socket_address: | ||
address: 0.0.0.0 | ||
port_value: 9901 | ||
|
||
overload_manager: | ||
refresh_interval: 0.25s | ||
resource_monitors: | ||
- name: "envoy.resource_monitors.cpu_utilization" | ||
typed_config: | ||
"@type": type.googleapis.com/envoy.extensions.resource_monitors.cpu_utilization.v3.CpuUtilizationConfig | ||
actions: | ||
- name: "envoy.overload_actions.stop_accepting_requests" | ||
triggers: | ||
- name: "envoy.resource_monitors.cpu_utilization" | ||
scaled: | ||
scaling_threshold: 0.80 | ||
saturation_threshold: 0.95 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
load( | ||
"//bazel:envoy_build_system.bzl", | ||
"envoy_cc_extension", | ||
"envoy_cc_library", | ||
"envoy_extension_package", | ||
) | ||
|
||
licenses(["notice"]) # Apache 2 | ||
|
||
envoy_extension_package() | ||
|
||
envoy_cc_library( | ||
name = "cpu_utilization_monitor", | ||
srcs = ["cpu_utilization_monitor.cc"], | ||
hdrs = [ | ||
"cpu_stats_reader.h", | ||
"cpu_utilization_monitor.h", | ||
], | ||
tags = ["skip_on_windows"], | ||
deps = [ | ||
"//envoy/common:exception_lib", | ||
"//envoy/server:resource_monitor_config_interface", | ||
"//source/common/runtime:runtime_features_lib", | ||
"@envoy_api//envoy/extensions/resource_monitors/cpu_utilization/v3:pkg_cc_proto", | ||
], | ||
) | ||
|
||
envoy_cc_library( | ||
name = "linux_cpu_stats_reader", | ||
srcs = ["linux_cpu_stats_reader.cc"], | ||
hdrs = [ | ||
"cpu_stats_reader.h", | ||
"cpu_utilization_monitor.h", | ||
"linux_cpu_stats_reader.h", | ||
], | ||
tags = ["skip_on_windows"], | ||
deps = [ | ||
"//source/common/common:logger_lib", | ||
"@com_google_absl//absl/strings", | ||
"@envoy_api//envoy/extensions/resource_monitors/cpu_utilization/v3:pkg_cc_proto", | ||
], | ||
) | ||
|
||
envoy_cc_extension( | ||
name = "config", | ||
srcs = ["config.cc"], | ||
hdrs = ["config.h"], | ||
tags = ["skip_on_windows"], | ||
deps = [ | ||
":cpu_utilization_monitor", | ||
":linux_cpu_stats_reader", | ||
"//envoy/registry", | ||
"//envoy/server:resource_monitor_config_interface", | ||
"//source/common/common:logger_lib", | ||
"//source/extensions/resource_monitors/common:factory_base_lib", | ||
"//source/server:configuration_lib", | ||
"@envoy_api//envoy/extensions/resource_monitors/cpu_utilization/v3:pkg_cc_proto", | ||
], | ||
) |
32 changes: 32 additions & 0 deletions
32
source/extensions/resource_monitors/cpu_utilization/config.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#include "source/extensions/resource_monitors/cpu_utilization/config.h" | ||
|
||
#include "envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.h" | ||
#include "envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.validate.h" | ||
#include "envoy/registry/registry.h" | ||
|
||
#include "source/common/protobuf/utility.h" | ||
#include "source/extensions/resource_monitors/cpu_utilization/cpu_utilization_monitor.h" | ||
#include "source/extensions/resource_monitors/cpu_utilization/linux_cpu_stats_reader.h" | ||
|
||
namespace Envoy { | ||
namespace Extensions { | ||
namespace ResourceMonitors { | ||
namespace CpuUtilizationMonitor { | ||
|
||
Server::ResourceMonitorPtr CpuUtilizationMonitorFactory::createResourceMonitorFromProtoTyped( | ||
const envoy::extensions::resource_monitors::cpu_utilization::v3::CpuUtilizationConfig& config, | ||
Server::Configuration::ResourceMonitorFactoryContext& /*unused_context*/) { | ||
// In the future, the below can be configurable based on the operating system. | ||
auto cpu_stats_reader = std::make_unique<LinuxCpuStatsReader>(); | ||
return std::make_unique<CpuUtilizationMonitor>(config, std::move(cpu_stats_reader)); | ||
} | ||
|
||
/** | ||
* Static registration for the cpu resource monitor factory. @see RegistryFactory. | ||
*/ | ||
REGISTER_FACTORY(CpuUtilizationMonitorFactory, Server::Configuration::ResourceMonitorFactory); | ||
|
||
} // namespace CpuUtilizationMonitor | ||
} // namespace ResourceMonitors | ||
} // namespace Extensions | ||
} // namespace Envoy |
29 changes: 29 additions & 0 deletions
29
source/extensions/resource_monitors/cpu_utilization/config.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
#pragma once | ||
|
||
#include "envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.h" | ||
#include "envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.validate.h" | ||
#include "envoy/server/resource_monitor_config.h" | ||
|
||
#include "source/extensions/resource_monitors/common/factory_base.h" | ||
|
||
namespace Envoy { | ||
namespace Extensions { | ||
namespace ResourceMonitors { | ||
namespace CpuUtilizationMonitor { | ||
|
||
class CpuUtilizationMonitorFactory | ||
: public Common::FactoryBase< | ||
envoy::extensions::resource_monitors::cpu_utilization::v3::CpuUtilizationConfig> { | ||
public: | ||
CpuUtilizationMonitorFactory() : FactoryBase("envoy.resource_monitors.cpu_utilization") {} | ||
|
||
private: | ||
Server::ResourceMonitorPtr createResourceMonitorFromProtoTyped( | ||
const envoy::extensions::resource_monitors::cpu_utilization::v3::CpuUtilizationConfig& config, | ||
Server::Configuration::ResourceMonitorFactoryContext& context) override; | ||
}; | ||
|
||
} // namespace CpuUtilizationMonitor | ||
} // namespace ResourceMonitors | ||
} // namespace Extensions | ||
} // namespace Envoy |
35 changes: 35 additions & 0 deletions
35
source/extensions/resource_monitors/cpu_utilization/cpu_stats_reader.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
#pragma once | ||
|
||
#include <dirent.h> | ||
#include <unistd.h> | ||
|
||
#include <algorithm> | ||
#include <filesystem> | ||
#include <fstream> | ||
|
||
#include "source/common/common/logger.h" | ||
|
||
#include "absl/strings/str_split.h" | ||
|
||
namespace Envoy { | ||
namespace Extensions { | ||
namespace ResourceMonitors { | ||
namespace CpuUtilizationMonitor { | ||
|
||
struct CpuTimes { | ||
bool is_valid; | ||
uint64_t work_time; | ||
uint64_t total_time; | ||
}; | ||
|
||
class CpuStatsReader { | ||
public: | ||
CpuStatsReader() = default; | ||
virtual ~CpuStatsReader() = default; | ||
virtual CpuTimes getCpuTimes() = 0; | ||
}; | ||
|
||
} // namespace CpuUtilizationMonitor | ||
} // namespace ResourceMonitors | ||
} // namespace Extensions | ||
} // namespace Envoy |
Oops, something went wrong.