Add guards to prevent activation errors slipping through (#5845)

* Add guards to prevent activation errors slipping through

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Make sure all logging has a message, output less errors when prometheus fails

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Improve logging from getPortFromStream

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton authored and GitHub committed 2022-07-19 09:05:41 +03:00
1 parent 0d2aea0101
commit 81c18a6cad
8 files changed
+43 -17

No files matched your search

+25 -5
View File
@@ -340,15 +340,35 @@ export class Cluster implements ClusterModel, ClusterState {
}
if (this.disconnected || !this.accessible) {
await this.reconnect();
try {
this.broadcastConnectUpdate("Starting connection ...");
await this.reconnect();
} catch (error) {
this.broadcastConnectUpdate(`Failed to start connection: ${error}`, true);
return;
}
}
this.broadcastConnectUpdate("Refreshing connection status ...");
await this.refreshConnectionStatus();
try {
this.broadcastConnectUpdate("Refreshing connection status ...");
await this.refreshConnectionStatus();
} catch (error) {
this.broadcastConnectUpdate(`Failed to connection status: ${error}`, true);
return;
}
if (this.accessible) {
this.broadcastConnectUpdate("Refreshing cluster accessibility ...");
await this.refreshAccessibility();
try {
this.broadcastConnectUpdate("Refreshing cluster accessibility ...");
await this.refreshAccessibility();
} catch (error) {
this.broadcastConnectUpdate(`Failed to refresh accessibility: ${error}`, true);
return;
}
// download kubectl in background, so it's not blocking dashboard
this.ensureKubectl()
.catch(error => this.dependencies.logger.warn(`[CLUSTER]: failed to download kubectl for clusterId=${this.id}`, error));
+1 -1
View File
@@ -78,4 +78,4 @@ export default winston.createLogger({
format.simple(),
),
transports,
});
}) as Logger;
+4 -1
View File
@@ -16,7 +16,10 @@ import { TypedRegEx } from "typed-regex";
import type { Spawn } from "../child-process/spawn.injectable";
import type { Logger } from "../../common/logger";
const startingServeRegex = TypedRegEx("starting to serve on (?<address>.+)", "i");
const startingServeMatcher = "starting to serve on (?<address>.+)";
const startingServeRegex = Object.assign(TypedRegEx(startingServeMatcher, "i"), {
rawMatcher: startingServeMatcher,
});
export interface KubeAuthProxyDependencies {
readonly proxyBinPath: string;
+2 -3
View File
@@ -132,8 +132,7 @@ export class Kubectl {
return this.path;
} catch (err) {
logger.error("Failed to ensure kubectl, fallback to the bundled version");
logger.error(err);
logger.error("Failed to ensure kubectl, fallback to the bundled version", err);
return this.getBundledPath();
}
@@ -146,7 +145,7 @@ export class Kubectl {
return this.dirname;
} catch (err) {
logger.error(err);
logger.error("Failed to get biniary directory", err);
return "";
}
@@ -31,11 +31,11 @@ const loadMetricsFor = (getMetrics: GetMetrics) => async (promQueries: string[],
} catch (error) {
if (isRequestError(error)) {
if (lastAttempt || (error.statusCode && error.statusCode >= 400 && error.statusCode < 500)) {
logger.error("[Metrics]: metrics not available", error?.response ? error.response?.body : error);
throw new Error("Metrics not available");
throw new Error("Metrics not available", { cause: error });
}
} else if (error instanceof Error) {
throw new Error("Metrics not available", { cause: error });
} else {
logger.error("[Metrics]: metrics not available", error);
throw new Error("Metrics not available");
}
@@ -9,7 +9,10 @@ import { spawn } from "child_process";
import * as tcpPortUsed from "tcp-port-used";
import { TypedRegEx } from "typed-regex";
const internalPortRegex = TypedRegEx("^forwarding from (?<address>.+) ->", "i");
const internalPortMatcher = "^forwarding from (?<address>.+) ->";
const internalPortRegex = Object.assign(TypedRegEx(internalPortMatcher, "i"), {
rawMatcher: internalPortMatcher,
});
export interface PortForwardArgs {
clusterId: string;
+3 -2
View File
@@ -20,6 +20,7 @@ interface GetPortArgs {
};
raw?: RegExpExecArray;
};
rawMatcher: string;
};
/**
* Called when the port is found
@@ -27,7 +28,7 @@ interface GetPortArgs {
onFind?: () => void;
/**
* Timeout for how long to wait for the port.
* Default: 5s
* Default: 15s
*/
timeout?: number;
}
@@ -61,7 +62,7 @@ export function getPortFrom(stream: Readable, args: GetPortArgs): Promise<number
};
const timeoutID = setTimeout(() => {
stream.off("data", handler);
logger.warn(`[getPortFrom]: failed to retrieve port via ${args.lineRegex.toString()}: ${logLines}`);
logger.warn(`[getPortFrom]: failed to retrieve port via ${args.lineRegex.rawMatcher}`, logLines);
reject(new Error("failed to retrieve port from stream"));
}, args.timeout ?? 15000);
+1 -1
View File
@@ -121,7 +121,7 @@ export class ThemeStore {
try {
this.applyActiveTheme();
} catch (err) {
logger.error(err);
logger.error(`Failed to apply active theme: ${err}`);
this.dependencies.userStore.resetTheme();
}
}, {