Skip to content

Commit 3e91324

Browse files
ofrobotsstephenplusplus
authored andcommitted
feat(logging): provide cluster_name on GKE resources (#2483)
1 parent 3e72dae commit 3e91324

File tree

3 files changed

+75
-23
lines changed

3 files changed

+75
-23
lines changed

packages/logging/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
"arrify": "^1.0.0",
5858
"eventid": "^0.1.0",
5959
"extend": "^3.0.0",
60+
"gcp-metadata": "^0.2.0",
6061
"google-auto-auth": "^0.7.1",
6162
"google-gax": "^0.13.0",
6263
"google-proto-files": "^0.12.0",

packages/logging/src/metadata.js

+23-8
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
'use strict';
2222

23+
var gcpMetadata = require('gcp-metadata');
24+
2325
/**
2426
* The Metadata class attempts to contact the metadata service and determine,
2527
* based on request success and environment variables, what type of resource
@@ -95,15 +97,25 @@ Metadata.getGCEDescriptor = function(projectId) {
9597
* @private
9698
*
9799
* @param {string} projectId - The project ID.
100+
* @param {function} callback - The callback function.
98101
* @return {object}
99102
*/
100-
Metadata.getGKEDescriptor = function(projectId) {
101-
return {
102-
type: 'container',
103-
labels: {
104-
project_id: projectId,
103+
Metadata.getGKEDescriptor = function(projectId, callback) {
104+
gcpMetadata.instance('attributes/clusterName', function(err, _, clusterName) {
105+
if (err) {
106+
callback(err);
107+
return;
105108
}
106-
};
109+
110+
callback(null, {
111+
type: 'container',
112+
labels: {
113+
// TODO(ofrobots): it would be good to include the namespace_id as well.
114+
cluster_name: clusterName,
115+
project_id: projectId
116+
}
117+
});
118+
});
107119
};
108120

109121
/**
@@ -138,14 +150,17 @@ Metadata.prototype.getDefaultResource = function(callback) {
138150
}
139151

140152
self.logging.auth.getEnvironment(function(err, env) {
153+
if (env.IS_CONTAINER_ENGINE) {
154+
Metadata.getGKEDescriptor(projectId, callback);
155+
return;
156+
}
157+
141158
var defaultResource;
142159

143160
if (env.IS_APP_ENGINE) {
144161
defaultResource = Metadata.getGAEDescriptor(projectId);
145162
} else if (env.IS_CLOUD_FUNCTION) {
146163
defaultResource = Metadata.getCloudFunctionDescriptor(projectId);
147-
} else if (env.IS_CONTAINER_ENGINE) {
148-
defaultResource = Metadata.getGKEDescriptor(projectId);
149164
} else if (env.IS_COMPUTE_ENGINE) {
150165
defaultResource = Metadata.getGCEDescriptor(projectId);
151166
} else {

packages/logging/test/metadata.js

+51-15
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,21 @@
1818

1919
var assert = require('assert');
2020
var extend = require('extend');
21-
22-
var Metadata = require('../src/metadata.js');
21+
var proxyquire = require('proxyquire');
22+
23+
var instanceArgsOverride;
24+
var fakeGcpMetadata = {
25+
instance: function(path, cb) {
26+
setImmediate(function() {
27+
var args = instanceArgsOverride || [null, null, 'fake-instance-value'];
28+
cb.apply(fakeGcpMetadata, args);
29+
});
30+
}
31+
};
2332

2433
describe('metadata', function() {
2534
var MetadataCached;
35+
var Metadata;
2636
var metadata;
2737

2838
var PROJECT_ID = 'project-id';
@@ -31,6 +41,10 @@ describe('metadata', function() {
3141
var ENV_CACHED = extend({}, process.env);
3242

3343
before(function() {
44+
Metadata = proxyquire('../src/metadata.js', {
45+
'gcp-metadata': fakeGcpMetadata
46+
});
47+
3448
MetadataCached = extend({}, Metadata);
3549
});
3650

@@ -40,6 +54,7 @@ describe('metadata', function() {
4054
};
4155
extend(Metadata, MetadataCached);
4256
metadata = new Metadata(LOGGING);
57+
instanceArgsOverride = null;
4358
});
4459

4560
afterEach(function() {
@@ -104,12 +119,31 @@ describe('metadata', function() {
104119
});
105120

106121
describe('getGKEDescriptor', function() {
107-
it('should return the correct descriptor', function() {
108-
assert.deepEqual(Metadata.getGKEDescriptor(PROJECT_ID), {
109-
type: 'container',
110-
labels: {
111-
project_id: PROJECT_ID
112-
}
122+
var CLUSTER_NAME = 'gke-cluster-name';
123+
124+
it('should return the correct descriptor', function(done) {
125+
instanceArgsOverride = [null, null, CLUSTER_NAME];
126+
127+
Metadata.getGKEDescriptor(PROJECT_ID, function(err, descriptor) {
128+
assert.ifError(err);
129+
assert.deepEqual(descriptor, {
130+
type: 'container',
131+
labels: {
132+
cluster_name: CLUSTER_NAME,
133+
project_id: PROJECT_ID
134+
}
135+
});
136+
done();
137+
});
138+
});
139+
140+
it('should return error on failure to acquire metadata', function(done) {
141+
var FAKE_ERROR = new Error();
142+
instanceArgsOverride = [ FAKE_ERROR ];
143+
144+
Metadata.getGKEDescriptor(PROJECT_ID, function(err) {
145+
assert.strictEqual(err, FAKE_ERROR);
146+
done();
113147
});
114148
});
115149
});
@@ -248,12 +282,8 @@ describe('metadata', function() {
248282

249283
describe('container engine', function() {
250284
it('should return correct descriptor', function(done) {
251-
var DESCRIPTOR = {};
252-
253-
Metadata.getGKEDescriptor = function(projectId) {
254-
assert.strictEqual(projectId, RETURNED_PROJECT_ID);
255-
return DESCRIPTOR;
256-
};
285+
var CLUSTER_NAME = 'overridden-value';
286+
instanceArgsOverride = [null, null, CLUSTER_NAME];
257287

258288
metadata.logging.auth.getEnvironment = function(callback) {
259289
callback(null, {
@@ -264,7 +294,13 @@ describe('metadata', function() {
264294

265295
metadata.getDefaultResource(function(err, defaultResource) {
266296
assert.ifError(err);
267-
assert.strictEqual(defaultResource, DESCRIPTOR);
297+
assert.deepStrictEqual(defaultResource, {
298+
type: 'container',
299+
labels: {
300+
cluster_name: CLUSTER_NAME,
301+
project_id: RETURNED_PROJECT_ID
302+
}
303+
});
268304
done();
269305
});
270306
});

0 commit comments

Comments
 (0)