xref: /aosp_15_r20/external/grpc-grpc/test/cpp/util/metrics_server.cc (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker // is % allowed in string
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/metrics_server.h"
20*cc02d7e2SAndroid Build Coastguard Worker 
21*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/log.h>
22*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server.h>
23*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server_builder.h>
24*cc02d7e2SAndroid Build Coastguard Worker 
25*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/gprpp/crash.h"
26*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/testing/metrics.grpc.pb.h"
27*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/testing/metrics.pb.h"
28*cc02d7e2SAndroid Build Coastguard Worker 
29*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
30*cc02d7e2SAndroid Build Coastguard Worker namespace testing {
31*cc02d7e2SAndroid Build Coastguard Worker 
QpsGauge()32*cc02d7e2SAndroid Build Coastguard Worker QpsGauge::QpsGauge()
33*cc02d7e2SAndroid Build Coastguard Worker     : start_time_(gpr_now(GPR_CLOCK_REALTIME)), num_queries_(0) {}
34*cc02d7e2SAndroid Build Coastguard Worker 
Reset()35*cc02d7e2SAndroid Build Coastguard Worker void QpsGauge::Reset() {
36*cc02d7e2SAndroid Build Coastguard Worker   std::lock_guard<std::mutex> lock(num_queries_mu_);
37*cc02d7e2SAndroid Build Coastguard Worker   num_queries_ = 0;
38*cc02d7e2SAndroid Build Coastguard Worker   start_time_ = gpr_now(GPR_CLOCK_REALTIME);
39*cc02d7e2SAndroid Build Coastguard Worker }
40*cc02d7e2SAndroid Build Coastguard Worker 
Incr()41*cc02d7e2SAndroid Build Coastguard Worker void QpsGauge::Incr() {
42*cc02d7e2SAndroid Build Coastguard Worker   std::lock_guard<std::mutex> lock(num_queries_mu_);
43*cc02d7e2SAndroid Build Coastguard Worker   num_queries_++;
44*cc02d7e2SAndroid Build Coastguard Worker }
45*cc02d7e2SAndroid Build Coastguard Worker 
Get()46*cc02d7e2SAndroid Build Coastguard Worker long QpsGauge::Get() {
47*cc02d7e2SAndroid Build Coastguard Worker   std::lock_guard<std::mutex> lock(num_queries_mu_);
48*cc02d7e2SAndroid Build Coastguard Worker   gpr_timespec time_diff =
49*cc02d7e2SAndroid Build Coastguard Worker       gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), start_time_);
50*cc02d7e2SAndroid Build Coastguard Worker   long duration_secs = time_diff.tv_sec > 0 ? time_diff.tv_sec : 1;
51*cc02d7e2SAndroid Build Coastguard Worker   return num_queries_ / duration_secs;
52*cc02d7e2SAndroid Build Coastguard Worker }
53*cc02d7e2SAndroid Build Coastguard Worker 
GetAllGauges(ServerContext *,const EmptyMessage *,ServerWriter<GaugeResponse> * writer)54*cc02d7e2SAndroid Build Coastguard Worker grpc::Status MetricsServiceImpl::GetAllGauges(
55*cc02d7e2SAndroid Build Coastguard Worker     ServerContext* /*context*/, const EmptyMessage* /*request*/,
56*cc02d7e2SAndroid Build Coastguard Worker     ServerWriter<GaugeResponse>* writer) {
57*cc02d7e2SAndroid Build Coastguard Worker   gpr_log(GPR_DEBUG, "GetAllGauges called");
58*cc02d7e2SAndroid Build Coastguard Worker 
59*cc02d7e2SAndroid Build Coastguard Worker   std::lock_guard<std::mutex> lock(mu_);
60*cc02d7e2SAndroid Build Coastguard Worker   for (auto it = qps_gauges_.begin(); it != qps_gauges_.end(); it++) {
61*cc02d7e2SAndroid Build Coastguard Worker     GaugeResponse resp;
62*cc02d7e2SAndroid Build Coastguard Worker     resp.set_name(it->first);                // Gauge name
63*cc02d7e2SAndroid Build Coastguard Worker     resp.set_long_value(it->second->Get());  // Gauge value
64*cc02d7e2SAndroid Build Coastguard Worker     writer->Write(resp);
65*cc02d7e2SAndroid Build Coastguard Worker   }
66*cc02d7e2SAndroid Build Coastguard Worker 
67*cc02d7e2SAndroid Build Coastguard Worker   return Status::OK;
68*cc02d7e2SAndroid Build Coastguard Worker }
69*cc02d7e2SAndroid Build Coastguard Worker 
GetGauge(ServerContext *,const GaugeRequest * request,GaugeResponse * response)70*cc02d7e2SAndroid Build Coastguard Worker grpc::Status MetricsServiceImpl::GetGauge(ServerContext* /*context*/,
71*cc02d7e2SAndroid Build Coastguard Worker                                           const GaugeRequest* request,
72*cc02d7e2SAndroid Build Coastguard Worker                                           GaugeResponse* response) {
73*cc02d7e2SAndroid Build Coastguard Worker   std::lock_guard<std::mutex> lock(mu_);
74*cc02d7e2SAndroid Build Coastguard Worker 
75*cc02d7e2SAndroid Build Coastguard Worker   const auto it = qps_gauges_.find(request->name());
76*cc02d7e2SAndroid Build Coastguard Worker   if (it != qps_gauges_.end()) {
77*cc02d7e2SAndroid Build Coastguard Worker     response->set_name(it->first);
78*cc02d7e2SAndroid Build Coastguard Worker     response->set_long_value(it->second->Get());
79*cc02d7e2SAndroid Build Coastguard Worker   }
80*cc02d7e2SAndroid Build Coastguard Worker 
81*cc02d7e2SAndroid Build Coastguard Worker   return Status::OK;
82*cc02d7e2SAndroid Build Coastguard Worker }
83*cc02d7e2SAndroid Build Coastguard Worker 
CreateQpsGauge(const std::string & name,bool * already_present)84*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<QpsGauge> MetricsServiceImpl::CreateQpsGauge(
85*cc02d7e2SAndroid Build Coastguard Worker     const std::string& name, bool* already_present) {
86*cc02d7e2SAndroid Build Coastguard Worker   std::lock_guard<std::mutex> lock(mu_);
87*cc02d7e2SAndroid Build Coastguard Worker 
88*cc02d7e2SAndroid Build Coastguard Worker   std::shared_ptr<QpsGauge> qps_gauge(new QpsGauge());
89*cc02d7e2SAndroid Build Coastguard Worker   const auto p = qps_gauges_.insert(std::make_pair(name, qps_gauge));
90*cc02d7e2SAndroid Build Coastguard Worker 
91*cc02d7e2SAndroid Build Coastguard Worker   // p.first is an iterator pointing to <name, shared_ptr<QpsGauge>> pair.
92*cc02d7e2SAndroid Build Coastguard Worker   // p.second is a boolean which is set to 'true' if the QpsGauge is
93*cc02d7e2SAndroid Build Coastguard Worker   // successfully inserted in the guages_ map and 'false' if it is already
94*cc02d7e2SAndroid Build Coastguard Worker   // present in the map
95*cc02d7e2SAndroid Build Coastguard Worker   *already_present = !p.second;
96*cc02d7e2SAndroid Build Coastguard Worker   return p.first->second;
97*cc02d7e2SAndroid Build Coastguard Worker }
98*cc02d7e2SAndroid Build Coastguard Worker 
99*cc02d7e2SAndroid Build Coastguard Worker // Starts the metrics server and returns the grpc::Server instance. Call Wait()
100*cc02d7e2SAndroid Build Coastguard Worker // on the returned server instance.
StartServer(int port)101*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<grpc::Server> MetricsServiceImpl::StartServer(int port) {
102*cc02d7e2SAndroid Build Coastguard Worker   gpr_log(GPR_INFO, "Building metrics server..");
103*cc02d7e2SAndroid Build Coastguard Worker 
104*cc02d7e2SAndroid Build Coastguard Worker   const std::string address = "0.0.0.0:" + std::to_string(port);
105*cc02d7e2SAndroid Build Coastguard Worker 
106*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder builder;
107*cc02d7e2SAndroid Build Coastguard Worker   builder.AddListeningPort(address, grpc::InsecureServerCredentials());
108*cc02d7e2SAndroid Build Coastguard Worker   builder.RegisterService(this);
109*cc02d7e2SAndroid Build Coastguard Worker 
110*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
111*cc02d7e2SAndroid Build Coastguard Worker   gpr_log(GPR_INFO, "Metrics server %s started. Ready to receive requests..",
112*cc02d7e2SAndroid Build Coastguard Worker           address.c_str());
113*cc02d7e2SAndroid Build Coastguard Worker 
114*cc02d7e2SAndroid Build Coastguard Worker   return server;
115*cc02d7e2SAndroid Build Coastguard Worker }
116*cc02d7e2SAndroid Build Coastguard Worker 
117*cc02d7e2SAndroid Build Coastguard Worker }  // namespace testing
118*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
119