blob: b93b54bb6460be034aff459e82816833a7653669 [file] [log] [blame]
//
//
// Copyright 2023 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
#ifndef GRPCPP_EXT_SERVER_METRIC_RECORDER_H
#define GRPCPP_EXT_SERVER_METRIC_RECORDER_H
#include <functional>
#include <map>
#include <memory>
#include <grpcpp/impl/sync.h>
#include <grpcpp/support/string_ref.h>
namespace grpc_core {
struct BackendMetricData;
} // namespace grpc_core
namespace grpc {
class BackendMetricState;
namespace experimental {
/// Records server wide metrics to be reported to the client.
/// Server implementation creates an instance and reports server metrics to it,
/// and then passes it to
/// ServerBuilder::experimental_type::EnableCallMetricRecording or
/// experimental::OrcaService that read metrics to include in the report.
class ServerMetricRecorder {
public:
// Factory method. Use this to create.
static std::unique_ptr<ServerMetricRecorder> Create();
/// Records the server CPU utilization in the range [0, infy).
/// Values may be larger than 1.0 when the usage exceeds the reporter
/// dependent notion of soft limits. Values outside of the valid range are
/// rejected. Overrides the stored value when called again with a valid value.
void SetCpuUtilization(double value);
/// Records the server memory utilization in the range [0, 1].
/// Values outside of the valid range are rejected.
/// Overrides the stored value when called again with a valid value.
void SetMemoryUtilization(double value);
/// Records number of queries per second to the server in the range [0, infy).
/// Values outside of the valid range are rejected.
/// Overrides the stored value when called again with a valid value.
void SetQps(double value);
/// Records number of errors per second to the server in the range [0, infy).
/// Values outside of the valid range are rejected.
/// Overrides the stored value when called again with a valid value.
void SetEps(double value);
/// Records a named resource utilization value in the range [0, 1].
/// Values outside of the valid range are rejected.
/// Overrides the stored value when called again with the same name.
/// The name string should remain valid while this utilization remains
/// in this recorder. It is assumed that strings are common names that are
/// global constants.
void SetNamedUtilization(string_ref name, double value);
/// Replaces all named resource utilization values. No range validation.
/// The name strings should remain valid while utilization values remain
/// in this recorder. It is assumed that strings are common names that are
/// global constants.
void SetAllNamedUtilization(std::map<string_ref, 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 number of errors per second to the server if recorded.
void ClearEps();
/// Clears a named utilization value if exists.
void ClearNamedUtilization(string_ref name);
private:
// To access GetMetrics().
friend class grpc::BackendMetricState;
friend class OrcaService;
struct BackendMetricDataState;
// No direct creation, use the factory method Create() above.
ServerMetricRecorder();
// Updates the metric state by applying `updater` to the data and incrementing
// the sequence number.
void UpdateBackendMetricDataState(
std::function<void(grpc_core::BackendMetricData*)> updater);
grpc_core::BackendMetricData GetMetrics() const;
// Returned metric data is guaranteed to be identical between two calls if the
// sequence numbers match.
std::shared_ptr<const BackendMetricDataState> GetMetricsIfChanged() const;
mutable grpc::internal::Mutex mu_;
std::shared_ptr<const BackendMetricDataState> metric_state_
ABSL_GUARDED_BY(mu_);
};
} // namespace experimental
} // namespace grpc
#endif // GRPCPP_EXT_SERVER_METRIC_RECORDER_H