Skip to content
This repository was archived by the owner on Apr 3, 2024. It is now read-only.

Commit 70d8730

Browse files
authored
Use clusterName as service name on GKE (#309)
* ability to query GKE cluster name from metadata * use GKE cluster name as the service name Fixes: #280
1 parent 8ddb5ec commit 70d8730

File tree

2 files changed

+99
-2
lines changed

2 files changed

+99
-2
lines changed

src/agent/debuglet.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,24 @@ export class Debuglet extends EventEmitter {
262262
return;
263263
}
264264

265+
if (onGCP &&
266+
(!that.config_.serviceContext ||
267+
!that.config_.serviceContext.service)) {
268+
// If on GCP, check if the clusterName instance attribute is availble.
269+
// Use this as the service context for better service identification on
270+
// GKE.
271+
try {
272+
const clusterName = await Debuglet.getClusterNameFromMetadata();
273+
that.config_.serviceContext = {
274+
service: clusterName,
275+
version: 'unversioned',
276+
minorVersion_: null
277+
};
278+
} catch (err) {
279+
/* we are not running on GKE - Ignore error. */
280+
}
281+
}
282+
265283
that.getSourceContext_(function(err5, sourceContext) {
266284
if (err5) {
267285
that.logger_.warn('Unable to discover source context', err5);
@@ -402,6 +420,16 @@ export class Debuglet extends EventEmitter {
402420
});
403421
}
404422

423+
static getClusterNameFromMetadata(): Promise<string> {
424+
return new Promise<string>((resolve, reject) => {
425+
metadata.instance(
426+
'attributes/cluster-name',
427+
(err: Error, _res: http.ServerResponse, clusterName: string) => {
428+
err ? reject(err) : resolve(clusterName);
429+
});
430+
});
431+
}
432+
405433
getSourceContext_(
406434
callback:
407435
(err: Error|string, sourceContext: {[key: string]: string}) => void):

test/test-debuglet.js

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,46 @@ describe('Debuglet', function() {
136136
});
137137
});
138138

139+
describe('getClusterNameFromMetadata', () => {
140+
let savedInstance;
141+
before(() => {
142+
savedInstance = metadata.instance;
143+
});
144+
after(() => {
145+
metadata.instance = savedInstance;
146+
});
147+
148+
it('should return project retrived from metadata', (done) => {
149+
const FAKE_CLUSTER_NAME = 'fake-cluster-name-from-metadata';
150+
var debug = require('../build/src/debug.js').Debug();
151+
var debuglet = new Debuglet(debug, defaultConfig);
152+
153+
metadata.instance = (path, cb) => {
154+
setImmediate(() => {
155+
cb(null, {}, FAKE_CLUSTER_NAME);
156+
});
157+
}
158+
159+
Debuglet.getClusterNameFromMetadata().then((clusterName) => {
160+
assert.strictEqual(clusterName, FAKE_CLUSTER_NAME);
161+
done();
162+
});
163+
});
164+
165+
it('should return null on error', (done) => {
166+
var debug = require('../build/src/debug.js').Debug();
167+
var debuglet = new Debuglet(debug, defaultConfig);
168+
169+
metadata.instance = (path, cb) => {
170+
setImmediate(() => { cb(new Error()); });
171+
}
172+
173+
Debuglet.getClusterNameFromMetadata().catch((err) => {
174+
done();
175+
});
176+
});
177+
});
178+
139179
describe('getProjectId', () => {
140180
let savedGetProjectIdFromMetadata;
141181

@@ -502,8 +542,6 @@ describe('Debuglet', function() {
502542
});
503543
});
504544

505-
506-
507545
it('should retry on failed registration', function(done) {
508546
this.timeout(10000);
509547
var debug = require('../build/src/debug.js').Debug(
@@ -563,6 +601,37 @@ describe('Debuglet', function() {
563601
debuglet.start();
564602
});
565603

604+
it('should attempt to retrieve cluster name if needed', (done) => {
605+
const savedRunningOnGCP = Debuglet.runningOnGCP;
606+
Debuglet.runningOnGCP = () => {
607+
return Promise.resolve(true);
608+
};
609+
const clusterScope =
610+
nock('http://metadata.google.internal')
611+
.get('/computeMetadata/v1/instance/attributes/cluster-name')
612+
.once()
613+
.reply(200, 'cluster-name-from-metadata');
614+
615+
var debug = require('../build/src/debug.js').Debug(
616+
{projectId: 'fake-project', credentials: fakeCredentials});
617+
var debuglet = new Debuglet(debug, defaultConfig);
618+
619+
nocks.oauth2();
620+
var scope = nock(API)
621+
.post(REGISTER_PATH)
622+
.reply(200, {debuggee: {id: DEBUGGEE_ID}});
623+
624+
debuglet.once('registered', function(id) {
625+
assert.equal(id, DEBUGGEE_ID);
626+
debuglet.stop();
627+
clusterScope.done();
628+
scope.done();
629+
Debuglet.runningOnGCP = savedRunningOnGCP;
630+
done();
631+
});
632+
633+
debuglet.start();
634+
});
566635

567636
it('should pass source context to api if present', function(done) {
568637
var debug = require('../build/src/debug.js').Debug(

0 commit comments

Comments
 (0)