Skip to content

Commit caf9b1a

Browse files
committed
[ts] Add metric gitpod_logs_total(level) for TS components
1 parent 96ebcd2 commit caf9b1a

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* Copyright (c) 2023 Gitpod GmbH. All rights reserved.
3+
* Licensed under the GNU Affero General Public License (AGPL).
4+
* See License.AGPL.txt in the project root for license information.
5+
*/
6+
7+
import * as prometheusClient from "prom-client";
8+
import { LogReporter } from "./logging";
9+
10+
const logsCounter = new prometheusClient.Counter({
11+
name: "gitpod_logs_total",
12+
help: "Total number of logs by level",
13+
labelNames: ["level"],
14+
registers: [prometheusClient.register],
15+
});
16+
17+
export function reportLogCount(level: string) {
18+
logsCounter.inc({ level });
19+
}
20+
21+
export function installLogCountReporter() {
22+
LogReporter.setReporter((item) => {
23+
reportLogCount(item.severity);
24+
});
25+
}

components/gitpod-protocol/src/util/logging.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ export namespace LogContext {
4444
}
4545
}
4646

47+
let logItemReporter: LogReporter.Reporter | undefined = undefined;
48+
export namespace LogReporter {
49+
export type Reporter = (item: LogItem) => void;
50+
export function setReporter(reporter: Reporter): void {
51+
logItemReporter = reporter;
52+
}
53+
}
54+
4755
export interface LogPayload {
4856
// placeholder to indicate that only dictionary-style objects should be passed as payload
4957
}
@@ -333,7 +341,7 @@ function makeLogItem(
333341
payloadArgs = payloadArgs.map((arg) => scrubPayload(arg, plainLogging));
334342
const payload: unknown =
335343
payloadArgs.length == 0 ? undefined : payloadArgs.length == 1 ? payloadArgs[0] : payloadArgs;
336-
const logItem = {
344+
const logItem: LogItem = {
337345
// undefined fields get eliminated in JSON.stringify()
338346
...reportedErrorEvent,
339347
component,
@@ -345,6 +353,11 @@ function makeLogItem(
345353
payload,
346354
loggedViaConsole: calledViaConsole ? true : undefined,
347355
};
356+
if (logItemReporter) {
357+
try {
358+
logItemReporter(logItem);
359+
} catch (err) {}
360+
}
348361
if (plainLogging) {
349362
return `[${logItem.severity}] [${logItem.component}] ${logItem.message}
350363
${JSON.stringify(payload || "", undefined, " ")}
@@ -401,15 +414,17 @@ function makeReportedErrorEvent(error: Error | undefined): {} {
401414

402415
type LogItem = {
403416
component?: string;
404-
severity?: string;
417+
severity: string;
405418
time?: string;
419+
context?: LogContext;
406420
environment?: string;
407421
region?: string;
408422
message?: string;
409423
messageStub?: string;
410424
errorStub?: string;
411425
error?: unknown;
412426
payload?: unknown;
427+
loggedViaConsole?: boolean;
413428
};
414429

415430
function makeLogItemStub(logItem: LogItem): LogItem {

components/server/src/init.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import express from "express";
5555
import { Container } from "inversify";
5656
import { Server } from "./server";
5757
import { log, LogrusLogLevel } from "@gitpod/gitpod-protocol/lib/util/logging";
58+
import { installLogCountReporter } from "@gitpod/gitpod-protocol/lib/util/logging-backend";
5859
import { TracingManager } from "@gitpod/gitpod-protocol/lib/util/tracing";
5960
import { TypeORM } from "@gitpod/gitpod-db/lib";
6061
import { dbConnectionsEnqueued, dbConnectionsFree, dbConnectionsTotal } from "./prometheus-metrics";
@@ -66,6 +67,7 @@ if (process.env.NODE_ENV === "development") {
6667

6768
log.enableJSONLogging("server", process.env.VERSION, LogrusLogLevel.getFromEnv());
6869
installCtxLogAugmenter();
70+
installLogCountReporter();
6971

7072
// eslint-disable-next-line @typescript-eslint/no-floating-promises
7173
(async () => {

components/ws-manager-bridge/src/main.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Container } from "inversify";
88
import * as express from "express";
99
import * as prometheusClient from "prom-client";
1010
import { log, LogrusLogLevel } from "@gitpod/gitpod-protocol/lib/util/logging";
11+
import { installLogCountReporter } from "@gitpod/gitpod-protocol/lib/util/logging-backend";
1112
import { DebugApp } from "@gitpod/gitpod-protocol/lib/util/debug-app";
1213
import { TypeORM } from "@gitpod/gitpod-db/lib/typeorm/typeorm";
1314
import { TracingManager } from "@gitpod/gitpod-protocol/lib/util/tracing";
@@ -17,6 +18,7 @@ import { AppClusterWorkspaceInstancesController } from "./app-cluster-instance-c
1718
import { redisMetricsRegistry } from "@gitpod/gitpod-db/lib";
1819

1920
log.enableJSONLogging("ws-manager-bridge", undefined, LogrusLogLevel.getFromEnv());
21+
installLogCountReporter();
2022

2123
export const start = async (container: Container) => {
2224
process.on("uncaughtException", function (err) {

0 commit comments

Comments
 (0)