1
0
mirror of https://github.com/tormachris/cf-workers-status-page.git synced 2025-09-21 08:25:16 +02:00

8 Commits

Author SHA1 Message Date
6952ed2e8d feat: show city also in header 2021-01-19 00:32:31 +01:00
6d08f47d1d feat: collect avg response time by default 2021-01-19 00:22:20 +01:00
1439b67c30 Merge pull request #22 from eidam/e/remove-flareact-patch
chore: remove custom patch in favor of flareact 0.10.0
2020-11-23 20:39:24 +01:00
100473fc58 chore: remove custom patch in favor of flareact 0.10.0 2020-11-23 19:21:38 +01:00
7baab0475e Merge pull request #21 from aexvir/aexvir/monitor-ui-links
chore: make monitor title link to the monitored url
2020-11-23 16:19:12 +01:00
c90ee97d3a chore: make monitor title link to the monitored url 2020-11-23 09:05:01 +01:00
c13095a2df Merge pull request #20 from eidam/e/job-level-node-env
fix: github actions build node env
2020-11-22 16:02:33 +01:00
6ab6e38d56 fix: github actions node env 2020-11-22 16:02:03 +01:00
11 changed files with 80 additions and 156 deletions

View File

@ -5,6 +5,8 @@ on:
branches:
- main
repository_dispatch:
schedule:
- cron: '0 0 1 * *'
jobs:
deploy:
@ -17,6 +19,8 @@ jobs:
node-version: 12
- run: yarn install
- run: yarn build
env:
NODE_ENV: production
- name: Publish
uses: cloudflare/wrangler-action@1.3.0
with:
@ -38,7 +42,6 @@ jobs:
SECRET_TELEGRAM_CHAT_ID
environment: production
env:
NODE_ENV: production
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
SECRET_SLACK_WEBHOOK_URL: ${{secrets.SECRET_SLACK_WEBHOOK_URL}}
SECRET_TELEGRAM_API_TOKEN: ${{secrets.SECRET_TELEGRAM_API_TOKEN}}

View File

@ -3,7 +3,7 @@ settings:
url: 'https://status-page.eidam.dev' # used for Slack messages
logo: logo-192x192.png # image in ./public/ folder
daysInHistogram: 90 # number of days you want to display in histogram
collectResponseTimes: false # experimental feature, enable only for <5 monitors or on paid plans
collectResponseTimes: true # collects avg response times from CRON locations
allmonitorsOperational: 'All Systems Operational'
notAllmonitorsOperational: 'Not All Systems Operational'

View File

@ -11,11 +11,10 @@
"deploy": "yarn build && flareact publish",
"kv-gc": "node ./src/cli/gcMonitors.js",
"format": "prettier --write '**/*.{js,css,json,md}'",
"css": "postcss public/tailwind.css -o public/style.css",
"postinstall": "patch-package"
"css": "postcss public/tailwind.css -o public/style.css"
},
"dependencies": {
"flareact": "0.9.0",
"flareact": "^0.10.0",
"laco": "^1.2.1",
"laco-react": "^1.1.0",
"react": "^17.0.1",
@ -28,8 +27,6 @@
"postcss-cli": "^8.3.0",
"prettier": "^2.2.0",
"tailwindcss": "^2.0.1",
"yaml-loader": "^0.6.0",
"patch-package": "^6.2.2",
"postinstall-postinstall": "^2.1.0"
"yaml-loader": "^0.6.0"
}
}

View File

@ -1,12 +0,0 @@
diff --git a/node_modules/flareact/src/components/_document.js b/node_modules/flareact/src/components/_document.js
index 3494b60..206b493 100644
--- a/node_modules/flareact/src/components/_document.js
+++ b/node_modules/flareact/src/components/_document.js
@@ -61,6 +61,7 @@ export function FlareactHead({ helmet, page, buildManifest }) {
{helmet.title.toComponent()}
{helmet.meta.toComponent()}
{helmet.link.toComponent()}
+ {helmet.script.toComponent()}
{[...links].map((link) => (
<link href={`/_flareact/static/${link}`} rel="stylesheet" />

View File

@ -6,7 +6,7 @@ const accountId = process.env.CF_ACCOUNT_ID
const namespaceId = process.env.KV_NAMESPACE_ID
const apiToken = process.env.CF_API_TOKEN
const kvPrefix = 's_'
const kvMonitorsKey = 'monitors_data_v1_1'
if (!accountId || !namespaceId || !apiToken) {
console.error(
@ -15,7 +15,7 @@ if (!accountId || !namespaceId || !apiToken) {
process.exit(0)
}
async function getKvMonitors(kvPrefix) {
async function getKvMonitors(kvMonitorsKey) {
const init = {
headers: {
'Content-Type': 'application/json',
@ -24,27 +24,29 @@ async function getKvMonitors(kvPrefix) {
}
const res = await fetch(
`https://api.cloudflare.com/client/v4/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/keys?limit=100&prefix=${kvPrefix}`,
`https://api.cloudflare.com/client/v4/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/values/${kvMonitorsKey}`,
init,
)
const json = await res.json()
return json.result
return json
}
async function deleteKvBulk(keys) {
async function saveKVMonitors(kvMonitorsKey, data) {
const init = {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${apiToken}`,
},
method: 'DELETE',
body: JSON.stringify(keys),
body: JSON.stringify(data),
}
return await fetch(
`https://api.cloudflare.com/client/v4/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/bulk`,
const res = await fetch(
`https://api.cloudflare.com/client/v4/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/values/${kvMonitorsKey}`,
init,
)
return res
}
function loadConfig() {
@ -53,26 +55,37 @@ function loadConfig() {
return JSON.parse(config)
}
getKvMonitors(kvPrefix)
getKvMonitors(kvMonitorsKey)
.then(async (kvMonitors) => {
let stateMonitors = kvMonitors
const config = loadConfig()
const monitors = config.monitors.map((key) => {
const configMonitors = config.monitors.map((key) => {
return key.id
})
const kvState = kvMonitors.map((key) => {
return key.name
})
const keysForRemoval = kvState.filter(
(x) => !monitors.includes(x.replace(kvPrefix, '')),
)
if (keysForRemoval.length > 0) {
console.log(
`Removing following keys from KV storage as they are no longer in the config: ${keysForRemoval.join(
', ',
)}`,
)
await deleteKvBulk(keysForRemoval)
Object.keys(stateMonitors.monitors).map((monitor) => {
// remove monitor data from state if missing in config
if (!configMonitors.includes(monitor)) {
delete stateMonitors.monitors[monitor]
}
// delete dates older than config.settings.daysInHistogram
let date = new Date()
date.setDate(date.getDate() - config.settings.daysInHistogram)
date.toISOString().split('T')[0]
const cleanUpDate = date.toISOString().split('T')[0]
Object.keys(stateMonitors.monitors[monitor].checks).map((checkDay) => {
if (checkDay < cleanUpDate) {
delete stateMonitors.monitors[monitor].checks[checkDay]
}
})
})
// sanity check + if good save the KV
if (configMonitors.length === Object.keys(stateMonitors.monitors).length) {
await saveKVMonitors(kvMonitorsKey, stateMonitors)
}
})
.catch((e) => console.log(e))

View File

@ -30,7 +30,9 @@ export default function MonitorCard({ key, monitor, data }) {
</div>
</div>
)}
<div className="text-xl">{monitor.name}</div>
<a href={monitor.url} target="_blank">
<div className="text-xl">{monitor.name}</div>
</a>
</div>
<MonitorStatusLabel kvMonitor={data} />
</div>

View File

@ -0,0 +1,12 @@
import { locations } from '../functions/helpers'
export default function MonitorDayAverage({ location, avg }) {
return (
<>
<br />
<small>
{locations[location] || location}: {avg}ms
</small>
</>
)
}

View File

@ -1,4 +1,6 @@
import React from 'react'
import config from '../../config.yaml'
import MonitorDayAverage from './monitorDayAverage'
export default function MonitorHistogram({ monitorId, kvMonitor }) {
// create date and set date - daysInHistogram for the first day of the histogram
@ -43,10 +45,10 @@ export default function MonitorHistogram({ monitorId, kvMonitor }) {
kvMonitor.checks.hasOwnProperty(dayInHistogram) &&
Object.keys(kvMonitor.checks[dayInHistogram].res).map((key) => {
return (
<>
<br />
{key}: {kvMonitor.checks[dayInHistogram].res[key].a}ms
</>
<MonitorDayAverage
location={key}
avg={kvMonitor.checks[dayInHistogram].res[key].a}
/>
)
})}
</div>

View File

@ -1,4 +1,5 @@
import config from '../../config.yaml'
import { locations } from '../functions/helpers'
const classes = {
green:
@ -24,7 +25,8 @@ export default function MonitorStatusHeader({ kvMonitorsLastUpdate }) {
<div className="text-xs font-light">
checked{' '}
{Math.round((Date.now() - kvMonitorsLastUpdate.time) / 1000)} sec
ago (from {kvMonitorsLastUpdate.loc})
ago (from{' '}
{locations[kvMonitorsLastUpdate.loc] || kvMonitorsLastUpdate.loc})
</div>
)}
</div>

View File

@ -3,6 +3,13 @@ import { useEffect, useState } from 'react'
const kvDataKey = 'monitors_data_v1_1'
export const locations = {
WAW: 'Warsaw',
SCL: 'Santiago de Chile',
MEL: 'Melbourne',
SIN: 'Singapore',
}
export async function getKVMonitors() {
// trying both to see performance difference
return KV_STATUS_PAGE.get(kvDataKey, 'json')

110
yarn.lock
View File

@ -1179,11 +1179,6 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
"@yarnpkg/lockfile@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
@ -1895,11 +1890,6 @@ chrome-trace-event@^1.0.2:
dependencies:
tslib "^1.9.0"
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
@ -3112,14 +3102,6 @@ find-up@^4.0.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
find-yarn-workspace-root@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
dependencies:
fs-extra "^4.0.3"
micromatch "^3.1.4"
findup-sync@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
@ -3130,10 +3112,10 @@ findup-sync@^3.0.0:
micromatch "^3.0.4"
resolve-dir "^1.0.1"
flareact@0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/flareact/-/flareact-0.9.0.tgz#c16ded48f217010452a509e02b754f84eb26878c"
integrity sha512-YT1nGqusHTJDreU5gQezKQNU2Pszez+M3v5IrKIEtOD3ABQal+cVoWzRQGQTWMKryrUpWB0Z0nRhLYDutD8xdQ==
flareact@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/flareact/-/flareact-0.10.0.tgz#1129eb5f1ef9048a66ba5319fa75ad27d5cc7842"
integrity sha512-BwcuJsNm1vuNs+V87Xs88ytTzGX2w5HAf4tOvThHAeWc4fEt8ID2m3fBLytPOO4ad+2mTYKwJE7Y5AzsNPx5hQ==
dependencies:
"@babel/core" "^7.11.0"
"@babel/plugin-transform-runtime" "^7.11.0"
@ -3216,24 +3198,6 @@ from2@^2.1.0:
inherits "^2.0.1"
readable-stream "^2.0.0"
fs-extra@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
dependencies:
graceful-fs "^4.1.2"
jsonfile "^4.0.0"
universalify "^0.1.0"
fs-extra@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
dependencies:
graceful-fs "^4.1.2"
jsonfile "^4.0.0"
universalify "^0.1.0"
fs-extra@^9.0.0, fs-extra@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc"
@ -3855,13 +3819,6 @@ is-callable@^1.1.4, is-callable@^1.2.2:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9"
integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
dependencies:
ci-info "^2.0.0"
is-color-stop@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
@ -4146,13 +4103,6 @@ json5@^2.1.2:
dependencies:
minimist "^1.2.5"
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
optionalDependencies:
graceful-fs "^4.1.6"
jsonfile@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
@ -4191,13 +4141,6 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
klaw-sync@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
dependencies:
graceful-fs "^4.1.11"
laco-react@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/laco-react/-/laco-react-1.1.0.tgz#8572117aabd245e9ff0000aab534c0f817da8238"
@ -4967,11 +4910,6 @@ os-browserify@^0.3.0:
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
@ -5094,24 +5032,6 @@ pascalcase@^0.1.1:
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
patch-package@^6.2.2:
version "6.2.2"
resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39"
integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==
dependencies:
"@yarnpkg/lockfile" "^1.1.0"
chalk "^2.4.2"
cross-spawn "^6.0.5"
find-yarn-workspace-root "^1.2.1"
fs-extra "^7.0.1"
is-ci "^2.0.0"
klaw-sync "^6.0.0"
minimist "^1.2.0"
rimraf "^2.6.3"
semver "^5.6.0"
slash "^2.0.0"
tmp "^0.0.33"
path-browserify@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
@ -5960,11 +5880,6 @@ postcss@^8.1.6, postcss@^8.1.8:
nanoid "^3.1.16"
source-map "^0.6.1"
postinstall-postinstall@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3"
integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==
prepend-http@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
@ -6678,11 +6593,6 @@ slash@^1.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
slash@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@ -7177,13 +7087,6 @@ timsort@^0.3.0:
resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
dependencies:
os-tmpdir "~1.0.2"
to-arraybuffer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
@ -7316,11 +7219,6 @@ unique-slug@^2.0.0:
dependencies:
imurmurhash "^0.1.4"
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
universalify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"