blob: 05d566cf279b37df31f288d6268db98cebe2ea89 [file] [log] [blame]
//
// Copyright 2022 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef GRPC_SRC_CPP_EXT_GCP_OBSERVABILITY_CONFIG_H
#define GRPC_SRC_CPP_EXT_GCP_OBSERVABILITY_CONFIG_H
#include <grpc/support/port_platform.h>
#include <stdint.h>
#include <map>
#include <string>
#include <vector>
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/lib/gprpp/validation_errors.h"
#include "src/core/lib/json/json.h"
#include "src/core/lib/json/json_args.h"
#include "src/core/lib/json/json_object_loader.h"
namespace grpc {
namespace internal {
struct GcpObservabilityConfig {
struct CloudLogging {
struct RpcEventConfiguration {
struct ParsedMethod {
absl::string_view service; // backed by methods
absl::string_view method; // backed by methods
};
std::vector<std::string> qualified_methods;
std::vector<ParsedMethod> parsed_methods;
bool exclude = false;
uint32_t max_metadata_bytes = 0;
uint32_t max_message_bytes = 0;
static const grpc_core::JsonLoaderInterface* JsonLoader(
const grpc_core::JsonArgs&);
void JsonPostLoad(const grpc_core::Json& json,
const grpc_core::JsonArgs& args,
grpc_core::ValidationErrors* errors);
};
std::vector<RpcEventConfiguration> client_rpc_events;
std::vector<RpcEventConfiguration> server_rpc_events;
static const grpc_core::JsonLoaderInterface* JsonLoader(
const grpc_core::JsonArgs&) {
static const auto* loader =
grpc_core::JsonObjectLoader<CloudLogging>()
.OptionalField("client_rpc_events",
&CloudLogging::client_rpc_events)
.OptionalField("server_rpc_events",
&CloudLogging::server_rpc_events)
.Finish();
return loader;
}
};
struct CloudMonitoring {
static const grpc_core::JsonLoaderInterface* JsonLoader(
const grpc_core::JsonArgs&) {
static const auto* loader =
grpc_core::JsonObjectLoader<CloudMonitoring>().Finish();
return loader;
}
};
struct CloudTrace {
CloudTrace() : sampling_rate(0) {}
float sampling_rate;
static const grpc_core::JsonLoaderInterface* JsonLoader(
const grpc_core::JsonArgs&) {
static const auto* loader =
grpc_core::JsonObjectLoader<CloudTrace>()
.OptionalField("sampling_rate", &CloudTrace::sampling_rate)
.Finish();
return loader;
}
};
absl::optional<CloudLogging> cloud_logging;
absl::optional<CloudMonitoring> cloud_monitoring;
absl::optional<CloudTrace> cloud_trace;
std::string project_id;
std::map<std::string, std::string> labels;
static const grpc_core::JsonLoaderInterface* JsonLoader(
const grpc_core::JsonArgs&) {
static const auto* loader =
grpc_core::JsonObjectLoader<GcpObservabilityConfig>()
.OptionalField("cloud_logging",
&GcpObservabilityConfig::cloud_logging)
.OptionalField("cloud_monitoring",
&GcpObservabilityConfig::cloud_monitoring)
.OptionalField("cloud_trace", &GcpObservabilityConfig::cloud_trace)
.OptionalField("project_id", &GcpObservabilityConfig::project_id)
.OptionalField("labels", &GcpObservabilityConfig::labels)
.Finish();
return loader;
}
// Tries to load the contents of GcpObservabilityConfig from the file located
// by the value of environment variable `GRPC_GCP_OBSERVABILITY_CONFIG_FILE`.
// If `GRPC_GCP_OBSERVABILITY_CONFIG_FILE` is unset, falls back to
// `GRPC_GCP_OBSERVABILITY_CONFIG`.
static absl::StatusOr<GcpObservabilityConfig> ReadFromEnv();
};
} // namespace internal
} // namespace grpc
#endif // GRPC_SRC_CPP_EXT_GCP_OBSERVABILITY_CONFIG_H