Skip to content

Commit 850c7f1

Browse files
authored
orca: support to parse utilization from raw text (envoyproxy#37487)
Signed-off-by: wangbaiping(wbpcode) <[email protected]>
1 parent d76d053 commit 850c7f1

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

source/common/orca/orca_parser.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,24 @@ absl::Status tryCopyMetricToOrcaLoadReport(absl::string_view metric_name,
8484
fmt::format("custom backend load metric value({}) cannot be infinity.", metric_name));
8585
}
8686

87+
// Check for negative values for all metrics.
88+
if (value < 0) {
89+
return absl::InvalidArgumentError(
90+
fmt::format("custom backend load metric value({}) cannot be negative.", metric_name));
91+
}
92+
93+
if (absl::StartsWith(metric_name, kUtilizationPrefix)) {
94+
absl::string_view metric_name_without_prefix =
95+
absl::StripPrefix(metric_name, kUtilizationPrefix);
96+
if (metric_name_without_prefix.empty()) {
97+
return absl::InvalidArgumentError("utilization metric key is empty.");
98+
}
99+
100+
orca_load_report.mutable_utilization()->insert(
101+
{std::string(metric_name_without_prefix), value});
102+
return absl::OkStatus();
103+
}
104+
87105
if (absl::StartsWith(metric_name, kNamedMetricsFieldPrefix)) {
88106
auto metric_name_without_prefix = absl::StripPrefix(metric_name, kNamedMetricsFieldPrefix);
89107
return tryCopyNamedMetricToOrcaLoadReport(metric_name_without_prefix, value, orca_load_report);

source/common/orca/orca_parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ static constexpr absl::string_view kMemUtilizationField = "mem_utilization";
2323
static constexpr absl::string_view kEpsField = "eps";
2424
static constexpr absl::string_view kRpsFractionalField = "rps_fractional";
2525
static constexpr absl::string_view kNamedMetricsFieldPrefix = "named_metrics.";
26+
static constexpr absl::string_view kUtilizationPrefix = "utilization.";
2627

2728
// Parses ORCA load metrics from a header map into an OrcaLoadReport proto.
2829
// Supports native HTTP, JSON and serialized binary formats.

test/common/orca/orca_parser_test.cc

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ static xds::data::orca::v3::OrcaLoadReport exampleOrcaLoadReport() {
2424
orca_load_report.set_rps_fractional(1000);
2525
orca_load_report.mutable_named_metrics()->insert({"foo", 123});
2626
orca_load_report.mutable_named_metrics()->insert({"bar", 0.2});
27+
orca_load_report.mutable_utilization()->insert({"total", 0.5});
2728
return orca_load_report;
2829
}
2930

@@ -74,7 +75,7 @@ TEST(OrcaParserUtilTest, NativeHttpEncodedHeader) {
7475
absl::StrCat(kHeaderFormatPrefixText,
7576
"cpu_utilization:0.7,application_utilization:0.8,mem_utilization:0.9,"
7677
"rps_fractional:1000,eps:2,"
77-
"named_metrics.foo:123,named_metrics.bar:0.2")}};
78+
"named_metrics.foo:123,named_metrics.bar:0.2,utilization.total:0.5")}};
7879
EXPECT_THAT(parseOrcaLoadReportHeaders(headers),
7980
StatusHelpers::IsOkAndHolds(ProtoEq(exampleOrcaLoadReport())));
8081
}
@@ -108,6 +109,15 @@ TEST(OrcaParserUtilTest, NativeHttpEncodedHeaderInfinityMetricValue) {
108109
"infinity.")));
109110
}
110111

112+
TEST(OrcaParserUtilTest, NativeHttpEncodedHeaderNegativeMetricValue) {
113+
Http::TestRequestHeaderMapImpl headers{
114+
{std::string(kEndpointLoadMetricsHeader),
115+
absl::StrCat(kHeaderFormatPrefixText, "cpu_utilization:-1")}};
116+
EXPECT_THAT(parseOrcaLoadReportHeaders(headers),
117+
StatusHelpers::HasStatus(absl::InvalidArgumentError(
118+
"custom backend load metric value(cpu_utilization) cannot be negative.")));
119+
}
120+
111121
TEST(OrcaParserUtilTest, NativeHttpEncodedHeaderContainsDuplicateMetric) {
112122
Http::TestRequestHeaderMapImpl headers{
113123
{std::string(kEndpointLoadMetricsHeader),
@@ -126,6 +136,15 @@ TEST(OrcaParserUtilTest, NativeHttpEncodedHeaderUnsupportedMetric) {
126136
absl::InvalidArgumentError("unsupported metric name: unsupported_metric")));
127137
}
128138

139+
TEST(OrcaParserUtilTest, NativeHttpEncodedHeaderContainsEmptyUtilizationMetricKey) {
140+
Http::TestRequestHeaderMapImpl headers{
141+
{std::string(kEndpointLoadMetricsHeader),
142+
absl::StrCat(kHeaderFormatPrefixText, "utilization.:0.9")}};
143+
EXPECT_THAT(
144+
parseOrcaLoadReportHeaders(headers),
145+
StatusHelpers::HasStatus(absl::InvalidArgumentError("utilization metric key is empty.")));
146+
}
147+
129148
TEST(OrcaParserUtilTest, NativeHttpEncodedHeaderContainsDuplicateNamedMetric) {
130149
Http::TestRequestHeaderMapImpl headers{
131150
{std::string(kEndpointLoadMetricsHeader),
@@ -161,7 +180,8 @@ TEST(OrcaParserUtilTest, JsonHeader) {
161180
absl::StrCat(kHeaderFormatPrefixJson,
162181
"{\"cpu_utilization\": 0.7, \"application_utilization\": 0.8, "
163182
"\"mem_utilization\": 0.9, \"rps_fractional\": 1000, \"eps\": 2, "
164-
"\"named_metrics\": {\"foo\": 123,\"bar\": 0.2}}")}};
183+
"\"named_metrics\": {\"foo\": 123,\"bar\": 0.2}, "
184+
"\"utilization\": {\"total\": 0.5}}")}};
165185
EXPECT_THAT(parseOrcaLoadReportHeaders(headers),
166186
StatusHelpers::IsOkAndHolds(ProtoEq(exampleOrcaLoadReport())));
167187
}

0 commit comments

Comments
 (0)