diff --git a/src/main/cluster.ts b/src/main/cluster.ts index 9259240663..ac51ab0eb7 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -47,7 +47,9 @@ export type ClusterPreferences = { service: string; port: number; }; - prometheusSource?: string; + prometheusProvider?: { + type: string; + }; icon?: string; httpsProxy?: string; } diff --git a/src/main/index.ts b/src/main/index.ts index ec30792bd1..a56090a03a 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -15,7 +15,7 @@ import { shellSync } from "./shell-sync" import { getFreePort } from "./port" import { mangleProxyEnv } from "./proxy-env" import { findMainWebContents } from "./webcontents" -import { helmCli } from "./helm-cli" +import "./prometheus/index" mangleProxyEnv() if (app.commandLine.getSwitchValue("proxy-server") !== "") { diff --git a/src/main/prometheus/index.ts b/src/main/prometheus/index.ts new file mode 100644 index 0000000000..9e90e84c36 --- /dev/null +++ b/src/main/prometheus/index.ts @@ -0,0 +1,9 @@ +import { PrometheusLens } from "./lens"; +import { PrometheusHelm } from "./helm"; +import { PrometheusOperator } from "./operator"; +import { PrometheusProviderRegistry } from "./provider"; + + +PrometheusProviderRegistry.registerProvider("lens", new PrometheusLens()) +PrometheusProviderRegistry.registerProvider("helm", new PrometheusHelm()) +PrometheusProviderRegistry.registerProvider("operator", new PrometheusOperator()) \ No newline at end of file diff --git a/src/main/prometheus/lens.ts b/src/main/prometheus/lens.ts index 2603e860be..a0b8391c44 100644 --- a/src/main/prometheus/lens.ts +++ b/src/main/prometheus/lens.ts @@ -1,4 +1,5 @@ import { PrometheusProvider, PrometheusQuery, PrometheusQueryOpts } from "./provider"; + export class PrometheusLens implements PrometheusProvider { rateAccuracy = "1m" diff --git a/src/main/prometheus/operator.ts b/src/main/prometheus/operator.ts index 87f8d51fec..f92ea7665f 100644 --- a/src/main/prometheus/operator.ts +++ b/src/main/prometheus/operator.ts @@ -1,4 +1,5 @@ import { PrometheusProvider, PrometheusQuery, PrometheusQueryOpts } from "./provider"; + export class PrometheusOperator implements PrometheusProvider { rateAccuracy = "1m" diff --git a/src/main/prometheus/provider.ts b/src/main/prometheus/provider.ts index 9536643504..3ed8565f80 100644 --- a/src/main/prometheus/provider.ts +++ b/src/main/prometheus/provider.ts @@ -1,6 +1,4 @@ -import { PrometheusHelm } from "./helm" -import { PrometheusLens } from "./lens" -import { PrometheusOperator } from "./operator"; +import logger from "../logger"; export type PrometheusQuery = { [key: string]: string; @@ -14,16 +12,19 @@ export interface PrometheusProvider { getQueries(opts: PrometheusQueryOpts): PrometheusQuery; } -export class PrometheusProviderFactory { - static createProvider(type: string): PrometheusProvider { - if (type == "lens") { - return new PrometheusLens() - } else if (type == "helm") { - return new PrometheusHelm() - } else if (type == "operator") { - return new PrometheusOperator() - } else { +export class PrometheusProviderRegistry { + private static prometheusProviders: { + [key: string]: PrometheusProvider; + } = {} + + static getProvider(type: string): PrometheusProvider { + if (!this.prometheusProviders[type]) { throw "Unknown Prometheus provider"; } + return this.prometheusProviders[type] + } + + static registerProvider(key: string, provider: PrometheusProvider) { + this.prometheusProviders[key] = provider } } \ No newline at end of file diff --git a/src/main/routes/metrics.ts b/src/main/routes/metrics.ts index 6a931284c9..5c51c7ef05 100644 --- a/src/main/routes/metrics.ts +++ b/src/main/routes/metrics.ts @@ -1,7 +1,7 @@ import { LensApiRequest } from "../router" import { LensApi } from "../lens-api" import * as requestPromise from "request-promise-native" -import { PrometheusProviderFactory, PrometheusProvider} from "../prometheus/provider" +import { PrometheusProviderRegistry, PrometheusProvider} from "../prometheus/provider" type MetricsQuery = string | string[] | { [metricName: string]: string; @@ -23,12 +23,13 @@ class MetricsRoute extends LensApi { queryParams[key] = value }) - const prometheusInstallationSource = cluster.preferences.prometheusSource || "lens" + const prometheusInstallationSource = cluster.preferences.prometheusProvider?.type || "lens" let prometheusProvider: PrometheusProvider try { - prometheusProvider = PrometheusProviderFactory.createProvider(prometheusInstallationSource) + prometheusProvider = PrometheusProviderRegistry.getProvider(prometheusInstallationSource) } catch { this.respondJson(response, {}) + return } // prometheus metrics loader const attempts: { [query: string]: number } = {}; diff --git a/src/renderer/components/ClusterSettings/Preferences/index.vue b/src/renderer/components/ClusterSettings/Preferences/index.vue index ae996f1de0..180e3dbc8e 100644 --- a/src/renderer/components/ClusterSettings/Preferences/index.vue +++ b/src/renderer/components/ClusterSettings/Preferences/index.vue @@ -36,9 +36,9 @@ description="What query format is used to fetch metrics from Prometheus" > @@ -81,8 +81,8 @@ export default { terminalcwd: null }, prometheusPath: "", - prometheusSource: "", - prometheusSources: [ + prometheusProvider: "", + prometheusProviders: [ { text: "Lens", value: "lens"}, { text: "Helm", value: "helm"}, { text: "Prometheus Operator", value: "operator"} @@ -102,7 +102,11 @@ export default { } else { this.prometheusPath = "" } - this.prometheusSource = this.cluster.preferences.prometheusSource || "lens" + if (this.cluster.preferences.prometheusProvider) { + this.prometheusProvider = this.cluster.preferences.prometheusProvider.type + } else { + this.prometheusProvider = "lens" + } }, parsePrometheusPath: function(path) { let parsed = path.split(/\/|:/) @@ -143,11 +147,11 @@ export default { } this.$store.dispatch("storeCluster", this.cluster); }, - onPrometheusSourceSave: function() { - if (this.prometheusSource === "") { - this.cluster.preferences.prometheusSource = null; + onPrometheusProviderSave: function() { + if (this.prometheusProvider === "") { + this.cluster.preferences.prometheusProvider = null; } else { - this.cluster.preferences.prometheusSource = this.prometheusSource + this.cluster.preferences.prometheusProvider = { type: this.prometheusProvider } } this.$store.dispatch("storeCluster", this.cluster); },