From ec83a72879378bc9eedea24f828e4d30fed95e92 Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Mon, 11 Mar 2019 22:21:06 +0100 Subject: separate the status-page project from the status API --- .../src/main/vue/src/api/StatusApi.ts | 137 +++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 kamon-status-page/src/main/vue/src/api/StatusApi.ts (limited to 'kamon-status-page/src/main/vue/src/api/StatusApi.ts') diff --git a/kamon-status-page/src/main/vue/src/api/StatusApi.ts b/kamon-status-page/src/main/vue/src/api/StatusApi.ts new file mode 100644 index 00000000..ee596b8d --- /dev/null +++ b/kamon-status-page/src/main/vue/src/api/StatusApi.ts @@ -0,0 +1,137 @@ +import axios, { AxiosResponse } from 'axios' + +export interface Environment { + service: string + host: string + instance: string + tags: { [key: string]: string } +} + +export interface Settings { + version: string + environment: Environment + config: any +} + +export enum ModuleKind { + Combined = 'combined', + Metric = 'metric', + Span = 'span', + Plain = 'plain', + Unknown = 'unknown' +} + +export interface Module { + name: string + description: string + clazz: string + kind: ModuleKind + programmaticallyRegistered: boolean + enabled: boolean + started: boolean +} + +export interface Metric { + name: string + type: string + unitDimension: string + unitMagnitude: string + tags: { [key: string ]: string } + search: string +} + +export interface ModuleRegistry { + modules: Module[] +} + +export interface MetricRegistry { + metrics: Metric[] +} + +export interface InstrumentationModule { + name: string + description: string + enabled: boolean + active: boolean +} + +export interface Instrumentation { + active: boolean + modules: InstrumentationModule[] + errors: { [key: string]: string[]} +} + + +export class StatusApi { + + public static settings(): Promise { + return axios.get('/status/settings').then(response => { + const config = JSON.parse(response.data.config) + return { + version: response.data.version, + environment: response.data.environment, + config + } + }) + } + + public static moduleRegistryStatus(): Promise { + return axios.get('/status/modules').then(response => { + return response.data as ModuleRegistry + }) + } + + public static metricRegistryStatus(): Promise { + return axios.get('/status/metrics').then(response => { + const metricRegistry = response.data as MetricRegistry + const pair = (key: string, value: string) => key + ':' + value + ' ' + + metricRegistry.metrics.forEach(metric => { + // Fixes the display name for range samplers + if (metric.type === 'RangeSampler') { + metric.type = 'Range Sampler' + } + + + // Calculate the "search" string and inject it in all metrics. + let tagsSearch = '' + Object.keys(metric.tags).forEach(tag => { + tagsSearch += pair(tag, metric.tags[tag]) + }) + + metric.search = + pair('name', metric.name.toLowerCase()) + + pair('type', metric.type.toLowerCase()) + + tagsSearch + }) + + return metricRegistry + }) + } + + public static instrumentationStatus(): Promise { + return axios.get('/status/instrumentation').then(response => { + const instrumentation: Instrumentation = { + active: response.data.active as boolean, + modules: [], + errors: {} + } + + const rawModules = response.data.modules + Object.keys(rawModules).forEach(key => { + const rawModule = JSON.parse(rawModules[key]) + instrumentation.modules.push({ + name: key, + ...rawModule + }) + }) + + const rawErrors = response.data.errors + Object.keys(rawErrors).forEach(key => { + instrumentation.errors[key] = JSON.parse(rawErrors[key]) + }) + + return instrumentation + }) + } +} -- cgit v1.2.3