Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

server: introduce ServerMetricRecorder API and move per-call reporting from a C++ interceptor to a C-core filter #32106

Merged
merged 44 commits into from
Feb 1, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
e0b7519
backend metric sampling
yousukseung Jan 13, 2023
4147529
Comments addressed.
yousukseung Jan 19, 2023
8d0e1bf
Merge branch 'master' into test
yousukseung Jan 20, 2023
29b4da6
More comments addressed.
yousukseung Jan 20, 2023
46913b8
Pushing changes left behind locally.
yousukseung Jan 20, 2023
122e975
Removed empty lines
yousukseung Jan 20, 2023
a3099bd
Update OrcaService to use ServerMetricRecorder (no named metrics yet)
yousukseung Jan 21, 2023
d75e814
Comments addressed.
yousukseung Jan 21, 2023
816a8af
More comments addressed
yousukseung Jan 21, 2023
7855ea4
More comments addressed.
yousukseung Jan 21, 2023
1448113
Comments fixed
yousukseung Jan 24, 2023
0ca1a8b
Merge branch 'backend_metric_sampling' into merged
yousukseung Jan 24, 2023
8ac753f
Merge remote-tracking branch 'upstream/master' into backend_metric_sa…
yousukseung Jan 25, 2023
4221d88
Comments addressed.
yousukseung Jan 25, 2023
eca48d4
Test fixed
yousukseung Jan 26, 2023
604df1b
make seq returned always up-to-date
yousukseung Jan 26, 2023
0da8bfe
skip atomic load when not cached
yousukseung Jan 26, 2023
8f586e7
Fixed ABSL_GUARDED_BY
yousukseung Jan 26, 2023
d0ce562
Comments addressed except client_lb_end2end_test
yousukseung Jan 27, 2023
bfc0dc0
test updated
yousukseung Jan 27, 2023
2367bf6
Comments addressed
yousukseung Jan 29, 2023
b471024
BUILD fix.
yousukseung Jan 30, 2023
5669e86
BackendMetricDataState moved to a separate header
yousukseung Jan 30, 2023
33aa915
comments addressed
yousukseung Jan 30, 2023
dddc849
Fixed clang and buildifier errors
yousukseung Jan 30, 2023
d58771f
More sanity check errors fixed.
yousukseung Jan 30, 2023
4c2c860
Merge remote-tracking branch 'upstream/master' into backend_metric_sa…
yousukseung Jan 30, 2023
90f6ec6
Fixed xds tests
yousukseung Jan 30, 2023
c21d62a
Ran generate_projects.sh
yousukseung Jan 30, 2023
a286a88
Comments addressed
yousukseung Jan 31, 2023
42be5de
comments addressed.
yousukseung Jan 31, 2023
c327577
Merge remote-tracking branch 'upstream/master' into backend_metric_sa…
yousukseung Jan 31, 2023
63afafb
generate project
yousukseung Jan 31, 2023
cc228d1
Build fixed
yousukseung Jan 31, 2023
886494d
generate project
yousukseung Jan 31, 2023
2b8e52e
sanity check errors fixed
yousukseung Jan 31, 2023
e22b336
test fixed
yousukseung Jan 31, 2023
21d8bf4
Backup poller period override moved to main()
yousukseung Jan 31, 2023
198eeba
Also move cfstream override
yousukseung Jan 31, 2023
7616eb2
Clang fixes, sanitize
yousukseung Feb 1, 2023
d96d88b
Merge remote-tracking branch 'upstream/master' into backend_metric_sa…
yousukseung Feb 1, 2023
a1b77c5
generate_projects.sh
yousukseung Feb 1, 2023
4632a63
portable print format fix
yousukseung Feb 1, 2023
35c9dc0
Removed outdated comment
yousukseung Feb 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 11 additions & 5 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -1783,7 +1783,7 @@ grpc_cc_library(
"grpc_service_config_impl",
"grpc_trace",
"grpcpp_call_metric_recorder",
"grpcpp_server_metric_recorder",
"grpcpp_backend_metric_recorder",
"grpcpp_status",
"iomgr_timer",
"ref_counted_ptr",
Expand Down Expand Up @@ -1853,7 +1853,7 @@ grpc_cc_library(
"grpc_trace",
"grpc_unsecure",
"grpcpp_call_metric_recorder",
"grpcpp_server_metric_recorder",
"grpcpp_backend_metric_recorder",
"grpcpp_status",
"iomgr_timer",
"ref_counted_ptr",
Expand Down Expand Up @@ -1962,9 +1962,12 @@ grpc_cc_library(
)

grpc_cc_library(
name = "grpcpp_server_metric_recorder",
name = "grpcpp_backend_metric_recorder",
srcs = [
"src/cpp/server/orca/server_metric_recorder.cc",
"src/cpp/server/orca/backend_metric_recorder.cc",
markdroth marked this conversation as resolved.
Show resolved Hide resolved
],
hdrs = [
"src/cpp/server/backend_metric_recorder.h"
],
language = "c++",
public_hdrs = [
Expand All @@ -1973,8 +1976,11 @@ grpc_cc_library(
visibility = ["@grpc:public"],
deps = [
"gpr",
"grpcpp_call_metric_recorder",
"grpc++_public_hdrs",
"grpc_trace",
"//src/core:grpc_backend_metric_data",
"//src/core:grpc_backend_metric_provider",
],
)

Expand All @@ -2000,7 +2006,7 @@ grpc_cc_library(
"gpr",
"grpc++",
"grpc_base",
"grpcpp_server_metric_recorder",
"grpcpp_backend_metric_recorder",
"protobuf_duration_upb",
"ref_counted_ptr",
"xds_orca_service_upb",
Expand Down
14 changes: 11 additions & 3 deletions include/grpcpp/ext/orca_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ namespace experimental {
// utilization metrics to clients.
class OrcaService : public Service {
public:
OrcaService() = delete;
markdroth marked this conversation as resolved.
Show resolved Hide resolved

struct Options {
// Minimum report interval. If a client requests an interval lower
// than this value, this value will be used instead.
Expand All @@ -49,16 +51,22 @@ class OrcaService : public Service {
}
};

OrcaService(const ServerMetricRecorder& server_metric_recorder,
// ServerMetricRecorder is required.
OrcaService(ServerMetricRecorder* const server_metric_recorder,
Options options);

private:
class Reactor;

Slice CreateSerializedResponse();
Slice GetOrCreateSerializedResponse();

const ServerMetricRecorder& server_metric_recorder_;
const ServerMetricRecorder* const server_metric_recorder_;
const absl::Duration min_report_duration_;
grpc::internal::Mutex mu_;
// Contains the last serialized metrics from server_metric_recorder_.
absl::optional<Slice> response_slice_ ABSL_GUARDED_BY(&mu_);
// The update sequence number of metrics serialized in response_slice_.
uint64_t response_slice_seq_ ABSL_GUARDED_BY(&mu_);
};

} // namespace experimental
Expand Down
23 changes: 21 additions & 2 deletions include/grpcpp/ext/server_metric_recorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,15 @@
#define GRPCPP_EXT_SERVER_METRIC_RECORDER_H

#include <atomic>
#include <map>
#include <memory>
#include <string>

#include "absl/strings/string_view.h"
#include "absl/types/optional.h"

#include <grpcpp/impl/sync.h>

namespace grpc_core {
struct BackendMetricData;
} // namespace grpc_core
Expand Down Expand Up @@ -54,26 +57,42 @@ class ServerMetricRecorder {
/// Values outside of the valid range are rejected.
/// Overrides the stored value when called again with a valid value.
void SetQps(double value);
/// Records a named resource utilization value in the range [0, 1].
/// Values outside of the valid range are rejected. Consumes `name`.
markdroth marked this conversation as resolved.
Show resolved Hide resolved
/// Overrides the stored value when called again with the same name.
void SetNamedUtilization(std::string name, double value);
/// Replaces all named resource utilization values. Consumes
markdroth marked this conversation as resolved.
Show resolved Hide resolved
/// `named_utilization`. No range validation.
void SetAllNamedUtilization(std::map<std::string, double> named_utilization);

/// Clears the server CPU utilization if recorded.
void ClearCpuUtilization();
/// Clears the server memory utilization if recorded.
void ClearMemoryUtilization();
/// Clears number of queries per second to the server if recorded.
void ClearQps();
/// Clears a named utilization value if exists.
void ClearNamedUtilization(absl::string_view name);

private:
// To access GetMetrics().
friend class grpc::BackendMetricState;
friend class OrcaService;

// Only populates fields in `data` that this has recorded metrics.
grpc_core::BackendMetricData GetMetrics() const;
// Returns a pair of backend metrics recorded and the update sequence number.
// Returned metrics are guaranteed to be identical between two calls if the
// update sequences are identical.
std::pair<grpc_core::BackendMetricData, uint64_t> GetMetrics() const;

// Incremented every time updated.
std::atomic<uint64_t> update_seq_{0};

// Defaults to -1.0 (unset).
std::atomic<double> cpu_utilization_{-1.0};
std::atomic<double> mem_utilization_{-1.0};
std::atomic<double> qps_{-1.0};
mutable grpc::internal::Mutex mu_;
std::map<std::string, double> named_utilization_ ABSL_GUARDED_BY(mu_);
};

} // namespace experimental
Expand Down
17 changes: 8 additions & 9 deletions src/core/ext/filters/backend_metrics/backend_metric_filter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -92,17 +92,16 @@ ArenaPromise<ServerMetadataHandle> BackendMetricFilter::MakeCallPromise(
}));
}

static bool maybe_prepend_grpc_backend_metric_filter(
grpc_core::ChannelStackBuilder* builder) {
if (builder->channel_args().Contains(GRPC_ARG_SERVER_CALL_METRIC_RECORDING)) {
builder->PrependFilter(&grpc_core::BackendMetricFilter::kFilter);
}
return true;
}

void RegisterBackendMetricFilter(CoreConfiguration::Builder* builder) {
builder->channel_init()->RegisterStage(
GRPC_SERVER_CHANNEL, INT_MAX, maybe_prepend_grpc_backend_metric_filter);
GRPC_SERVER_CHANNEL, INT_MAX,
[](grpc_core::ChannelStackBuilder* builder) {
if (builder->channel_args().Contains(
GRPC_ARG_SERVER_CALL_METRIC_RECORDING)) {
builder->PrependFilter(&grpc_core::BackendMetricFilter::kFilter);
}
return true;
});
}

} // namespace grpc_core
46 changes: 46 additions & 0 deletions src/cpp/server/backend_metric_recorder.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#ifndef LOCAL_GOOGLE_HOME_YSSEUNG_WORK_GRPC_GIT_GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H_
#define LOCAL_GOOGLE_HOME_YSSEUNG_WORK_GRPC_GIT_GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H_

#include <map>

#include <grpcpp/ext/call_metric_recorder.h>

#include "src/core/ext/filters/backend_metrics/backend_metric_provider.h"

namespace grpc {

class BackendMetricState : public grpc_core::BackendMetricProvider,
public experimental::CallMetricRecorder {
public:
// `server_metric_recorder` is optional. When set, GetBackendMetricData()
// merges metrics from `server_metric_recorder` with metrics recorded to this.
explicit BackendMetricState(
experimental::ServerMetricRecorder* server_metric_recorder)
: server_metric_recorder_(server_metric_recorder) {}
~BackendMetricState() override = default;
markdroth marked this conversation as resolved.
Show resolved Hide resolved
experimental::CallMetricRecorder& RecordCpuUtilizationMetric(
double value) override;
experimental::CallMetricRecorder& RecordMemoryUtilizationMetric(
double value) override;
experimental::CallMetricRecorder& RecordQpsMetric(double value) override;
experimental::CallMetricRecorder& RecordUtilizationMetric(
string_ref name, double value) override;
experimental::CallMetricRecorder& RecordRequestCostMetric(
string_ref name, double value) override;

private:
// This clears metrics currently recorded. Don't call twice.
grpc_core::BackendMetricData GetBackendMetricData() override;
markdroth marked this conversation as resolved.
Show resolved Hide resolved

experimental::ServerMetricRecorder* server_metric_recorder_;
std::atomic<double> cpu_utilization_{-1.0};
std::atomic<double> mem_utilization_{-1.0};
std::atomic<double> qps_{-1.0};
internal::Mutex mu_;
std::map<absl::string_view, double> utilization_ ABSL_GUARDED_BY(mu_);
std::map<absl::string_view, double> request_cost_ ABSL_GUARDED_BY(mu_);
};

} // namespace grpc

#endif // LOCAL_GOOGLE_HOME_YSSEUNG_WORK_GRPC_GIT_GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H_