GcpObservabilityConfig: Fall-back to GCP environment variables (#31022)

pull/31054/head
Yash Tibrewal 2 years ago committed by GitHub
parent 6098202c09
commit 27e5b4e187
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 36
      src/cpp/ext/gcp/observability_config.cc
  2. 51
      test/cpp/ext/gcp/observability_config_test.cc

@ -71,6 +71,27 @@ absl::StatusOr<std::string> GetGcpObservabilityConfigContents() {
"not defined");
}
// Tries to get the GCP Project ID from environment variables, or returns an
// empty string if not found.
std::string GetProjectIdFromGcpEnvVar() {
// First check GCP_PROEJCT
absl::optional<std::string> project_id = grpc_core::GetEnv("GCP_PROJECT");
if (project_id.has_value() && !project_id->empty()) {
return project_id.value();
}
// Next, try GCLOUD_PROJECT
project_id = grpc_core::GetEnv("GCLOUD_PROJECT");
if (project_id.has_value() && !project_id->empty()) {
return project_id.value();
}
// Lastly, try GOOGLE_CLOUD_PROJECT
project_id = grpc_core::GetEnv("GOOGLE_CLOUD_PROJECT");
if (project_id.has_value() && !project_id->empty()) {
return project_id.value();
}
return "";
}
} // namespace
absl::StatusOr<GcpObservabilityConfig> GcpObservabilityConfig::ReadFromEnv() {
@ -82,7 +103,20 @@ absl::StatusOr<GcpObservabilityConfig> GcpObservabilityConfig::ReadFromEnv() {
if (!config_json.ok()) {
return config_json.status();
}
return grpc_core::LoadFromJson<GcpObservabilityConfig>(*config_json);
auto config = grpc_core::LoadFromJson<GcpObservabilityConfig>(*config_json);
if (!config.ok()) {
return config.status();
}
if (config->project_id.empty()) {
// Get project ID from GCP environment variables since project ID was not
// set it in the GCP observability config.
config->project_id = GetProjectIdFromGcpEnvVar();
if (config->project_id.empty()) {
// Could not find project ID from GCP environment variables either.
return absl::FailedPreconditionError("GCP Project ID not found.");
}
}
return config;
}
} // namespace internal

@ -21,6 +21,7 @@
#include <grpc/support/alloc.h>
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gpr/tmpfile.h"
#include "src/core/lib/gprpp/env.h"
#include "test/core/util/test_config.h"
@ -93,6 +94,56 @@ TEST(GcpEnvParsingTest, ConfigFileDoesNotExist) {
grpc_core::UnsetEnv("GRPC_OBSERVABILITY_CONFIG_FILE");
}
TEST(GcpEnvParsingTest, ProjectIdNotSet) {
grpc_core::SetEnv("GRPC_OBSERVABILITY_CONFIG", "{}");
auto config = GcpObservabilityConfig::ReadFromEnv();
EXPECT_EQ(config.status(),
absl::FailedPreconditionError("GCP Project ID not found."));
grpc_core::UnsetEnv("GRPC_OBSERVABILITY_CONFIG");
grpc_core::CoreConfiguration::Reset();
}
TEST(GcpEnvParsingTest, ProjectIdFromGcpProjectEnvVar) {
grpc_core::SetEnv("GRPC_OBSERVABILITY_CONFIG", "{}");
grpc_core::SetEnv("GCP_PROJECT", "gcp_project");
auto config = GcpObservabilityConfig::ReadFromEnv();
EXPECT_TRUE(config.ok());
EXPECT_EQ(config->project_id, "gcp_project");
grpc_core::UnsetEnv("GCP_PROJECT");
grpc_core::UnsetEnv("GRPC_OBSERVABILITY_CONFIG");
grpc_core::CoreConfiguration::Reset();
}
TEST(GcpEnvParsingTest, ProjectIdFromGcloudProjectEnvVar) {
grpc_core::SetEnv("GRPC_OBSERVABILITY_CONFIG", "{}");
grpc_core::SetEnv("GCLOUD_PROJECT", "gcloud_project");
auto config = GcpObservabilityConfig::ReadFromEnv();
EXPECT_TRUE(config.ok());
EXPECT_EQ(config->project_id, "gcloud_project");
grpc_core::UnsetEnv("GCLOUD_PROJECT");
grpc_core::UnsetEnv("GRPC_OBSERVABILITY_CONFIG");
grpc_core::CoreConfiguration::Reset();
}
TEST(GcpEnvParsingTest, ProjectIdFromGoogleCloudProjectEnvVar) {
grpc_core::SetEnv("GRPC_OBSERVABILITY_CONFIG", "{}");
grpc_core::SetEnv("GOOGLE_CLOUD_PROJECT", "google_cloud_project");
auto config = GcpObservabilityConfig::ReadFromEnv();
EXPECT_TRUE(config.ok());
EXPECT_EQ(config->project_id, "google_cloud_project");
grpc_core::UnsetEnv("GOOGLE_CLOUD_PROJECT");
grpc_core::UnsetEnv("GRPC_OBSERVABILITY_CONFIG");
grpc_core::CoreConfiguration::Reset();
}
class EnvParsingTestType {
public:
enum class ConfigSource {

Loading…
Cancel
Save