From 8e5c37838680035594a210147b34e65d2093ae72 Mon Sep 17 00:00:00 2001 From: Matthias Bilger Date: Sat, 7 Jan 2023 11:12:49 +0100 Subject: [PATCH] Allow multiple Project Keys for HealthChecks --- docs/widgets.md | 33 +++++++++ src/components/Widgets/HealthChecks.vue | 92 ++++++++++++++----------- 2 files changed, 84 insertions(+), 41 deletions(-) diff --git a/docs/widgets.md b/docs/widgets.md index 783fd26c..4a1d6551 100644 --- a/docs/widgets.md +++ b/docs/widgets.md @@ -34,6 +34,7 @@ Dashy has support for displaying dynamic content in the form of widgets. There a - [NASA APOD](#astronomy-picture-of-the-day) - [GitHub Trending](#github-trending) - [GitHub Profile Stats](#github-profile-stats) + - [Healthchecks Status](#healthchecks status) - **[Self-Hosted Services Widgets](#self-hosted-services-widgets)** - [System Info](#system-info) - [Cron Monitoring](#cron-monitoring-health-checks) @@ -1140,6 +1141,38 @@ Display stats from your GitHub profile, using embedded cards from [anuraghazra/g --- +### HealthChecks Status + +Display status of one or more HealthChecks project(s). Works with healthcheck.io and your selfhosted instance. + +

+ +#### Options + +**Field** | **Type** | **Required** | **Description** +--- | --- | --- | --- +**`host`** | `string` | Optional | The base url of your instance, default is `https://healthchecks.io` +**`apiKey`** | `string` or `array` | Required | One or more API keys for your healthcheck projects. (Read-only works fine) + +```yaml +- type: HealthChecks + options: + host: https://healthcheck.your-domain.de + apiKey: + - abcdefg... + - zxywvu... +``` + +#### Info + +- **CORS**: 🟢 Enabled +- **Auth**: 🟢 Required +- **Price**: 🟢 Free / Paid / Self-hosted +- **Host**: Managed Instance or Self-Hosted (see [healthchecks/healthchecks](https://github.com/healthchecks/healthchecks)) +- **Privacy**: _See [Healthchecks.io Privacy Policy](https://healthchecks.io/privacy/)_ + +--- + ## Self-Hosted Services Widgets ### System Info diff --git a/src/components/Widgets/HealthChecks.vue b/src/components/Widgets/HealthChecks.vue index 1243eb5c..4115897f 100644 --- a/src/components/Widgets/HealthChecks.vue +++ b/src/components/Widgets/HealthChecks.vue @@ -1,18 +1,19 @@ @@ -35,6 +36,8 @@ export default { if (status === 'up') symbol = '✔'; if (status === 'down') symbol = '✘'; if (status === 'new') symbol = '❖'; + if (status === 'paused') symbol = '⏸'; + if (status === 'running') symbol = '▶' return `${symbol} ${capitalize(status)}`; }, formatDate(timestamp) { @@ -51,6 +54,9 @@ export default { if (!this.options.apiKey) { this.error('An API key is required, please see the docs for more info'); } + if (typeof(this.options.apiKey) === "string") { + return [ this.options.apiKey ]; + } return this.options.apiKey; }, }, @@ -58,14 +64,18 @@ export default { /* Make GET request to CoinGecko API endpoint */ fetchData() { this.overrideProxyChoice = true; - const authHeaders = { 'X-Api-Key': this.apiKey }; - this.makeRequest(this.endpoint, authHeaders).then( - (response) => { this.processData(response); }, - ); + const results = []; + this.apiKey.forEach((key) => { + const authHeaders = { 'X-Api-Key': key }; + this.makeRequest(this.endpoint, authHeaders).then( + (response) => { this.processData(response, results); }, + ); + }); + results.sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0)); + this.crons = results; }, /* Assign data variables to the returned data */ - processData(data) { - const results = []; + processData(data, results) { data.checks.forEach((cron) => { results.push({ id: cron.slug, @@ -78,7 +88,7 @@ export default { url: this.makeUrl(cron.unique_key), }); }); - this.crons = results; + return results; }, makeUrl(cronId) { const base = this.options.host || 'https://healthchecks.io'; @@ -99,40 +109,40 @@ export default {