From 40ef9e3bbc01af0036817981d295ea87752d9992 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Wed, 6 May 2020 08:27:45 +0300 Subject: [PATCH] fix Signed-off-by: Jari Kolehmainen --- src/main/cluster.ts | 2 +- src/main/context-handler.ts | 18 +++++++++++++----- src/main/prometheus/lens.ts | 17 ++++++++++++----- src/main/prometheus/operator.ts | 4 ++-- src/main/proxy.ts | 2 -- src/main/routes/metrics.ts | 3 ++- 6 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/main/cluster.ts b/src/main/cluster.ts index 5d6fe11642..1398bf2f7f 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -119,7 +119,7 @@ export class Cluster implements ClusterInfo { public async refreshCluster() { clusterStore.reloadCluster(this) - await this.contextHandler.setClusterPreferences(this.preferences) + this.contextHandler.setClusterPreferences(this.preferences) const connectionStatus = await this.getConnectionStatus() if (connectionStatus == ClusterStatus.AccessGranted) { diff --git a/src/main/context-handler.ts b/src/main/context-handler.ts index 4c282a7636..fddc95fa6b 100644 --- a/src/main/context-handler.ts +++ b/src/main/context-handler.ts @@ -9,6 +9,7 @@ import { KubeAuthProxy } from "./kube-auth-proxy" import { Cluster, ClusterPreferences } from "./cluster" import { prometheusProviders } from "../common/prometheus-providers" import { PrometheusService, PrometheusProvider } from "./prometheus/provider-registry" +import { PrometheusLens } from "./prometheus/lens" export class ContextHandler { public contextName: string @@ -30,6 +31,7 @@ export class ContextHandler { protected defaultNamespace: string protected proxyPort: number protected kubernetesApi: string + protected prometheusProvider: string protected prometheusPath: string protected clusterName: string @@ -69,12 +71,13 @@ export class ContextHandler { } public async setClusterPreferences(clusterPreferences?: ClusterPreferences) { + this.prometheusProvider = clusterPreferences.prometheusProvider?.type + if (clusterPreferences && clusterPreferences.prometheus) { const prom = clusterPreferences.prometheus this.prometheusPath = `${prom.namespace}/services/${prom.service}:${prom.port}` } else { - const path = await this.resolvePrometheusPath(clusterPreferences.prometheusProvider?.type) - this.prometheusPath = path ? path : "lens-metrics/services/prometheus:80" + this.prometheusPath = null } if(clusterPreferences && clusterPreferences.clusterName) { this.clusterName = clusterPreferences.clusterName; @@ -84,20 +87,25 @@ export class ContextHandler { } protected async resolvePrometheusPath(providerId: string): Promise { - const apiClient = this.kc.makeApiClient(CoreV1Api) const providers = providerId ? prometheusProviders.filter((p, _) => p.id == providerId) : prometheusProviders const prometheusPromises: Promise[] = providers.map(async (provider: PrometheusProvider): Promise => { + const apiClient = this.kc.makeApiClient(CoreV1Api) return await provider.getPrometheusService(apiClient) }) const resolvedPrometheusServices = await Promise.all(prometheusPromises) const service = resolvedPrometheusServices.filter(n => n)[0] - console.log(service) if (service) { return `${service.namespace}/services/${service.service}:${service.port}` + } else { + return "lens-metrics/services/prometheus:80" } } - public getPrometheusPath() { + public async getPrometheusPath(): Promise { + if (this.prometheusPath) return this.prometheusPath + + this.prometheusPath = await this.resolvePrometheusPath(this.prometheusProvider) + return this.prometheusPath } diff --git a/src/main/prometheus/lens.ts b/src/main/prometheus/lens.ts index 6b04385191..934f7e765a 100644 --- a/src/main/prometheus/lens.ts +++ b/src/main/prometheus/lens.ts @@ -1,5 +1,6 @@ import { PrometheusProvider, PrometheusQueryOpts, PrometheusQuery, PrometheusService } from "./provider-registry"; import { CoreV1Api } from "@kubernetes/client-node"; +import logger from "../logger" export class PrometheusLens implements PrometheusProvider { id = "lens" @@ -7,11 +8,17 @@ export class PrometheusLens implements PrometheusProvider { rateAccuracy = "1m" public async getPrometheusService(client: CoreV1Api): Promise { - return { - id: this.id, - namespace: "lens-metrics", - service: "prometheus", - port: 80 + try { + const resp = await client.readNamespacedService("prometheus", "lens-metrics") + const service = resp.body + return { + id: this.id, + namespace: service.metadata.namespace, + service: service.metadata.name, + port: service.spec.ports[0].port + } + } catch(error) { + logger.warn(`failed to list services: ${error.toString()}`) } } diff --git a/src/main/prometheus/operator.ts b/src/main/prometheus/operator.ts index b899400558..93303f4c9c 100644 --- a/src/main/prometheus/operator.ts +++ b/src/main/prometheus/operator.ts @@ -8,9 +8,9 @@ export class PrometheusOperator implements PrometheusProvider { name = "Prometheus Operator" public async getPrometheusService(client: CoreV1Api): Promise { - const labelSelector = "operated-prometheus==true" + const labelSelector = "operated-prometheus=true" try { - const serviceList = await client.listServiceForAllNamespaces(false, "", null, labelSelector) + const serviceList = await client.listServiceForAllNamespaces(null, null, null, labelSelector) const service = serviceList.body.items[0] if (!service) return diff --git a/src/main/proxy.ts b/src/main/proxy.ts index ff998d79dd..538a960702 100644 --- a/src/main/proxy.ts +++ b/src/main/proxy.ts @@ -83,8 +83,6 @@ export class LensProxy { }, (250 * retryCount)) } } - - //return } res.writeHead(500, { 'Content-Type': 'text/plain' diff --git a/src/main/routes/metrics.ts b/src/main/routes/metrics.ts index b7b1a030b0..bf74f01819 100644 --- a/src/main/routes/metrics.ts +++ b/src/main/routes/metrics.ts @@ -13,7 +13,8 @@ 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 metricsUrl = `${serverUrl}/api/v1/namespaces/${cluster.contextHandler.getPrometheusPath()}/proxy/api/v1/query_range` + 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",