推薦自動化監控網站運行服務 - Gatus

gatus dashboard

部署服務後,怎麼明確讓團隊清楚知道服務的運行狀況,就像 GitHub 就是提供整體運行的網頁,監控常用的操作指令,像是 Git Operations, Webhooks 或 GitHub Actions 等服務狀況。讓開發者遇到問題的時候,可以即時查看現在狀態做出相對應動作。而類似這樣的線上服務很多,像是 Atlassian 的 StatuspagePingPong 等,更多免費服務可以直接參考 awesome-status-pages。而本篇要介紹一套開源軟體 Gatus,它是用 Go 語言撰寫出來的,非常輕量。

影片教學

其他線上課程請參考如下

什麼是 Gatus

Gatus 提供一個輕量的監控服務健康網頁,讓開發者透過簡單的 HTTP, ICMP, TCP 等 Protocol 來監控服務狀況,並且根據網頁回應的 Status Code 或 Response time 及 Body 內容來決定網站是否健康,如果發生異常,可以設定不同的 Alert 像是 Slack, Email, Teams, Discord 或 Telegram 等常用的即時軟體。可以參考此連結看看 Dashboard 實際狀況。

為什麼選擇 Gatus

官方其實已經寫的很清楚

Why would I use Gatus when I can just use Prometheus, Alertmanager, Cloudwatch or even Splunk?

第一點各位開發者可以想看看,如何監控整個服務的狀況,而不是等到客戶遇到問題,你才知道狀況的發生。而 Gatus 可以從客戶角度對每個功能進行配置檢查,團隊可以根據重要的服務或接口進行監控,即時數據整理,才可以讓團隊比客戶更早知道狀況。

第二點團隊可以想看看,如果從 Prometheus 開始入手,是不是門檻過高,團隊真的有多餘的時間跟人力可以做到完整的監控,用 Prometheus + Alert 到 Grafana 監控頁面,需要花費不少時間跟人力才能完成,而這些指標,真的是客戶想看到的嗎?以及是否可以正確收到警報,這些配置都需要層層關卡,而 Gatus 透過簡單的設定,讓團隊可以快速監控整個服務,即時的通知設定,都可以在幾個小時內完成。

Docker 安裝

透過 Docker 安裝方式是最快的,搭配 Postgres,當然也可以用 SQLite 輕量資料庫。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '3.9'

services:
  gatus:
    image: twinproduction/gatus:v3.6.0
    volumes:
      - ./config:/config
    restart: always
    stop_signal: SIGINT
    stop_grace_period: 10s
    ports: 
      - 8085:8080
    networks:
      - web

  postgres:
    image: postgres:12
    volumes:
      - /data/monitor/database:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=gatus
      - POSTGRES_USER=gatus
      - POSTGRES_PASSWORD=gatus
    networks:
      - web

networks:
  web:
    external: true

大家可以看到還需要建立 config 目錄,裡面新增 config.yaml 檔案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
storage:
  type: postgres
  path: "postgres://gatus:gatus@postgres:5432/gatus?sslmode=disable"

endpoints:
  - name: TL API
    group: Transfer Learning
    url: "https://tl-api.xxxxxx/healthz"
    interval: 60s
    conditions:
      - "[STATUS] == 200"

啟動後,打開瀏覽器 http://localhost:8085 即可看到即時的網頁

Gatus 設定檔案

由於我們團隊有許多 Project,每個 Project 設計網站架構及服務,故可以透過 group 設定來區別不同專案設定。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
endpoints:
  # Monitor
  - name: Prometheus
    group: Monitor
    url: "http://pm.xxxxxx/-/healthy"
    interval: 10s
    conditions:
      - "[STATUS] == 200"
      - "[BODY] == Prometheus is Healthy."
    alerts:
      - type: email
        enabled: true
        description: "healthcheck failed"
        send-on-resolved: true

  - name: Grafana
    group: Monitor
    url: "http://gf.xxxxxx/healthz"
    interval: 10s
    conditions:
      - "[STATUS] == 200"
      - "[BODY] == Ok"
    alerts:
      - type: email
        enabled: true
        description: "healthcheck failed"
        send-on-resolved: true

  - name: Loki
    group: Monitor
    url: "http://loki.xxxxxx/ready"
    interval: 10s
    conditions:
      - "[STATUS] == 200"
      - "[BODY] == ready"
    alerts:
      - type: email
        enabled: true
        description: "healthcheck failed"
        send-on-resolved: true

  # Storage
  - name: Object
    group: Storage
    url: "http://object.xxxxxx/minio/health/live"
    interval: 10s
    conditions:
      - "[STATUS] == 200"
    alerts:
      - type: email
        enabled: true
        description: "healthcheck failed"
        send-on-resolved: true

從上面可以看到,我們在監控 Prometheus 健康狀況,除了設定 STATUS 之外,還可以設定比對 BODY,相當簡單。另外 Alerts 可以設定多種,像是 Email, Discord, Slack 等..,底下拿 Email 當範例

1
2
3
4
5
6
7
8
alerting:
  email:
    from: "srv_it_eas1_tester@xxxxxx"
    host: "smtp.mediatek.inc"
    username: "srv_it_eas1_tester@xxxxxx"
    password: "xxxxxx"
    port: 25
    to: "GSS_Global_AIDE_PA@xxxxxx"

看看 Email 通知訊息,可以很清楚看到所有條件偵測狀況

email alert

由於常有新的服務或者是測試,就需要常常動到設定檔,而 Gatus 提供了即時偵測檔案設定的變化,動態調整網頁的監控顯示,這點需要注意在 docker-compose 內不要把 config.yaml 直接掛上容器內部,我有發 PR 修正範例,改完後,可以透過 CI/CD 即時將設定檔放到服務內。底下來看看透過 Drone 該如何部署,兩個步驟就完成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
kind: pipeline
type: docker
name: monitor-gatus

steps:
- name: upload config
  image: appleboy/drone-scp
  settings:
    host: mtkmattermost.mediatek.inc
    username: deploy
    key:
      from_secret: monitor_key
    port: 22
    target: /home/deploy/monitor-gatus
    source:
      - config
      - data
      - docker-compose.yml

- name: deploy script
  image: appleboy/drone-ssh
  settings:
    host: mtkmattermost.mediatek.inc
    username: deploy
    key:
      from_secret: monitor_key
    port: 22
    script:
      - cd monitor-gatus && docker-compose up -d

其中目錄結構如下,之後團隊每個人都可以自己調整設定。

1
2
3
4
├── config
│   └── config.yaml
├── data
└── docker-compose.yml

Gatus 通知功能不足

如果大家使用過可以知道,所有的 Alert 通知,就只能設定一組資料,像是 Email,就只能設定一組 To 名單,而不能根據不同的 Group 來調整 To 名單,這個在去年作者也有發了 Issue 來記錄這點,我根據此點紀錄,也發了 PR 來補強 Email 功能,如果 PR 被接受了,那下一個版本就可以使用底下功能

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
alerting:
  email:
    from: "from@example.com"
    username: "from@example.com"
    password: "hunter2"
    host: "mail.example.com"
    port: 587
    to: "recipient1@example.com,recipient2@example.com"
    overrides:
      - group: "core"
        to: "recipient3@example.com,recipient4@example.com"

心得

我選擇此套原因就是簡單設定跟方便部署,除了監控網站服務之外,測試團隊其實可以拿這套,去寫大量的測試監控所有服務及效能,光是這點就可以替團隊省下不少時間做測試。另外每個服務還可以看到 response time 結果

cover


See also