Day 3:让我看看你状态正不正常啊 - 架设 status page

昨天提到了有关监控的议题,监控服务的其中一个目的是为了在系统发生错误的时候可以即时的通知相关人员,其中一个常见的手法便是架设 status page。

什麽是 status page

那麽 status page 的作用是什麽呢?简单来说它就是一个告诉我们网站是否正常运作的一个服务。server 端会定期的对网站发出请求,并且依据收到的回覆来判断现在网站是否有正常在运作,可能的条件有 http 的 status code、回应时间或是回覆是否包含特定内容等。

而 server 在收到这些资讯之後会把他们收集下来,配合一个前端的页面让使用者方便浏览,只要打开浏览器就能看到服务在某段时间内的运作情形。有些甚至还会公告有关每次意外的说明,让使用者了解这些意外对他们造成的影响。现在市面上也许多服务皆有提供 status page,具体的例子有 GitHubGCP 等等。

(GitHub 的 status page)

(GCP 的 status page)

(上图为针对 GKE 的一份意外报告,里面提供的说明包含影响的时间、原因跟范围,并且提供了暂时的解决方法,如果有的话)

如何架设 status page

该如何架设 status page,其实网路上可以找到不少现成的解决方案,像是 Atlassian 的 StatuspagePagerDuty 等等,比起自己架设,使用这些云端的服务其实会更加可靠,毕竟 status page 对可用性的要求特别高,不然在故障发生时它自己也挂掉的话(如果把 status page 跟要监控的服务放一起或很近就很可能发生),我们就无法得知服务状态或是收到通知了。

今天我会挑选一个免费跟一个付费(但很便宜)的方案来展示,如何快速的帮自己的服务架设 status page。

Cloudflare Worker - Status Page

第一个选项是 Cloudflare Worker - Status Page,这名字还真够长的。它是透过 cloudflare worker 架设的,所以并不需要自己准备 server 来放,可以说是非常方便的选项了。

需求

  1. GitHub 帐号:不是必要,但因为作者是使用 GitHub Actions 来自动部署 worker,所以使用 GitHub 存放 code 跟设定是最方便的选项。
  2. Cloudflare Worker 帐号(按此注册):毕竟网站就是使用 Cloudflare Worker,所以这帐号还是必要的。

如何架设

其实 README 里面就写得很清楚了,若是我这边写的不清楚请去参考它吧。

首先我们打开 GitHub repo,在 README 的 Getting started 区段应该可以看到一颗 Deploy with Workers 的按钮,放心地给他按下去。

之後会跳转到这个部署 worker 的页面,首先我们需要授权,让 Cloudflare 可以透过 GitHub Actions 来部署。

那个 Authorize Workers 的按钮戳下去之後,会要求你输入一次密码,然後跳回来之後你应该会看到以下画面。其实这边我很纳闷为什麽他就没有再接续刚刚上一张图的步骤了...如果读者知道为什麽的话请告诉我。我的作法就是...再按一次。

下个步骤是需要设定 Worker account id,打开你的 Workers dashboard,在画面右边应该可以看到 Account ID。

然後还需要 API token,打开你的 profile,点上面的 Create Token 按钮。之後需要设定这个 token 的权限,我是直接使用 Edit Cloudflare Workers 这个预设模板。

填妥之後,应该已经有一个 status page 的 repo 被 fork 到你的帐号底下了。把它 clone 下来之後打开专案根目录底下的 config.yaml,我们需要修改几个设定:

  • settings.url:如果有做 Slack 通知的话,需要修改这项设定,会是你 status page 的 URL,以我的为例,就会是 https://status-page-production.bogay.workers.dev,最前面是 worker 名称,後面是我的帐号设定的 sub domain。
  • monitors:这底下填需要监控的对象,至少填上 idnameurl 就行,其中 name 是拿来显示在前端用的。

然後如果你是使用 free plan 的话,还需要修改 wrangler.toml 这个档案,降低 worker 监控的频率,才不会超过 Cloudflare 每天 1000 次的免费 KV 写入次数上限。

找到 cron 那行,把它的值改成 ["*/2 * * * *"],这样它会每两分钟发一次请求,我的话是把它改成五分钟了。

另外,在同一个档案底下,name 这个值定义了 worker 的名称,预设是 cf-workers-status-page,我自己觉得太长所以也把它改掉了。改完之後前面几行会长这样:

name = "status-page"
workers_dev = true
account_id = ""
type = "webpack"
webpack_config = "node_modules/flareact/webpack"

[triggers]
crons = ["*/5 * * * *"]

按照原本 repo 里面 README,这时候 push 上去触发部署就可以了,但没意外的话你应该会看到以下错误:

Error:  Your configuration file is missing the field ["kv-namespace id"] which is required to publish your worker!
 Your configuration file is missing compatibility_date, so a distant past date is assumed. To get the latest possibly-breaking bug fixes, add this line to your wrangler.toml:

    compatibility_date = "2021-09-16"

 For more information about compatibility dates, see: https://developers.cloudflare.com/workers/platform/compatibility-dates

原来 Cloudflare 为了确保官方 runtime 的更新不要影响到已经部署下去的 worker,还需要我们设定 Compatibility Dates,帮助他判断要使用的版本(详细说明可以参照官方文件),因此,我们需要在 wrangler.toml 里面再新增一行 compatibility_date = "2021-09-17",日期的部分填上部署当天的日期就行。

更新完之後,你的最前面几行应该会像这样:

name = "status-page"
workers_dev = true
account_id = ""
type = "webpack"
webpack_config = "node_modules/flareact/webpack"
compatibility_date = "2021-09-16"

这时候再 trigger 一次就应该会正常部署了,若是 GitHub Actions 都没有反应,请确定你是推到 main branch 上面,且有把 GitHub Actions 打开(预设应该是关闭的)。

接下来,连上你的 work,应该就能看到你的 status page 被架起来啦。

关於上述两个档案的修改,若是需要的话可以参考我的 repo,最新的几笔 commit 就是在调整这些设定。

updown.io

第二个选项是需要付费的 updown.io,它跟 Cloudflare 不一样,专门就是为了做监控而设计的服务,然而它在第一次注册的时候就会送你十万笔请求的额度,若是以单个网站,每分钟发送一次请求来算,已经可以用两个多月了。而且这个额度是可以自订的,最长可以到一个小时。

价格部分,updown.io 的作法是用储值的,最低的方案是二十万笔请求,价格为 5 欧元,所以就算是学生的预算不多我想基本上也是足以负担的。

若是使用信用卡付款的话,你的花费还会有一部份 (1%) 被用来移除大气中的二氧化碳,为环保尽一份力。

另外,在注册的时候每个人都会有一个邀请连结(像是我的就是 https://updown.io/r/f2YG3 ),别人若是使用这个邀请连结注册的话,他一开始便可以额外获得十万笔请求的额度(共二十万)。而在他第一次购买 credits 的时候,你也会收到十万笔请求的额度可以使用。

如何设定监控

updown.io 的设定我认为是相对简单不少的,只要注册一个帐号後,就会进到 checks 页面,在这里就可以让你设定想要监控的目标,包括网址、显示名称和抓取的时间间隔等等。

填上参数之後,按下最右边的储存按钮,updown.io 就会开始监控你的网站。以下图为例,就是希望可以每 10 分钟发一次请求给 https://noj.tw,并且预期的正常回覆时间是 0.5 秒。

检视 status page

当新增完欲监控的网站後,在靠近右边的地方,编辑按钮的左边就是 status page 的按钮。

点开後就能看到这个网站最近的状况(NOJ 的在这里),打开後他除了告诉我服务是否正常以外,还会提供一些统计资料。包含请求的回应时间,还有从不同地区发出请求後的等待时间等等,这边因为我们就只有学校在用,所以我就只有设定从台湾附近的几个点发请求。

在网页最下方还有比较长期的监控状态,可以让我们了解服务过去一阵子的状态。

在页面最上方可以控制是否要公开 status page,而且 updown.io 还支援设定自定义 domain。(当然 domain 要自备啦)

设定通知

updown.io 官方有支援数种通知方式,包括 email、手机简讯、telegram 等等,若是没有直接整合的,也可以透过 webhook 实现,因为我们团队使用 slack,所以这边就用它来示范。

打开 updown.io 的设定页面,在 notification 下面找到 slack 的部分,选择 Connect a channel,便会跳转到 slack 的页面,要求你授权给 updown.io 的 slack app。

在这边设定希望他发通知的 channel。

按下允许後,应该就会看到 bot 在你的频道跟你打招呼了,以後每当网页的状态有变,slack 这边就会收到通知。

小结

今天成功的设定完 status page,以後应该就不会有同学通知我才发现 NOJ 挂掉这种事情了。

参考资料


<<:  AE霓虹灯练习1-Day16

>>:  Day03 - 一边动手修改 Vue CLI 建立的专案一边复习 Vue 指令与资料夹结构

Day02 - Pure Function

yo! what's up! 本篇文章会简单地介绍基本的 Functional Programmin...

Day20 - [丰收款] 以Django Web框架实作永丰API线上支付模拟情境(1)

我们的丰收款主题完结了吗? 今天即使达成铁人赛的2/3赛程,在先前的篇幅已完整将每一个功能都实作出来...

资安学习路上-picoCTF 解题(Reverse)2

4.speeds and feeds Google後发现CNC 的language是"G-...

Day18 - 学了一点点 vuex

档案 vuex 说明 store/index.js state 像元件里 data() 的功能,存...

Day 07:「金鱼模仿游戏~」- 用 Tailwind 来对齐内容

(今天切换故事主线了喔,别再吐倒了哦) 相信很多在前端打滚、需要用到 CSS 的人,一定或多或少都...