diff --git a/src/index.ts b/src/index.ts index 0e73ad17..277b02b1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -127,6 +127,7 @@ class Logging { auth: GoogleAuth; options: LoggingOptions; projectId: string; + detectedResource?: object; constructor(options?: LoggingOptions) { // Determine what scopes are needed. diff --git a/src/log.ts b/src/log.ts index d83d4d8a..b007815c 100644 --- a/src/log.ts +++ b/src/log.ts @@ -761,21 +761,24 @@ class Log { typeof optionsOrCallback === 'function' ? optionsOrCallback : cb; const self = this; - if (!options.resource) { + if (options.resource) { + if (options.resource.labels) { + options.resource.labels = snakeCaseKeys(options.resource.labels); + } + writeWithResource(options.resource); + } else if (this.logging.detectedResource) { + writeWithResource(this.logging.detectedResource); + } else { getDefaultResource(this.logging.auth) .then( (resource) => { + this.logging.detectedResource = resource; writeWithResource(resource); }, () => { // Ignore errors (the API will speak up if it has an issue). writeWithResource(null); }); - } else { - if (options.resource.labels) { - options.resource.labels = snakeCaseKeys(options.resource.labels); - } - writeWithResource(options.resource); } function writeWithResource(resource: {}|null) { let decoratedEntries; diff --git a/test/log.ts b/test/log.ts index a2142b70..da250f98 100644 --- a/test/log.ts +++ b/test/log.ts @@ -343,6 +343,37 @@ describe('Log', () => { log.write(ENTRY, optionsWithResource, done); }); + it('should cache a detected resource', done => { + const fakeResource = 'test-level-fake-resource'; + + fakeMetadata.getDefaultResource = async () => { + return fakeResource; + }; + + log.logging.request = () => { + assert.strictEqual(log.logging.detectedResource, fakeResource); + done(); + }; + + log.write(ENTRY, done); + }); + + it('should re-use detected resource', done => { + log.logging.detectedResource = 'environment-default-resource'; + + fakeMetadata.getDefaultResource = () => { + throw new Error('Cached resource was not used.'); + }; + + log.logging.request = config => { + assert.strictEqual( + config.reqOpts.resource, log.logging.detectedResource); + done(); + }; + + log.write(ENTRY, done); + }); + it('should transform camelcase label keys to snake case', done => { const CUSTOM_RESOURCE = { labels: {