aboutsummaryrefslogtreecommitdiff
path: root/kamon-status
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-status')
-rw-r--r--kamon-status/src/api/StatusApi.ts34
-rw-r--r--kamon-status/src/components/MetricList.vue20
-rw-r--r--kamon-status/src/components/ModuleStatus.vue4
-rw-r--r--kamon-status/src/styles/main.scss20
-rw-r--r--kamon-status/src/views/Overview.vue70
5 files changed, 120 insertions, 28 deletions
diff --git a/kamon-status/src/api/StatusApi.ts b/kamon-status/src/api/StatusApi.ts
index d00761e5..25d525d2 100644
--- a/kamon-status/src/api/StatusApi.ts
+++ b/kamon-status/src/api/StatusApi.ts
@@ -44,6 +44,18 @@ export interface MetricRegistry {
metrics: Metric[]
}
+export interface InstrumentationModule {
+ description: string
+ isEnabled: boolean
+ isActive: boolean
+}
+
+export interface Instrumentation {
+ isActive: boolean
+ modules: { [key: string]: InstrumentationModule }
+ errors: { [key: string]: string[]}
+}
+
export class StatusApi {
@@ -91,4 +103,26 @@ export class StatusApi {
return metricRegistry
})
}
+
+ public static instrumentationStatus(): Promise<Instrumentation> {
+ return axios.get('/status/instrumentation').then(response => {
+ const instrumentation: Instrumentation = {
+ isActive: response.data.isActive as boolean,
+ modules: {},
+ errors: {}
+ }
+
+ const rawModules = response.data.modules
+ Object.keys(rawModules).forEach(key => {
+ instrumentation.modules[key] = JSON.parse(rawModules[key])
+ })
+
+ const rawErrors = response.data.errors
+ Object.keys(rawErrors).forEach(key => {
+ instrumentation.errors[key] = JSON.parse(rawErrors[key])
+ })
+
+ return instrumentation
+ })
+ }
}
diff --git a/kamon-status/src/components/MetricList.vue b/kamon-status/src/components/MetricList.vue
index 758252e7..b9b6a92a 100644
--- a/kamon-status/src/components/MetricList.vue
+++ b/kamon-status/src/components/MetricList.vue
@@ -12,7 +12,7 @@
<div class="row no-gutters" v-for="(metric, index) in matchedMetrics" :key="metric.search">
<div class="col-12 px-3 pt-1 pb-3">
<div class="text-uppercase text-label">{{ metric.type }}</div>
- <h4>{{ metric.name }}</h4>
+ <h5>{{ metric.name }}</h5>
<div class="tag-container">
<span class="tag" v-for="tag in Object.keys(metric.tags)" :key="tag">
{{ tag }}=<span class="tag-value">{{ metric.tags[tag] }}</span>
@@ -75,7 +75,7 @@ export default class MetricList extends Vue {
height: 2.5rem;
border: none;
border-radius: 0.3rem;
- background-color: #e8e8e8;
+ background-color: #efefef;
&:focus {
outline: none;
@@ -93,20 +93,4 @@ export default class MetricList extends Vue {
padding-right: 1rem;
}
}
-
-.tag-container {
- margin: 0rem -0.3rem;
-}
-
-.tag {
- background-color: #f4f4f4;
- margin: 0.3rem;
- padding: 0.1rem 0.5rem;
- border-radius: 0.2rem;
-}
-
-.tag-value {
- color: #676767;
-}
-
</style>
diff --git a/kamon-status/src/components/ModuleStatus.vue b/kamon-status/src/components/ModuleStatus.vue
index a92cf46f..fff3373e 100644
--- a/kamon-status/src/components/ModuleStatus.vue
+++ b/kamon-status/src/components/ModuleStatus.vue
@@ -8,8 +8,8 @@
<hr>
</div>
<div class="col">
- <div class="px-3 py-2">
- <h4>{{ moduleStatus.name }}</h4>
+ <div class="px-3 py-3">
+ <h5 class="mb-0">{{ moduleStatus.name }}</h5>
<div class="text-label">
{{ moduleStatus.description }}
</div>
diff --git a/kamon-status/src/styles/main.scss b/kamon-status/src/styles/main.scss
index cde62b37..271da8af 100644
--- a/kamon-status/src/styles/main.scss
+++ b/kamon-status/src/styles/main.scss
@@ -13,4 +13,22 @@ h1, h2, h3 {
.text-label {
color: #b3b3b3;
-} \ No newline at end of file
+}
+
+.tag-container {
+ margin: 0rem -0.3rem;
+}
+
+.tag {
+ display: inline-block;
+ overflow-wrap: anywhere;
+ background-color: #f4f4f4;
+ margin: 0.3rem;
+ padding: 0.1rem 0.5rem;
+ border-radius: 0.2rem;
+}
+
+.tag-value {
+ overflow-wrap: anywhere;
+ color: #676767;
+}
diff --git a/kamon-status/src/views/Overview.vue b/kamon-status/src/views/Overview.vue
index 2d6e8dd7..75b39eb0 100644
--- a/kamon-status/src/views/Overview.vue
+++ b/kamon-status/src/views/Overview.vue
@@ -8,15 +8,15 @@
<card>
<div class="row py-2 no-gutters">
<div class="col-12 col-md-3 py-2 px-3">
- <div class="text-uppercase text-label pb-2">Instrumentation</div>
- <h5>Active</h5>
+ <div class="text-uppercase text-label pb-1">Instrumentation</div>
+ <h5>{{instrumentationStatusMessage}}</h5>
</div>
<div class="col-12 col-md-3 py-2 px-3">
- <div class="text-uppercase text-label pb-2">Reporters</div>
+ <div class="text-uppercase text-label pb-1">Reporters</div>
<h5>{{ activeReporters.length }} Started</h5>
</div>
<div class="col-12 col-md-3 py-2 px-3">
- <div class="text-uppercase text-label pb-2">Metrics</div>
+ <div class="text-uppercase text-label pb-1">Metrics</div>
<h5>{{metricsStatusMessage}}</h5>
</div>
</div>
@@ -24,6 +24,39 @@
</div>
<div class="col-12 pt-4 pb-2">
+ <h3>Environment</h3>
+ </div>
+ <div class="col-12">
+ <card>
+ <div class="row py-2 no-gutters">
+ <div class="col-auto py-2 px-3">
+ <div class="text-uppercase text-label pb-1">Service</div>
+ <h6>{{ service }}</h6>
+ </div>
+ <div class="col-auto py-2 px-3">
+ <div class="text-uppercase text-label pb-1">Host</div>
+ <h6>{{ host }}</h6>
+ </div>
+ <div class="col-auto py-2 px-3">
+ <div class="text-uppercase text-label pb-1">instance</div>
+ <h6>{{instance}}</h6>
+ </div>
+ <div class="col-12 col-md-3 py-2 px-3">
+ <div class="text-uppercase text-label pb-1">tags</div>
+ <div class="tag-container" v-if="Object.keys(environmentTags).length > 0">
+ <span class="tag" v-for="tag in Object.keys(environmentTags)" :key="tag">
+ {{ tag }}=<span class="tag-value">{{ environmentTags[tag] }}</span>
+ </span>
+ </div>
+ <div v-else>
+ <h6>None</h6>
+ </div>
+ </div>
+ </div>
+ </card>
+ </div>
+
+ <div class="col-12 pt-4 pb-2">
<h3>Reporters</h3>
</div>
<div class="col-12 py-1" v-for="reporter in reporterModules" :key="reporter.name">
@@ -53,7 +86,7 @@ import {Option, none, some} from 'ts-option'
import ModuleStatus from '../components/ModuleStatus.vue'
import Card from '../components/Card.vue'
import MetricList from '../components/MetricList.vue'
-import {StatusApi, Settings, ModuleRegistry, ModuleKind, MetricRegistry, Module, Metric} from '../api/StatusApi'
+import {StatusApi, Settings, ModuleRegistry, ModuleKind, MetricRegistry, Module, Metric, Instrumentation} from '../api/StatusApi'
@Component({
components: {
@@ -66,6 +99,7 @@ export default class Overview extends Vue {
private settings: Option<Settings> = none
private moduleRegistry: Option<ModuleRegistry> = none
private metricsRegistry: Option<MetricRegistry> = none
+ private instrumentation: Option<Instrumentation> = none
get reporterModules(): Module[] {
return this.moduleRegistry
@@ -87,6 +121,10 @@ export default class Overview extends Vue {
return this.metricsRegistry.map(metricRegistry => metricRegistry.metrics.length)
}
+ get instrumentationStatusMessage(): string {
+ return this.instrumentation.map(i => (i.isActive ? 'Active' : 'Disabled') as string).getOrElse('Unknown')
+ }
+
get metricsStatusMessage(): string {
return this.trackedMetrics.map(mc => mc + ' Tracked').getOrElse('Unknown')
}
@@ -97,6 +135,23 @@ export default class Overview extends Vue {
.getOrElse([])
}
+ get instance(): string {
+ return this.settings.map(s => s.environment.instance).getOrElse('Unknown')
+ }
+
+ get host(): string {
+ return this.settings.map(s => s.environment.host).getOrElse('Unknown')
+ }
+
+ get service(): string {
+ return this.settings.map(s => s.environment.service).getOrElse('Unknown')
+ }
+
+ get environmentTags(): { [key: string]: string } {
+ return this.settings.map(s => s.environment.tags).getOrElse({})
+ }
+
+
public mounted() {
this.refreshData()
@@ -106,11 +161,12 @@ export default class Overview extends Vue {
StatusApi.settings().then(settings => { this.settings = some(settings) })
StatusApi.metricRegistryStatus().then(metricsRegistry => { this.metricsRegistry = some(metricsRegistry) })
StatusApi.moduleRegistryStatus().then(moduleRegistry => {this.moduleRegistry = some(moduleRegistry) })
+ StatusApi.instrumentationStatus().then(instrumentation => {this.instrumentation = some(instrumentation) })
}
private isReporter(module: Module): boolean {
- return [ModuleKind.Combined, ModuleKind.Span, ModuleKind.Metric].indexOf(module.kind) > 0
- }
+ return [ModuleKind.Combined, ModuleKind.Span, ModuleKind.Metric].indexOf(module.kind) > 0
+ }
private isStarted(module: Module): boolean {
return module.isStarted