| #include "tlbmc/feed_client_grpc.h" |
| |
| #include <climits> |
| #include <memory> |
| |
| #include "tlbmc/feed_client.pb.h" |
| #include "agent_config_service.grpc.pb.h" |
| #include "data_sink_service.grpc.pb.h" |
| #include "absl/log/log.h" |
| #include "absl/status/status.h" |
| #include "absl/strings/string_view.h" |
| #include "absl/time/clock.h" |
| #include "absl/time/time.h" |
| #include "grpc/grpc.h" |
| #include "grpcpp/client_context.h" |
| #include "grpcpp/security/credentials.h" |
| #include "grpcpp/support/channel_arguments.h" |
| #include "grpcpp/support/status.h" |
| |
| namespace platforms_syshealth::collection::feed { |
| |
| void FeedClientGrpc::InitStubs() { |
| ::grpc::ChannelArguments args; |
| args.SetInt(GRPC_ARG_KEEPALIVE_TIME_MS, INT_MAX); |
| args.SetInt(GRPC_ARG_KEEPALIVE_TIMEOUT_MS, 20 * 1000 /*20 sec*/); |
| args.SetInt(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS, 0); |
| std::shared_ptr<::grpc::Channel> channel = |
| ::grpc::CreateCustomChannel(config_.target_address(), credentials_, args); |
| stub_ = DataSinkService::NewStub(channel); |
| agent_config_stub_ = AgentConfigService::NewStub(channel); |
| dry_run_ = false; |
| } |
| |
| FeedClientGrpc::FeedClientGrpc( |
| const FeedClientConfig& config, |
| const std::shared_ptr<::grpc::ChannelCredentials>& credentials) |
| : config_(config), credentials_(credentials) { |
| if (config_.target_address().empty()) { |
| dry_run_ = true; |
| LOG(WARNING) << "FeedClientGrpc created in dry run mode because " |
| "target_address is not set."; |
| } else { |
| InitStubs(); |
| } |
| } |
| |
| void FeedClientGrpc::SetTargetAddress(absl::string_view target_address) { |
| if (!dry_run_ && target_address == config_.target_address()) { |
| return; |
| } |
| config_.set_target_address(target_address); |
| InitStubs(); |
| } |
| |
| absl::StatusOr<WriteMetricsResponse> FeedClientGrpc::WriteMetrics( |
| const WriteMetricsRequest& request) { |
| if (dry_run_) { |
| LOG(WARNING) << "[Dry Run] Would send WriteMetricsRequest: " << request; |
| return WriteMetricsResponse(); |
| } |
| if (!stub_) { |
| return absl::InternalError("gRPC stub not initialized"); |
| } |
| ::grpc::ClientContext context; |
| context.set_deadline(absl::ToChronoTime( |
| absl::Now() + absl::Seconds(config_.write_metrics_timeout_seconds()))); |
| WriteMetricsResponse response; |
| ::grpc::Status status = stub_->WriteMetrics(&context, request, &response); |
| if (!status.ok()) { |
| return absl::InternalError(status.error_message()); |
| } |
| return response; |
| } |
| |
| absl::StatusOr<GetPoliciesResponse> FeedClientGrpc::GetPolicies( |
| const GetPoliciesRequest& request) { |
| if (dry_run_) { |
| LOG(WARNING) << "[Dry Run] Would send GetPoliciesRequest: " << request; |
| return GetPoliciesResponse(); |
| } |
| if (!agent_config_stub_) { |
| return absl::InternalError("gRPC config stub not initialized"); |
| } |
| ::grpc::ClientContext context; |
| context.set_deadline(absl::ToChronoTime( |
| absl::Now() + absl::Seconds(config_.get_policies_timeout_seconds()))); |
| GetPoliciesResponse response; |
| ::grpc::Status status = |
| agent_config_stub_->GetPolicies(&context, request, &response); |
| if (!status.ok()) { |
| return absl::InternalError(status.error_message()); |
| } |
| return response; |
| } |
| |
| } // namespace platforms_syshealth::collection::feed |