Skip to content

Commit

Permalink
Added a logger for sending logs to GCP (#636)
Browse files Browse the repository at this point in the history
## 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
<img width="786" alt="image" src="https://user-images.githubusercontent.com/34088613/231329939-0ff70c1e-a57b-43ce-860e-7d4c280b689d.png">

How logs look in GCP (we might want to increase our log retention in GCP from 30 days to something higher?)
<img width="1019" alt="image" src="https://user-images.githubusercontent.com/34088613/231330145-765a78a6-1ab9-4095-bcda-91708cc2b6b8.png">

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: #636
  • Loading branch information
jlauzy authored Apr 20, 2023
1 parent df6381c commit 5ae21b9
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 1 deletion.
6 changes: 6 additions & 0 deletions .changeset/five-experts-smell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@khanacademy/wonder-stuff-server": patch
"@khanacademy/wonder-stuff-ci": patch
---

Added GCP logger for mobile release
5 changes: 4 additions & 1 deletion packages/wonder-stuff-ci/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,8 @@
"ws-dev-build-settings": "^1.1.0"
},
"author": "",
"license": "MIT"
"license": "MIT",
"dependencies": {
"@khanacademy/wonder-stuff-server": "^4.0.5"
}
}
Original file line number Diff line number Diff line change
@@ -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");
});
});
Original file line number Diff line number Diff line change
@@ -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");
});
});
31 changes: 31 additions & 0 deletions packages/wonder-stuff-ci/src/get-gcp-log-transport.ts
Original file line number Diff line number Diff line change
@@ -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;
};
47 changes: 47 additions & 0 deletions packages/wonder-stuff-ci/src/get-mobile-release-logger.ts
Original file line number Diff line number Diff line change
@@ -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;
};
1 change: 1 addition & 0 deletions packages/wonder-stuff-ci/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
26 changes: 26 additions & 0 deletions packages/wonder-stuff-ci/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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};
};
1 change: 1 addition & 0 deletions packages/wonder-stuff-ci/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@
"rootDir": "src",
},
"references": [
{"path": "../wonder-stuff-server"}
]
}
2 changes: 2 additions & 0 deletions packages/wonder-stuff-server/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";

0 comments on commit 5ae21b9

Please sign in to comment.