Skip to content

Commit 39d87d4

Browse files
authored
feat(generator): add "generator" to API client header "gccl" semver (#7383)
1. Strip the leading "v" from the value of the "gccl" component in the `X-Goog-Api-Client` header so that what remains is a valid semantic version string (see https://semver.org/). 2. Add a "generator" build identifier to the "gccl" semver for requests sent from generated clients. The upshot is that the library-version component of the client header will be "gccl/<major>.<minor>.<patch>+<git-hash>.generator", allowing us to identify requests from generated clients.
1 parent 5a7ead9 commit 39d87d4

14 files changed

+50
-22
lines changed

generator/integration_tests/golden/internal/golden_kitchen_sink_metadata_decorator.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ inline namespace GOOGLE_CLOUD_CPP_GENERATED_NS {
3030
GoldenKitchenSinkMetadata::GoldenKitchenSinkMetadata(
3131
std::shared_ptr<GoldenKitchenSinkStub> child)
3232
: child_(std::move(child)),
33-
api_client_header_(google::cloud::internal::ApiClientHeader()) {}
33+
api_client_header_(google::cloud::internal::ApiClientHeader("generator")) {}
3434

3535
StatusOr<google::test::admin::database::v1::GenerateAccessTokenResponse>
3636
GoldenKitchenSinkMetadata::GenerateAccessToken(

generator/integration_tests/golden/internal/golden_thing_admin_metadata_decorator.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ inline namespace GOOGLE_CLOUD_CPP_GENERATED_NS {
3030
GoldenThingAdminMetadata::GoldenThingAdminMetadata(
3131
std::shared_ptr<GoldenThingAdminStub> child)
3232
: child_(std::move(child)),
33-
api_client_header_(google::cloud::internal::ApiClientHeader()) {}
33+
api_client_header_(google::cloud::internal::ApiClientHeader("generator")) {}
3434

3535
StatusOr<google::test::admin::database::v1::ListDatabasesResponse>
3636
GoldenThingAdminMetadata::ListDatabases(

generator/integration_tests/golden/tests/golden_kitchen_sink_metadata_decorator_test.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ using ::testing::Return;
3939
class MetadataDecoratorTest : public ::testing::Test {
4040
protected:
4141
void SetUp() override {
42-
expected_api_client_header_ = google::cloud::internal::ApiClientHeader();
42+
expected_api_client_header_ =
43+
google::cloud::internal::ApiClientHeader("generator");
4344
mock_ = std::make_shared<MockGoldenKitchenSinkStub>();
4445
}
4546

generator/integration_tests/golden/tests/golden_thing_admin_metadata_decorator_test.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ using ::google::cloud::testing_util::IsContextMDValid;
3232
class MetadataDecoratorTest : public ::testing::Test {
3333
protected:
3434
void SetUp() override {
35-
expected_api_client_header_ = google::cloud::internal::ApiClientHeader();
35+
expected_api_client_header_ =
36+
google::cloud::internal::ApiClientHeader("generator");
3637
mock_ = std::make_shared<MockGoldenThingAdminStub>();
3738
}
3839

generator/internal/metadata_decorator_generator.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ Status MetadataDecoratorGenerator::GenerateCc() {
155155
"$metadata_class_name$::$metadata_class_name$(\n"
156156
" std::shared_ptr<$stub_class_name$> child)\n"
157157
" : child_(std::move(child)),\n"
158-
" api_client_header_(google::cloud::internal::ApiClientHeader()) {}\n"
158+
" api_client_header_(google::cloud::internal::ApiClientHeader(\"generator\")) {}\n"
159159
"\n");
160160
// clang-format on
161161

google/cloud/bigquery/internal/bigquery_read_metadata_decorator.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ inline namespace GOOGLE_CLOUD_CPP_GENERATED_NS {
3030
BigQueryReadMetadata::BigQueryReadMetadata(
3131
std::shared_ptr<BigQueryReadStub> child)
3232
: child_(std::move(child)),
33-
api_client_header_(google::cloud::internal::ApiClientHeader()) {}
33+
api_client_header_(
34+
google::cloud::internal::ApiClientHeader("generator")) {}
3435

3536
StatusOr<google::cloud::bigquery::storage::v1::ReadSession>
3637
BigQueryReadMetadata::CreateReadSession(

google/cloud/iam/internal/iam_credentials_metadata_decorator.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ inline namespace GOOGLE_CLOUD_CPP_GENERATED_NS {
3030
IAMCredentialsMetadata::IAMCredentialsMetadata(
3131
std::shared_ptr<IAMCredentialsStub> child)
3232
: child_(std::move(child)),
33-
api_client_header_(google::cloud::internal::ApiClientHeader()) {}
33+
api_client_header_(
34+
google::cloud::internal::ApiClientHeader("generator")) {}
3435

3536
StatusOr<google::iam::credentials::v1::GenerateAccessTokenResponse>
3637
IAMCredentialsMetadata::GenerateAccessToken(

google/cloud/iam/internal/iam_metadata_decorator.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ inline namespace GOOGLE_CLOUD_CPP_GENERATED_NS {
2929

3030
IAMMetadata::IAMMetadata(std::shared_ptr<IAMStub> child)
3131
: child_(std::move(child)),
32-
api_client_header_(google::cloud::internal::ApiClientHeader()) {}
32+
api_client_header_(
33+
google::cloud::internal::ApiClientHeader("generator")) {}
3334

3435
StatusOr<google::iam::admin::v1::ListServiceAccountsResponse>
3536
IAMMetadata::ListServiceAccounts(

google/cloud/internal/api_client_header.cc

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,27 @@ namespace cloud {
2020
inline namespace GOOGLE_CLOUD_CPP_NS {
2121
namespace internal {
2222

23-
std::string ApiClientHeader() {
23+
std::string ApiClientVersion(std::string const& build_identifier) {
24+
auto client_library_version = version_string();
25+
if (!client_library_version.empty() && client_library_version[0] == 'v') {
26+
// Remove the leading 'v'. Without it, version_string() is a valid
27+
// SemVer string: "<major>.<minor>.<patch>[-<prerelease>][+<build>]".
28+
client_library_version.erase(0, 1);
29+
}
30+
if (!build_identifier.empty()) {
31+
auto pos = client_library_version.find('+');
32+
client_library_version.append(1, pos == std::string::npos ? '+' : '.');
33+
client_library_version.append(build_identifier);
34+
}
35+
return client_library_version;
36+
}
37+
38+
std::string ApiClientHeader(std::string const& build_identifier) {
2439
return "gl-cpp/" + google::cloud::internal::CompilerId() + "-" +
2540
google::cloud::internal::CompilerVersion() + "-" +
2641
google::cloud::internal::CompilerFeatures() + "-" +
2742
google::cloud::internal::LanguageVersion() + " gccl/" +
28-
version_string();
43+
ApiClientVersion(build_identifier);
2944
}
3045

3146
} // namespace internal

google/cloud/internal/api_client_header.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@ namespace cloud {
2323
inline namespace GOOGLE_CLOUD_CPP_NS {
2424
namespace internal {
2525

26+
/// Return the semantic versioning string (https://semver.org/).
27+
std::string ApiClientVersion(std::string const& build_identifier);
28+
2629
/// Return the value for the x-goog-api-client header (aka metadata).
27-
std::string ApiClientHeader();
30+
std::string ApiClientHeader(std::string const& build_identifier = "");
2831

2932
} // namespace internal
3033
} // namespace GOOGLE_CLOUD_CPP_NS

0 commit comments

Comments
 (0)