From 327ecf9f070e49ec0e41719e8ebe78eabcb3ba9b Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Wed, 6 May 2020 09:14:57 +0300 Subject: [PATCH] refactor Signed-off-by: Jari Kolehmainen --- src/main/context-handler.ts | 31 +++++++++++++++---- src/main/prometheus/helm.ts | 4 +-- src/main/prometheus/lens.ts | 2 +- src/main/prometheus/operator.ts | 14 ++++++--- src/main/routes/metrics.ts | 8 ++--- .../ClusterSettings/Preferences/index.vue | 4 +-- 6 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/main/context-handler.ts b/src/main/context-handler.ts index fddc95fa6b..9f2977dfc4 100644 --- a/src/main/context-handler.ts +++ b/src/main/context-handler.ts @@ -70,7 +70,7 @@ export class ContextHandler { this.setClusterPreferences(cluster.preferences) } - public async setClusterPreferences(clusterPreferences?: ClusterPreferences) { + public setClusterPreferences(clusterPreferences?: ClusterPreferences) { this.prometheusProvider = clusterPreferences.prometheusProvider?.type if (clusterPreferences && clusterPreferences.prometheus) { @@ -86,8 +86,22 @@ export class ContextHandler { } } - protected async resolvePrometheusPath(providerId: string): Promise { - const providers = providerId ? prometheusProviders.filter((p, _) => p.id == providerId) : prometheusProviders + protected async resolvePrometheusPath(): Promise { + const service = await this.getPrometheusService() + return `${service.namespace}/services/${service.service}:${service.port}` + } + + public async getPrometheusProvider() { + if (!this.prometheusProvider) { + const service = await this.getPrometheusService() + logger.info(`using ${service.id} as prometheus provider`) + this.prometheusProvider = service.id + } + return prometheusProviders.find(p => p.id === this.prometheusProvider) + } + + public async getPrometheusService(): Promise { + const providers = this.prometheusProvider ? prometheusProviders.filter((p, _) => p.id == this.prometheusProvider) : prometheusProviders const prometheusPromises: Promise[] = providers.map(async (provider: PrometheusProvider): Promise => { const apiClient = this.kc.makeApiClient(CoreV1Api) return await provider.getPrometheusService(apiClient) @@ -95,16 +109,21 @@ export class ContextHandler { const resolvedPrometheusServices = await Promise.all(prometheusPromises) const service = resolvedPrometheusServices.filter(n => n)[0] if (service) { - return `${service.namespace}/services/${service.service}:${service.port}` + return service } else { - return "lens-metrics/services/prometheus:80" + return { + id: "lens", + namespace: "lens-metrics", + service: "prometheus", + port: 80 + } } } public async getPrometheusPath(): Promise { if (this.prometheusPath) return this.prometheusPath - this.prometheusPath = await this.resolvePrometheusPath(this.prometheusProvider) + this.prometheusPath = await this.resolvePrometheusPath() return this.prometheusPath } diff --git a/src/main/prometheus/helm.ts b/src/main/prometheus/helm.ts index 624a429017..f1462931df 100644 --- a/src/main/prometheus/helm.ts +++ b/src/main/prometheus/helm.ts @@ -5,7 +5,7 @@ import logger from "../logger" export class PrometheusHelm extends PrometheusLens { id = "helm" - name = "helm" + name = "Helm" rateAccuracy = "5m" public async getPrometheusService(client: CoreV1Api): Promise { @@ -22,7 +22,7 @@ export class PrometheusHelm extends PrometheusLens { port: service.spec.ports[0].port } } catch(error) { - logger.warn(`failed to list services: ${error.toString()}`) + logger.warn(`PrometheusHelm: failed to list services: ${error.toString()}`) return } } diff --git a/src/main/prometheus/lens.ts b/src/main/prometheus/lens.ts index 934f7e765a..0b16f925e0 100644 --- a/src/main/prometheus/lens.ts +++ b/src/main/prometheus/lens.ts @@ -18,7 +18,7 @@ export class PrometheusLens implements PrometheusProvider { port: service.spec.ports[0].port } } catch(error) { - logger.warn(`failed to list services: ${error.toString()}`) + logger.warn(`PrometheusLens: failed to list services: ${error.toString()}`) } } diff --git a/src/main/prometheus/operator.ts b/src/main/prometheus/operator.ts index 93303f4c9c..e816531cc0 100644 --- a/src/main/prometheus/operator.ts +++ b/src/main/prometheus/operator.ts @@ -1,5 +1,5 @@ import { PrometheusProvider, PrometheusQueryOpts, PrometheusQuery, PrometheusService } from "./provider-registry"; -import { CoreV1Api } from "@kubernetes/client-node"; +import { CoreV1Api, V1Service } from "@kubernetes/client-node"; import logger from "../logger"; export class PrometheusOperator implements PrometheusProvider { @@ -8,10 +8,14 @@ export class PrometheusOperator implements PrometheusProvider { name = "Prometheus Operator" public async getPrometheusService(client: CoreV1Api): Promise { - const labelSelector = "operated-prometheus=true" try { - const serviceList = await client.listServiceForAllNamespaces(null, null, null, labelSelector) - const service = serviceList.body.items[0] + let service: V1Service + for (const labelSelector of ["operated-prometheus=true", "self-monitor=true"]) { + if (!service) { + const serviceList = await client.listServiceForAllNamespaces(null, null, null, labelSelector) + service = serviceList.body.items[0] + } + } if (!service) return return { @@ -22,7 +26,7 @@ export class PrometheusOperator implements PrometheusProvider { } } catch(error) { console.error(error) - logger.warn(`failed to list services: ${error.toString()}`) + logger.warn(`PrometheusOperator: failed to list services: ${error.toString()}`) return } } diff --git a/src/main/routes/metrics.ts b/src/main/routes/metrics.ts index bf74f01819..6bd965394d 100644 --- a/src/main/routes/metrics.ts +++ b/src/main/routes/metrics.ts @@ -13,8 +13,6 @@ class MetricsRoute extends LensApi { const { response, cluster} = request const query: MetricsQuery = request.payload; const serverUrl = `http://127.0.0.1:${cluster.port}/api-kube` - const prometheusPath = await cluster.contextHandler.getPrometheusPath() - const metricsUrl = `${serverUrl}/api/v1/namespaces/${prometheusPath}/proxy/api/v1/query_range` const headers = { "Host": `${cluster.id}.localhost:${cluster.port}`, "Content-type": "application/json", @@ -24,10 +22,12 @@ class MetricsRoute extends LensApi { queryParams[key] = value }) - const prometheusInstallationSource = cluster.preferences.prometheusProvider?.type || "lens" + let metricsUrl: string let prometheusProvider: PrometheusProvider try { - prometheusProvider = PrometheusProviderRegistry.getProvider(prometheusInstallationSource) + const prometheusPath = await cluster.contextHandler.getPrometheusPath() + metricsUrl = `${serverUrl}/api/v1/namespaces/${prometheusPath}/proxy/api/v1/query_range` + prometheusProvider = await cluster.contextHandler.getPrometheusProvider() } catch { this.respondJson(response, {}) return diff --git a/src/renderer/components/ClusterSettings/Preferences/index.vue b/src/renderer/components/ClusterSettings/Preferences/index.vue index 9def72d9d6..a94f0b59d8 100644 --- a/src/renderer/components/ClusterSettings/Preferences/index.vue +++ b/src/renderer/components/ClusterSettings/Preferences/index.vue @@ -33,12 +33,12 @@