From 5ae21b9aefbc09ffd4bc82921ebb5074c3742e0e Mon Sep 17 00:00:00 2001 From: Jeffrey Lau <34088613+jlauzy@users.noreply.github.com> Date: Thu, 20 Apr 2023 08:12:54 -0700 Subject: [PATCH] Added a logger for sending logs to GCP (#636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary: Created a logger that will be used throughout the release process in order to create an audit log trail in GCP. Issue: FEI-5057 ## Test plan: How the console log looks like image How logs look in GCP (we might want to increase our log retention in GCP from 30 days to something higher?) image Author: jlauzy Reviewers: jlauzy, jeresig, somewhatabstract, kevinbarabash Required Reviewers: Approved By: jeresig Checks: ✅ codecov/project, ✅ Test (macos-latest, 16.x), ✅ CodeQL, ✅ Lint, typecheck, and coverage check (ubuntu-latest, 16.x), ⏭ dependabot, ✅ Analyze (javascript), ✅ Prime node_modules cache for primary configuration (ubuntu-latest, 16.x), ✅ gerald Pull Request URL: https://github.com/Khan/wonder-stuff/pull/636 --- .changeset/five-experts-smell.md | 6 +++ packages/wonder-stuff-ci/package.json | 5 +- .../__tests__/get-gcp-log-transport.test.ts | 18 +++++++ .../get-mobile-release-logger.test.ts | 12 +++++ .../src/get-gcp-log-transport.ts | 31 ++++++++++++ .../src/get-mobile-release-logger.ts | 47 +++++++++++++++++++ packages/wonder-stuff-ci/src/index.ts | 1 + packages/wonder-stuff-ci/src/types.ts | 26 ++++++++++ packages/wonder-stuff-ci/tsconfig.json | 1 + packages/wonder-stuff-server/src/index.ts | 2 + 10 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 .changeset/five-experts-smell.md create mode 100644 packages/wonder-stuff-ci/src/__tests__/get-gcp-log-transport.test.ts create mode 100644 packages/wonder-stuff-ci/src/__tests__/get-mobile-release-logger.test.ts create mode 100644 packages/wonder-stuff-ci/src/get-gcp-log-transport.ts create mode 100644 packages/wonder-stuff-ci/src/get-mobile-release-logger.ts diff --git a/.changeset/five-experts-smell.md b/.changeset/five-experts-smell.md new file mode 100644 index 00000000..0ceebb2b --- /dev/null +++ b/.changeset/five-experts-smell.md @@ -0,0 +1,6 @@ +--- +"@khanacademy/wonder-stuff-server": patch +"@khanacademy/wonder-stuff-ci": patch +--- + +Added GCP logger for mobile release diff --git a/packages/wonder-stuff-ci/package.json b/packages/wonder-stuff-ci/package.json index d1a92229..5561655b 100644 --- a/packages/wonder-stuff-ci/package.json +++ b/packages/wonder-stuff-ci/package.json @@ -19,5 +19,8 @@ "ws-dev-build-settings": "^1.1.0" }, "author": "", - "license": "MIT" + "license": "MIT", + "dependencies": { + "@khanacademy/wonder-stuff-server": "^4.0.5" + } } diff --git a/packages/wonder-stuff-ci/src/__tests__/get-gcp-log-transport.test.ts b/packages/wonder-stuff-ci/src/__tests__/get-gcp-log-transport.test.ts new file mode 100644 index 00000000..7f7eea17 --- /dev/null +++ b/packages/wonder-stuff-ci/src/__tests__/get-gcp-log-transport.test.ts @@ -0,0 +1,18 @@ +import {getGCPLogTransport} from "../get-gcp-log-transport"; + +describe("#getGCPLogTransport", () => { + it("return the mobile release logger", () => { + // Act + const result = getGCPLogTransport({ + projectId: "mobile-365917", + logName: "release-raccoon", + level: "info", + redirectToStdout: true, + labels: {}, + }); + + // Assert + expect(result).toBeTruthy(); + expect(result.level).toStrictEqual("info"); + }); +}); diff --git a/packages/wonder-stuff-ci/src/__tests__/get-mobile-release-logger.test.ts b/packages/wonder-stuff-ci/src/__tests__/get-mobile-release-logger.test.ts new file mode 100644 index 00000000..1297be1e --- /dev/null +++ b/packages/wonder-stuff-ci/src/__tests__/get-mobile-release-logger.test.ts @@ -0,0 +1,12 @@ +import {getMobileReleaseLogger} from "../get-mobile-release-logger"; + +describe("#getMobileReleaseLogger", () => { + it("return the mobile release logger", () => { + // Act + const result = getMobileReleaseLogger(); + + // Assert + expect(result).toBeTruthy(); + expect(result.level).toStrictEqual("info"); + }); +}); diff --git a/packages/wonder-stuff-ci/src/get-gcp-log-transport.ts b/packages/wonder-stuff-ci/src/get-gcp-log-transport.ts new file mode 100644 index 00000000..e23d115c --- /dev/null +++ b/packages/wonder-stuff-ci/src/get-gcp-log-transport.ts @@ -0,0 +1,31 @@ +import * as winston from "winston"; +import * as lw from "@google-cloud/logging-winston"; +import type {GCPTransportOptions} from "./types"; + +/** + * Winston logging transport for emitting logs to GCP + * @param {GCPTransportOptions} options for the transport + * @returns {winston.transport} logger set up to send logs to GCP. + */ +/* istanbul ignore file */ +export const getGCPLogTransport = ( + options: GCPTransportOptions, +): winston.transport => { + const transport = new lw.LoggingWinston({ + projectId: options.projectId, + logName: options.logName, + level: options.level, + resource: { + labels: options.labels, + }, + defaultCallback: (err) => { + if (err) { + // eslint-disable-next-line no-console + console.log("Error occurred while sending log to GCP: " + err); + } + }, + redirectToStdout: options.redirectToStdout, + }); + + return transport; +}; diff --git a/packages/wonder-stuff-ci/src/get-mobile-release-logger.ts b/packages/wonder-stuff-ci/src/get-mobile-release-logger.ts new file mode 100644 index 00000000..f3e222ae --- /dev/null +++ b/packages/wonder-stuff-ci/src/get-mobile-release-logger.ts @@ -0,0 +1,47 @@ +import { + createLogger, + Runtime, + setRootLogger, +} from "@khanacademy/wonder-stuff-server"; + +import * as winston from "winston"; + +import {getGCPLogTransport} from "./get-gcp-log-transport"; + +let logger: winston.Logger | null = null; + +/** + * Logger for auditing mobile release events. + * @param {boolean} redirectToStdout If true, logs will be written to stdout. + * @param {{[key: string]: string}} labels K/V metadata that will be add to the logs + */ +export const getMobileReleaseLogger = ( + { + redirectToStdout, + labels, + }: { + redirectToStdout: boolean; + labels: {[key: string]: string}; + } = { + redirectToStdout: false, + labels: {}, + }, +): winston.Logger => { + if (!logger) { + logger = createLogger({ + mode: Runtime.Production, + level: "info", + defaultMetadata: {}, + transport: getGCPLogTransport({ + // Hardcoded so that the client does not need to know these values + projectId: "mobile-365917", + logName: "release-raccoon", + level: "info", + redirectToStdout: redirectToStdout, + labels: {}, + }), + }); + setRootLogger(logger); + } + return logger; +}; diff --git a/packages/wonder-stuff-ci/src/index.ts b/packages/wonder-stuff-ci/src/index.ts index fc6e9e1d..c4173e16 100644 --- a/packages/wonder-stuff-ci/src/index.ts +++ b/packages/wonder-stuff-ci/src/index.ts @@ -4,3 +4,4 @@ export {getMobileReleaseTags} from "./get-mobile-release-tags"; export {getTagsFromGit} from "./get-tags-from-git"; export {execAsync} from "./exec-async"; export {bufferToString} from "./buffer-to-string"; +export {getMobileReleaseLogger} from "./get-mobile-release-logger"; diff --git a/packages/wonder-stuff-ci/src/types.ts b/packages/wonder-stuff-ci/src/types.ts index 089f9a96..8b019d01 100644 --- a/packages/wonder-stuff-ci/src/types.ts +++ b/packages/wonder-stuff-ci/src/types.ts @@ -5,3 +5,29 @@ export type MobileReleaseBranchInfo = { prefix: string; version: string; }; + +/** + * The options for the Winston GCP transport. + */ +export type GCPTransportOptions = { + /** + * The GCP project ID to send logs to. + */ + projectId: string; + /** + * The name of the log to send logs to in GCP. + */ + logName: string; + /** + * If true, logs will be written to stdout instead of GCP + */ + redirectToStdout: boolean; + /** + * The log level to send to GCP. + */ + level: string; + /** + * K/V metadata that will be add to the logs + */ + labels: {[key: string]: string}; +}; diff --git a/packages/wonder-stuff-ci/tsconfig.json b/packages/wonder-stuff-ci/tsconfig.json index 9f1ca95e..226b7566 100644 --- a/packages/wonder-stuff-ci/tsconfig.json +++ b/packages/wonder-stuff-ci/tsconfig.json @@ -6,5 +6,6 @@ "rootDir": "src", }, "references": [ + {"path": "../wonder-stuff-server"} ] } diff --git a/packages/wonder-stuff-server/src/index.ts b/packages/wonder-stuff-server/src/index.ts index 056bb689..922d7737 100644 --- a/packages/wonder-stuff-server/src/index.ts +++ b/packages/wonder-stuff-server/src/index.ts @@ -15,3 +15,5 @@ export {getLogger} from "./get-logger"; export {getRuntimeMode} from "./get-runtime-mode"; export {startServer} from "./start-server"; export {trace} from "./trace"; +export {createLogger} from "./create-logger"; +export {setRootLogger} from "./root-logger";