xref: /aosp_15_r20/external/grpc-grpc/examples/cpp/orca/README.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker# gRPC Custom Metrics Example
2*cc02d7e2SAndroid Build Coastguard Worker
3*cc02d7e2SAndroid Build Coastguard WorkerYou can find a complete set of instructions for building gRPC and running the
4*cc02d7e2SAndroid Build Coastguard Workerexamples in the [C++ Quick Start][].
5*cc02d7e2SAndroid Build Coastguard Worker
6*cc02d7e2SAndroid Build Coastguard WorkerThis example shows how to implement a server that provides custom metrics usable
7*cc02d7e2SAndroid Build Coastguard Workerby custom load balancing policies.
8*cc02d7e2SAndroid Build Coastguard Worker
9*cc02d7e2SAndroid Build Coastguard WorkerServer needs to be setup with metrics recorder and Orca service for sending
10*cc02d7e2SAndroid Build Coastguard Workerthese metrics to a client:
11*cc02d7e2SAndroid Build Coastguard Worker
12*cc02d7e2SAndroid Build Coastguard Worker```c++
13*cc02d7e2SAndroid Build Coastguard WorkerGreeterServiceImpl service;
14*cc02d7e2SAndroid Build Coastguard Worker// Setup custom metrics recording
15*cc02d7e2SAndroid Build Coastguard Workerauto server_metric_recorder =
16*cc02d7e2SAndroid Build Coastguard Worker    grpc::experimental::ServerMetricRecorder::Create();
17*cc02d7e2SAndroid Build Coastguard Workergrpc::experimental::OrcaService orca_service(
18*cc02d7e2SAndroid Build Coastguard Worker    server_metric_recorder.get(),
19*cc02d7e2SAndroid Build Coastguard Worker    grpc::experimental::OrcaService::Options().set_min_report_duration(
20*cc02d7e2SAndroid Build Coastguard Worker        absl::Seconds(0.1)));
21*cc02d7e2SAndroid Build Coastguard Workerbuilder.RegisterService(&orca_service);
22*cc02d7e2SAndroid Build Coastguard Workergrpc::ServerBuilder::experimental_type(&builder).EnableCallMetricRecording(
23*cc02d7e2SAndroid Build Coastguard Worker    nullptr);
24*cc02d7e2SAndroid Build Coastguard Worker```
25*cc02d7e2SAndroid Build Coastguard Worker
26*cc02d7e2SAndroid Build Coastguard WorkerAfterwards per-request metrics can be reported from the gRPC service
27*cc02d7e2SAndroid Build Coastguard Workerimplementation using the metric recorder from the request context:
28*cc02d7e2SAndroid Build Coastguard Worker
29*cc02d7e2SAndroid Build Coastguard Worker```c++
30*cc02d7e2SAndroid Build Coastguard Workerauto recorder = context->ExperimentalGetCallMetricRecorder();
31*cc02d7e2SAndroid Build Coastguard Workerif (recorder == nullptr) {
32*cc02d7e2SAndroid Build Coastguard Worker  return Status(grpc::StatusCode::INTERNAL,
33*cc02d7e2SAndroid Build Coastguard Worker                "Unable to access metrics recorder. Make sure "
34*cc02d7e2SAndroid Build Coastguard Worker                "EnableCallMetricRecording had been called.");
35*cc02d7e2SAndroid Build Coastguard Worker}
36*cc02d7e2SAndroid Build Coastguard Workerrecorder->RecordCpuUtilizationMetric(0.5);
37*cc02d7e2SAndroid Build Coastguard Worker```
38*cc02d7e2SAndroid Build Coastguard Worker
39*cc02d7e2SAndroid Build Coastguard WorkerOut of band metrics can be reported using the `server_metric_recorder`
40*cc02d7e2SAndroid Build Coastguard Workerdirectly:
41*cc02d7e2SAndroid Build Coastguard Worker
42*cc02d7e2SAndroid Build Coastguard Worker```c++
43*cc02d7e2SAndroid Build Coastguard Workerserver_metric_recorder->SetCpuUtilization(0.75);
44*cc02d7e2SAndroid Build Coastguard Worker```
45*cc02d7e2SAndroid Build Coastguard Worker
46*cc02d7e2SAndroid Build Coastguard Worker[C++ Quick Start]: https://grpc.io/docs/languages/cpp/quickstart
47