Mercurial > code > home > repos > front-door-lock
view src/MetricRow.ts @ 5:9eaa993ed373
monitoring
author | drewp@bigasterisk.com |
---|---|
date | Sun, 15 Oct 2023 18:47:45 -0700 |
parents | |
children | 7de586bf19ff |
line wrap: on
line source
import { LitElement, PropertyValueMap, css, html } from "lit"; import { customElement, property, state } from "lit/decorators.js"; @customElement("metric-row") export class MetricRow extends LitElement { static styles = [ css` :host > div { border: solid #eee; border-width: 1px 0; } :host > div > span { display: inline-block; } span.label { width: 20em; } span.vmval { width: 2em; } span.asof { width: 15em; } .vmval { font-weight: bold; } .asof { color: gray; } `, ]; @property() label: string = "??"; @property() q: string = ""; @state() resultTime?: Date; @state() resultValue?: string; render() { const graphUrl = new URL("https://bigasterisk.com/m/vmui/#/"); graphUrl.searchParams.append("g0.expr", this.q); graphUrl.searchParams.append("g0.range_input", "6h"); graphUrl.searchParams.append("g0.relative_time", "last_6_hours"); return html`<div> <span class='label'>${this.label}</span> <span class="vmval"> ${this.resultValue || "..."} </span> <span class="asof">${this.resultTime ? html`as of ${this.resultTime.toLocaleString("sv")}` : []}</span> <span class='graph'><a href="${graphUrl.toString()}">[graph]</a> </div>`; } protected async update(changedProperties: PropertyValueMap<this>) { if (changedProperties.has("q") && this.q) { this.getMetricValue(this.q); } super.update(changedProperties); } async getMetricValue(q: string) { const vmapi = "https://bigasterisk.com/m/prometheus/api/v1"; const queryUrl = new URL(vmapi + "/query"); queryUrl.searchParams.append("query", q); const resp = await (await fetch(queryUrl)).json(); const v = resp.data.result[0].value; this.resultTime = new Date(v[0] * 1000); this.resultValue = v[1]; } }