diff --git a/.changeset/neat-kiwis-joke.md b/.changeset/neat-kiwis-joke.md new file mode 100644 index 0000000000..4ed8ae6b88 --- /dev/null +++ b/.changeset/neat-kiwis-joke.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': minor +--- + +adds a User-Agent header to existing API requests in this package to clearly identify API requests from this Google Cloud Storage. headers are formatted as follows where `libVersion` represents the current dotted version number of the Backstage GCs package and `libName` represent the current Google API used at backstage. diff --git a/packages/backend-common/src/reading/GoogleGcsUrlReader.test.ts b/packages/backend-common/src/reading/GoogleGcsUrlReader.test.ts index 66edbcc49a..9e71cb01f5 100644 --- a/packages/backend-common/src/reading/GoogleGcsUrlReader.test.ts +++ b/packages/backend-common/src/reading/GoogleGcsUrlReader.test.ts @@ -20,6 +20,7 @@ import { getVoidLogger } from '../logging'; import { DefaultReadTreeResponseFactory } from './tree'; import { GoogleGcsUrlReader } from './GoogleGcsUrlReader'; import { UrlReaderPredicateTuple } from './types'; +import packageinfo from '../../package.json'; const bucketGetFilesMock = jest.fn(); jest.mock('@google-cloud/storage', () => { @@ -77,6 +78,20 @@ describe('GcsUrlReader', () => { }); expect(entries).toHaveLength(1); }); + it('check if userAgent has been called with this key value', async () => { + const getStorage: any = { + userAgent: `backstage/kubernetes-backend.GkeClusterLocator/${packageinfo.version}`, + }; + jest.mock('@google-cloud/storage', () => { + return { + Storage: jest.fn(() => getStorage), + }; + }); + const getUserAgent = getStorage.userAgent.toString(); + expect(getUserAgent).toBe( + `backstage/kubernetes-backend.GkeClusterLocator/${packageinfo.version}`, + ); + }); describe('predicates', () => { const readers = createReader({ diff --git a/packages/backend-common/src/reading/GoogleGcsUrlReader.ts b/packages/backend-common/src/reading/GoogleGcsUrlReader.ts index c9f5a58895..78528ac6b6 100644 --- a/packages/backend-common/src/reading/GoogleGcsUrlReader.ts +++ b/packages/backend-common/src/reading/GoogleGcsUrlReader.ts @@ -30,6 +30,7 @@ import { } from '@backstage/integration'; import { Readable } from 'stream'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import packageinfo from '../../package.json'; const GOOGLE_GCS_HOST = 'storage.cloud.google.com'; @@ -68,13 +69,16 @@ export class GoogleGcsUrlReader implements UrlReader { logger.info( 'googleGcs credentials not found in config. Using default credentials provider.', ); - storage = new Storage(); + storage = new Storage({ + userAgent: `backstage/kubernetes-backend.GkeClusterLocator/${packageinfo.version}`, + }); } else { storage = new Storage({ credentials: { client_email: gcsConfig.clientEmail || undefined, private_key: gcsConfig.privateKey || undefined, }, + userAgent: `backstage/kubernetes-backend.GkeClusterLocator/${packageinfo.version}`, }); } const reader = new GoogleGcsUrlReader(gcsConfig, storage);