blob: 2e16ec2026cdf4ef97d11431742db9ee126134c6 [file] [log] [blame]
#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