From e98ef3673ab7635f3a625f516b329d41466e0b3c Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Thu, 30 Apr 2020 19:24:01 +0300 Subject: [PATCH] Make PrometheusQuery more type safe Signed-off-by: Lauri Nevala --- src/common/prometheus-providers.ts | 2 - src/main/prometheus/lens.ts | 4 +- src/main/prometheus/operator.ts | 4 +- src/main/prometheus/provider-registry.ts | 48 ++++++++++++++++++++++-- src/main/routes/metrics.ts | 9 +++-- 5 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/common/prometheus-providers.ts b/src/common/prometheus-providers.ts index bbe0d19c7b..87f081b94e 100644 --- a/src/common/prometheus-providers.ts +++ b/src/common/prometheus-providers.ts @@ -2,11 +2,9 @@ import { PrometheusLens } from "../main/prometheus/lens"; import { PrometheusHelm } from "../main/prometheus/helm"; import { PrometheusOperator } from "../main/prometheus/operator"; import { PrometheusProviderRegistry } from "../main/prometheus/provider-registry"; -import logger from "../main/logger"; [PrometheusLens, PrometheusHelm, PrometheusOperator].forEach(providerClass => { const provider = new providerClass() - logger.info(provider.id) PrometheusProviderRegistry.registerProvider(provider.id, provider) }); diff --git a/src/main/prometheus/lens.ts b/src/main/prometheus/lens.ts index 17019af619..f278000731 100644 --- a/src/main/prometheus/lens.ts +++ b/src/main/prometheus/lens.ts @@ -1,11 +1,11 @@ -import { PrometheusProvider, PrometheusQuery, PrometheusQueryOpts } from "./provider-registry"; +import { PrometheusProvider, PrometheusQueryOpts, PrometheusClusterQuery, PrometheusNodeQuery, PrometheusPodQuery, PrometheusPvcQuery, PrometheusIngressQuery } from "./provider-registry"; export class PrometheusLens implements PrometheusProvider { id = "lens" name = "Lens" rateAccuracy = "1m" - public getQueries(opts: PrometheusQueryOpts): PrometheusQuery { + public getQueries(opts: PrometheusQueryOpts): PrometheusNodeQuery | PrometheusClusterQuery | PrometheusPodQuery | PrometheusPvcQuery | PrometheusIngressQuery { switch(opts.category) { case 'cluster': return { diff --git a/src/main/prometheus/operator.ts b/src/main/prometheus/operator.ts index 6def71e7eb..a44abbe72f 100644 --- a/src/main/prometheus/operator.ts +++ b/src/main/prometheus/operator.ts @@ -1,11 +1,11 @@ -import { PrometheusProvider, PrometheusQuery, PrometheusQueryOpts } from "./provider-registry"; +import { PrometheusProvider, PrometheusQueryOpts, PrometheusClusterQuery, PrometheusNodeQuery, PrometheusPodQuery, PrometheusPvcQuery, PrometheusIngressQuery } from "./provider-registry"; export class PrometheusOperator implements PrometheusProvider { rateAccuracy = "1m" id = "operator" name = "Prometheus Operator" - public getQueries(opts: PrometheusQueryOpts): PrometheusQuery { + public getQueries(opts: PrometheusQueryOpts): PrometheusNodeQuery | PrometheusClusterQuery | PrometheusPodQuery | PrometheusPvcQuery | PrometheusIngressQuery { switch(opts.category) { case 'cluster': return { diff --git a/src/main/prometheus/provider-registry.ts b/src/main/prometheus/provider-registry.ts index 6fd793311b..d02feb1ab5 100644 --- a/src/main/prometheus/provider-registry.ts +++ b/src/main/prometheus/provider-registry.ts @@ -1,5 +1,47 @@ -export type PrometheusQuery = { - [key: string]: string; +export type PrometheusClusterQuery = { + memoryUsage: string; + memoryRequests: string; + memoryLimits: string; + memoryCapacity: string; + cpuUsage: string; + cpuRequests: string; + cpuLimits: string; + cpuCapacity: string; + podUsage: string; + podCapacity: string; +} + +export type PrometheusNodeQuery = { + memoryUsage: string; + memoryCapacity: string; + cpuUsage: string; + cpuCapacity: string; + fsSize: string; + fsUsage: string; +} + +export type PrometheusPodQuery = { + memoryUsage: string; + memoryRequests: string; + memoryLimits: string; + cpuUsage: string; + cpuRequests: string; + cpuLimits: string; + fsUsage: string; + networkReceive: string; + networkTransit: string; +} + +export type PrometheusPvcQuery = { + diskUsage: string; + diskCapacity: string; +} + +export type PrometheusIngressQuery = { + bytesSentSuccess: string; + bytesSentFailure: string; + requestDurationSeconds: string; + responseDurationSeconds: string; } export type PrometheusQueryOpts = { @@ -7,7 +49,7 @@ export type PrometheusQueryOpts = { }; export interface PrometheusProvider { - getQueries(opts: PrometheusQueryOpts): PrometheusQuery; + getQueries(opts: PrometheusQueryOpts): PrometheusNodeQuery | PrometheusClusterQuery | PrometheusPodQuery | PrometheusPvcQuery | PrometheusIngressQuery; } export type PrometheusProviderList = { diff --git a/src/main/routes/metrics.ts b/src/main/routes/metrics.ts index 2e698423cd..b7b1a030b0 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 { PrometheusProviderRegistry, PrometheusProvider} from "../prometheus/provider-registry" +import { PrometheusProviderRegistry, PrometheusProvider, PrometheusNodeQuery, PrometheusClusterQuery, PrometheusPodQuery, PrometheusPvcQuery, PrometheusIngressQuery, PrometheusQueryOpts} from "../prometheus/provider-registry" type MetricsQuery = string | string[] | { [metricName: string]: string; @@ -71,9 +71,10 @@ class MetricsRoute extends LensApi { data = {}; const result = await Promise.all( Object.entries(query).map((queryEntry: any) => { - const queryName = queryEntry[0] - const queryOpts = queryEntry[1] - const q = prometheusProvider.getQueries(queryOpts)[queryName] + const queryName: string = queryEntry[0] + const queryOpts: PrometheusQueryOpts = queryEntry[1] + const queries = prometheusProvider.getQueries(queryOpts) + const q = queries[queryName as keyof (PrometheusNodeQuery | PrometheusClusterQuery | PrometheusPodQuery | PrometheusPvcQuery | PrometheusIngressQuery)] return loadMetrics(q) }) );