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