From 96915b531964f17688c0d316307f56fa532b6461 Mon Sep 17 00:00:00 2001 From: Jun Mukai Date: Fri, 10 Feb 2017 13:23:53 -0800 Subject: [PATCH] Creates the new x-goog-api-client header. This will send x-goog-api-client with the following format: gl-node/(node version) gccl/(library version) grpc/(grpc version) We will use this information for future tracking. The GAPIC autogen files will have a slightly different format, and that will be addressed later. This PR only changes the APIs using gRPC without the GAPIC. --- packages/bigtable/src/index.js | 4 ++ packages/common-grpc/src/service.js | 6 +++ packages/common-grpc/test/service.js | 55 +++++++++++++++++++++------- packages/datastore/src/index.js | 5 +++ packages/logging/src/index.js | 4 ++ packages/pubsub/src/index.js | 4 ++ packages/pubsub/test/index.js | 5 ++- 7 files changed, 69 insertions(+), 14 deletions(-) diff --git a/packages/bigtable/src/index.js b/packages/bigtable/src/index.js index 65c2af9d332..d94c8ca8f1e 100644 --- a/packages/bigtable/src/index.js +++ b/packages/bigtable/src/index.js @@ -309,6 +309,10 @@ function Bigtable(options) { return new Bigtable(options); } + options = extend({}, options, { + libVersion: require('../package.json').version + }); + var baseUrl = 'bigtable.googleapis.com'; var adminBaseUrl = 'bigtableadmin.googleapis.com'; diff --git a/packages/common-grpc/src/service.js b/packages/common-grpc/src/service.js index b2c3e26000d..b94e69e2901 100644 --- a/packages/common-grpc/src/service.js +++ b/packages/common-grpc/src/service.js @@ -25,6 +25,7 @@ var duplexify = require('duplexify'); var extend = require('extend'); var googleProtoFiles = require('google-proto-files'); var grpc = require('grpc'); +var grpcVersion = require('grpc/package.json').version; var is = require('is'); var nodeutil = require('util'); var path = require('path'); @@ -157,6 +158,11 @@ function GrpcService(config, options) { } this.grpcMetadata = new grpc.Metadata(); + this.grpcMetadata.add('x-goog-api-client', [ + 'gl-node/' + process.versions.node, + 'gccl/' + (options.libVersion || ''), + 'grpc/' + grpcVersion + ].join(' ')); if (config.grpcMetadata) { for (var prop in config.grpcMetadata) { diff --git a/packages/common-grpc/test/service.js b/packages/common-grpc/test/service.js index 5345d854041..c745c7f39a3 100644 --- a/packages/common-grpc/test/service.js +++ b/packages/common-grpc/test/service.js @@ -21,6 +21,7 @@ var duplexify = require('duplexify'); var extend = require('extend'); var googleProtoFiles = require('google-proto-files'); var grpc = require('grpc'); +var grpcVersion = require('grpc/package.json').version; var is = require('is'); var path = require('path'); var proxyquire = require('proxyquire'); @@ -259,34 +260,62 @@ describe('GrpcService', function() { assert.strictEqual(grpcService.grpcCredentials.name, 'createInsecure'); }); - it('should default grpcMetadata to empty metadata', function() { - var fakeGrpcMetadata = {}; + it('should default grpcMetadata to contain x-goog-api-client', function() { + var expectedMetadata = { + 'x-goog-api-client': + 'gl-node/' + process.versions.node + ' gccl/ grpc/' + grpcVersion + }; - GrpcMetadataOverride = function() { - return fakeGrpcMetadata; + GrpcMetadataOverride = function() {}; + GrpcMetadataOverride.prototype.add = function(prop, value) { + this[prop] = value; }; var config = extend({}, CONFIG); delete config.grpcMetadata; var grpcService = new GrpcService(config, OPTIONS); - assert.strictEqual(grpcService.grpcMetadata, fakeGrpcMetadata); + assert.deepEqual(grpcService.grpcMetadata, expectedMetadata); + }); + + it('should customize library version', function() { + var expectedMetadata = { + 'x-goog-api-client': + 'gl-node/' + process.versions.node + ' gccl/0.1.2 grpc/' + + grpcVersion + }; + + GrpcMetadataOverride = function() {}; + GrpcMetadataOverride.prototype.add = function(prop, value) { + this[prop] = value; + }; + + var config = extend({}, CONFIG); + delete config.grpcMetadata; + + var options = extend({}, OPTIONS, { + libVersion: '0.1.2' + }); + var grpcService = new GrpcService(config, options); + assert.deepEqual(grpcService.grpcMetadata, expectedMetadata); }); it('should create and localize grpcMetadata', function() { - var fakeGrpcMetadata = { - add: function(prop, value) { - assert.strictEqual(prop, Object.keys(CONFIG.grpcMetadata)[0]); - assert.strictEqual(value, CONFIG.grpcMetadata[prop]); - } + var expectedMetadata = { + 'x-goog-api-client': + 'gl-node/' + process.versions.node + ' gccl/ grpc/' + grpcVersion }; + Object.keys(CONFIG.grpcMetadata).forEach(function(prop) { + expectedMetadata[prop] = CONFIG.grpcMetadata[prop]; + }); - GrpcMetadataOverride = function() { - return fakeGrpcMetadata; + GrpcMetadataOverride = function() {}; + GrpcMetadataOverride.prototype.add = function(prop, value) { + this[prop] = value; }; var grpcService = new GrpcService(CONFIG, OPTIONS); - assert.strictEqual(grpcService.grpcMetadata, fakeGrpcMetadata); + assert.deepEqual(grpcService.grpcMetadata, expectedMetadata); }); it('should localize maxRetries', function() { diff --git a/packages/datastore/src/index.js b/packages/datastore/src/index.js index 2a21195d760..ead7d506b2c 100644 --- a/packages/datastore/src/index.js +++ b/packages/datastore/src/index.js @@ -23,6 +23,7 @@ var arrify = require('arrify'); var common = require('@google-cloud/common'); var commonGrpc = require('@google-cloud/common-grpc'); +var extend = require('extend'); var is = require('is'); var modelo = require('modelo'); @@ -300,6 +301,10 @@ function Datastore(options) { return new Datastore(options); } + options = extend({}, options, { + libVersion: require('../package.json').version + }); + this.defaultBaseUrl_ = 'datastore.googleapis.com'; this.determineBaseUrl_(options.apiEndpoint); diff --git a/packages/logging/src/index.js b/packages/logging/src/index.js index c2e46b2bedf..7c395c8f511 100644 --- a/packages/logging/src/index.js +++ b/packages/logging/src/index.js @@ -66,6 +66,10 @@ function Logging(options) { return new Logging(options); } + options = extend({}, options, { + libVersion: require('../package.json').version + }); + var config = { baseUrl: 'logging.googleapis.com', service: 'logging', diff --git a/packages/pubsub/src/index.js b/packages/pubsub/src/index.js index c1d452313ef..9b1687f8719 100644 --- a/packages/pubsub/src/index.js +++ b/packages/pubsub/src/index.js @@ -60,6 +60,10 @@ function PubSub(options) { return new PubSub(options); } + options = extend({}, options, { + libVersion: require('../package.json').version + }); + this.defaultBaseUrl_ = 'pubsub.googleapis.com'; this.determineBaseUrl_(); diff --git a/packages/pubsub/test/index.js b/packages/pubsub/test/index.js index b6f822ebc28..b69166e6e01 100644 --- a/packages/pubsub/test/index.js +++ b/packages/pubsub/test/index.js @@ -165,7 +165,10 @@ describe('PubSub', function() { }); it('should localize the options provided', function() { - assert.strictEqual(pubsub.options, OPTIONS); + var expected = extend({}, OPTIONS, { + libVersion: require('../package.json').version + }); + assert.deepStrictEqual(pubsub.options, expected); }); });