Skip to content

Commit 8a4da54

Browse files
authored
Add GCP logging extender (#503)
* Add GCP logging extender * Minor version bump for new API * Update packages/logger/src/logger.ts Co-Authored-By: kylecarbs <[email protected]>
1 parent e907dbe commit 8a4da54

File tree

4 files changed

+104
-3
lines changed

4 files changed

+104
-3
lines changed

packages/logger/package.json

+5-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
"build": "tsc -p tsconfig.build.json && cp ./out/packages/logger/src/* ./out && rm -rf out/packages && ../../node_modules/.bin/webpack --config ./webpack.config.js",
66
"postinstall": "if [ ! -d out ];then npm run build; fi"
77
},
8-
"version": "1.0.3",
8+
"version": "1.1.0",
99
"main": "out/main.js",
1010
"types": "out/index.d.ts",
1111
"author": "Coder",
12-
"license": "MIT"
12+
"license": "MIT",
13+
"dependencies": {
14+
"@google-cloud/logging": "^4.5.2"
15+
}
1316
}

packages/logger/src/extender.test.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { field, logger } from "./logger";
2+
import { createStackdriverExtender } from "./extender";
3+
4+
describe("Extender", () => {
5+
it("should add stackdriver extender", () => {
6+
logger.extend(createStackdriverExtender("coder-dev-1", "logging-package-tests"));
7+
});
8+
9+
it("should log", async () => {
10+
logger.debug("Bananas!", field("frog", { hi: "wow" }));
11+
});
12+
});

packages/logger/src/extender.ts

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import * as gcl from "@google-cloud/logging";
2+
import { Extender, logger, field } from "./logger";
3+
4+
export const createStackdriverExtender = (projectId: string, logId: string): Extender => {
5+
enum GcpLogSeverity {
6+
DEFAULT = 0,
7+
DEBUG = 100,
8+
INFO = 200,
9+
NOTICE = 300,
10+
WARNING = 400,
11+
ERROR = 500,
12+
CRITICAL = 600,
13+
ALERT = 700,
14+
EMERGENCY = 800,
15+
}
16+
17+
const logging = new gcl.Logging({
18+
autoRetry: true,
19+
projectId,
20+
});
21+
22+
const log = logging.log(logId);
23+
const convertSeverity = (severity: "trace" | "info" | "warn" | "debug" | "error"): GcpLogSeverity => {
24+
switch (severity) {
25+
case "trace":
26+
case "debug":
27+
return GcpLogSeverity.DEBUG;
28+
case "info":
29+
return GcpLogSeverity.INFO;
30+
case "error":
31+
return GcpLogSeverity.ERROR;
32+
case "warn":
33+
return GcpLogSeverity.WARNING;
34+
}
35+
};
36+
37+
return (options): void => {
38+
const severity = convertSeverity(options.type);
39+
// tslint:disable-next-line:no-any
40+
const metadata = {} as any;
41+
if (options.fields) {
42+
options.fields.forEach((f) => {
43+
if (!f) {
44+
return;
45+
}
46+
metadata[f.identifier] = f.value;
47+
});
48+
}
49+
50+
const entry = log.entry({
51+
// tslint:disable-next-line:no-any
52+
severity: severity as any,
53+
}, {
54+
...metadata,
55+
message: options.message,
56+
});
57+
58+
log.write(entry).catch((ex) => {
59+
logger.named("GCP").error("Failed to log", field("error", ex));
60+
});
61+
};
62+
63+
};

packages/logger/src/logger.ts

+24-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ export const field = <T>(name: string, value: T): Field<T> => {
5959
return new Field(name, value);
6060
};
6161

62+
export type Extender = (msg: {
63+
message: string,
64+
level: Level,
65+
type: "trace" | "info" | "warn" | "debug" | "error",
66+
fields?: FieldArray,
67+
section?: string,
68+
}) => void;
69+
6270
/**
6371
* This formats & builds text for logging.
6472
* It should only be used to build one log item at a time since it stores the
@@ -221,6 +229,7 @@ export class Logger {
221229
private _formatter: Formatter,
222230
private readonly name?: string,
223231
private readonly defaultFields?: FieldArray,
232+
private readonly extenders: Extender[] = [],
224233
) {
225234
if (name) {
226235
this.nameColor = this.hashStringToColor(name);
@@ -248,6 +257,10 @@ export class Logger {
248257
this.muted = true;
249258
}
250259

260+
public extend(extender: Extender): void {
261+
this.extenders.push(extender);
262+
}
263+
251264
/**
252265
* Outputs information.
253266
*/
@@ -328,7 +341,7 @@ export class Logger {
328341
* Each name is deterministically generated a color.
329342
*/
330343
public named(name: string, ...fields: FieldArray): Logger {
331-
const l = new Logger(this._formatter, name, fields);
344+
const l = new Logger(this._formatter, name, fields, this.extenders);
332345
if (this.muted) {
333346
l.mute();
334347
}
@@ -393,6 +406,16 @@ export class Logger {
393406
console.log(...this._formatter.flush());
394407
}
395408
// tslint:enable no-console
409+
410+
this.extenders.forEach((extender) => {
411+
extender({
412+
section: this.name,
413+
fields: options.fields,
414+
level: options.level,
415+
message: options.message as string,
416+
type: options.type,
417+
});
418+
});
396419
}
397420

398421
/**

0 commit comments

Comments
 (0)