mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
refactor
Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
This commit is contained in:
parent
40ef9e3bbc
commit
327ecf9f07
@ -70,7 +70,7 @@ export class ContextHandler {
|
|||||||
this.setClusterPreferences(cluster.preferences)
|
this.setClusterPreferences(cluster.preferences)
|
||||||
}
|
}
|
||||||
|
|
||||||
public async setClusterPreferences(clusterPreferences?: ClusterPreferences) {
|
public setClusterPreferences(clusterPreferences?: ClusterPreferences) {
|
||||||
this.prometheusProvider = clusterPreferences.prometheusProvider?.type
|
this.prometheusProvider = clusterPreferences.prometheusProvider?.type
|
||||||
|
|
||||||
if (clusterPreferences && clusterPreferences.prometheus) {
|
if (clusterPreferences && clusterPreferences.prometheus) {
|
||||||
@ -86,8 +86,22 @@ export class ContextHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async resolvePrometheusPath(providerId: string): Promise<string> {
|
protected async resolvePrometheusPath(): Promise<string> {
|
||||||
const providers = providerId ? prometheusProviders.filter((p, _) => p.id == providerId) : prometheusProviders
|
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<PrometheusService> {
|
||||||
|
const providers = this.prometheusProvider ? prometheusProviders.filter((p, _) => p.id == this.prometheusProvider) : prometheusProviders
|
||||||
const prometheusPromises: Promise<PrometheusService>[] = providers.map(async (provider: PrometheusProvider): Promise<PrometheusService> => {
|
const prometheusPromises: Promise<PrometheusService>[] = providers.map(async (provider: PrometheusProvider): Promise<PrometheusService> => {
|
||||||
const apiClient = this.kc.makeApiClient(CoreV1Api)
|
const apiClient = this.kc.makeApiClient(CoreV1Api)
|
||||||
return await provider.getPrometheusService(apiClient)
|
return await provider.getPrometheusService(apiClient)
|
||||||
@ -95,16 +109,21 @@ export class ContextHandler {
|
|||||||
const resolvedPrometheusServices = await Promise.all(prometheusPromises)
|
const resolvedPrometheusServices = await Promise.all(prometheusPromises)
|
||||||
const service = resolvedPrometheusServices.filter(n => n)[0]
|
const service = resolvedPrometheusServices.filter(n => n)[0]
|
||||||
if (service) {
|
if (service) {
|
||||||
return `${service.namespace}/services/${service.service}:${service.port}`
|
return service
|
||||||
} else {
|
} else {
|
||||||
return "lens-metrics/services/prometheus:80"
|
return {
|
||||||
|
id: "lens",
|
||||||
|
namespace: "lens-metrics",
|
||||||
|
service: "prometheus",
|
||||||
|
port: 80
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async getPrometheusPath(): Promise<string> {
|
public async getPrometheusPath(): Promise<string> {
|
||||||
if (this.prometheusPath) return this.prometheusPath
|
if (this.prometheusPath) return this.prometheusPath
|
||||||
|
|
||||||
this.prometheusPath = await this.resolvePrometheusPath(this.prometheusProvider)
|
this.prometheusPath = await this.resolvePrometheusPath()
|
||||||
|
|
||||||
return this.prometheusPath
|
return this.prometheusPath
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import logger from "../logger"
|
|||||||
|
|
||||||
export class PrometheusHelm extends PrometheusLens {
|
export class PrometheusHelm extends PrometheusLens {
|
||||||
id = "helm"
|
id = "helm"
|
||||||
name = "helm"
|
name = "Helm"
|
||||||
rateAccuracy = "5m"
|
rateAccuracy = "5m"
|
||||||
|
|
||||||
public async getPrometheusService(client: CoreV1Api): Promise<PrometheusService> {
|
public async getPrometheusService(client: CoreV1Api): Promise<PrometheusService> {
|
||||||
@ -22,7 +22,7 @@ export class PrometheusHelm extends PrometheusLens {
|
|||||||
port: service.spec.ports[0].port
|
port: service.spec.ports[0].port
|
||||||
}
|
}
|
||||||
} catch(error) {
|
} catch(error) {
|
||||||
logger.warn(`failed to list services: ${error.toString()}`)
|
logger.warn(`PrometheusHelm: failed to list services: ${error.toString()}`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,7 @@ export class PrometheusLens implements PrometheusProvider {
|
|||||||
port: service.spec.ports[0].port
|
port: service.spec.ports[0].port
|
||||||
}
|
}
|
||||||
} catch(error) {
|
} catch(error) {
|
||||||
logger.warn(`failed to list services: ${error.toString()}`)
|
logger.warn(`PrometheusLens: failed to list services: ${error.toString()}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { PrometheusProvider, PrometheusQueryOpts, PrometheusQuery, PrometheusService } from "./provider-registry";
|
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";
|
import logger from "../logger";
|
||||||
|
|
||||||
export class PrometheusOperator implements PrometheusProvider {
|
export class PrometheusOperator implements PrometheusProvider {
|
||||||
@ -8,10 +8,14 @@ export class PrometheusOperator implements PrometheusProvider {
|
|||||||
name = "Prometheus Operator"
|
name = "Prometheus Operator"
|
||||||
|
|
||||||
public async getPrometheusService(client: CoreV1Api): Promise<PrometheusService> {
|
public async getPrometheusService(client: CoreV1Api): Promise<PrometheusService> {
|
||||||
const labelSelector = "operated-prometheus=true"
|
|
||||||
try {
|
try {
|
||||||
|
let service: V1Service
|
||||||
|
for (const labelSelector of ["operated-prometheus=true", "self-monitor=true"]) {
|
||||||
|
if (!service) {
|
||||||
const serviceList = await client.listServiceForAllNamespaces(null, null, null, labelSelector)
|
const serviceList = await client.listServiceForAllNamespaces(null, null, null, labelSelector)
|
||||||
const service = serviceList.body.items[0]
|
service = serviceList.body.items[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!service) return
|
if (!service) return
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@ -22,7 +26,7 @@ export class PrometheusOperator implements PrometheusProvider {
|
|||||||
}
|
}
|
||||||
} catch(error) {
|
} catch(error) {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
logger.warn(`failed to list services: ${error.toString()}`)
|
logger.warn(`PrometheusOperator: failed to list services: ${error.toString()}`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,8 +13,6 @@ class MetricsRoute extends LensApi {
|
|||||||
const { response, cluster} = request
|
const { response, cluster} = request
|
||||||
const query: MetricsQuery = request.payload;
|
const query: MetricsQuery = request.payload;
|
||||||
const serverUrl = `http://127.0.0.1:${cluster.port}/api-kube`
|
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 = {
|
const headers = {
|
||||||
"Host": `${cluster.id}.localhost:${cluster.port}`,
|
"Host": `${cluster.id}.localhost:${cluster.port}`,
|
||||||
"Content-type": "application/json",
|
"Content-type": "application/json",
|
||||||
@ -24,10 +22,12 @@ class MetricsRoute extends LensApi {
|
|||||||
queryParams[key] = value
|
queryParams[key] = value
|
||||||
})
|
})
|
||||||
|
|
||||||
const prometheusInstallationSource = cluster.preferences.prometheusProvider?.type || "lens"
|
let metricsUrl: string
|
||||||
let prometheusProvider: PrometheusProvider
|
let prometheusProvider: PrometheusProvider
|
||||||
try {
|
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 {
|
} catch {
|
||||||
this.respondJson(response, {})
|
this.respondJson(response, {})
|
||||||
return
|
return
|
||||||
|
|||||||
@ -33,12 +33,12 @@
|
|||||||
</b-form-group>
|
</b-form-group>
|
||||||
<b-form-group
|
<b-form-group
|
||||||
label="Prometheus service address."
|
label="Prometheus service address."
|
||||||
description="A path to an existing Prometheus installation (<namespace>/<service>:<port>)."
|
description="An address to an existing Prometheus installation (<namespace>/<service>:<port>). Lens tries to auto-detect address if left empty."
|
||||||
v-if="canEditPrometheusPath"
|
v-if="canEditPrometheusPath"
|
||||||
>
|
>
|
||||||
<b-form-input
|
<b-form-input
|
||||||
v-model="prometheusPath"
|
v-model="prometheusPath"
|
||||||
placeholder="lens-metrics/prometheus:80"
|
placeholder="<namespace>/<service>:<port>"
|
||||||
id="input-prometheuspath"
|
id="input-prometheuspath"
|
||||||
@blur="onPrometheusSave"
|
@blur="onPrometheusSave"
|
||||||
/>
|
/>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user