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
How logs look in GCP (we might want to increase our log retention in GCP from 30 days to something higher?)
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";