iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 30
0

Prometheus

Prometheus 是一套系統監測 (monitoring) 及警示 (alerting) 的工具,最早由 SoundCloud 這家公司所開發,現在則跟 Kubernetes 一樣加入 The Linux Foundation,成為 Cloud Native Computing Foundation 的其中一員。系統監控工具的選擇應該不少,像是 Nagios、Zabbix 等等,而 Prometheus 是近年來蠻受歡迎的一套。

因為是最後一天了,就直接把 Get Started 做掉。文件說這個 Get Started 是一個 "Hello World" 風格的教學,內容大概就是安裝、設置,然後用一個簡單的設定來使用它。首先是環境準備,先從 https://prometheus.io/download/ 下載,可以看到整個 Prometheus 有很多不同的元件,這裡下載 prometheus 就可以,請按照自己的環境下載合適的安裝檔,以 Ubuntu 為例,指令如下:

$ wget https://github.com/prometheus/prometheus/releases/download/v2.5.0/prometheus-2.5.0.linux-amd64.tar.gz
$ tar xvfz prometheus-2.5.0.linux-amd64.tar.gz
$ cd prometheus-2.5.0.linux-amd64

接下來修改設置檔的內容,讓它可以監控它自己,請打開 prometheus.yml,將原本的內容刪除,並置換成如下內容。

global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']

在下面 scrape_configs 的地方定義了一個監控的節點,位址是 localhost,也就是自己監控自己,並將原本預設 15 秒收取一次資料改成 5 秒。

接下來就可以執行 Prometheus,指令如下,

$ ./prometheus --config.file=prometheus.yml

首先是這個服務本身的狀態,可以透過 metrics 端點來查看,例如 http://localhost:9090/metrics,感覺起來這裡會把服務的訊息丟出來,然後 Prometheus 伺服器會定期抓取這些資料回去分析。另外它會起一個 Web UI,讓使用者可以透過網頁介面來查看系統的狀態。要訪問 Web UI,請直接拜訪 http://localhost:9090,範例畫面如下:
https://ithelp.ithome.com.tw/upload/images/20181114/20111953FIa73BKoDv.png

Tutorial 接下來的部分會略為說明如何使用 Web UI 介面。當然 Web UI 介面的操作並不難,困難的是這些數據到底說明了什麼。例如這裡示範的是 prometheus_target_interval_length_seconds,它是每次抓取主機狀態的時間間隔,原本的設定是 5 秒,但當然不會就剛好是準時 5 秒。按照範例在畫面輸入後按下執行,會出現以下的數據,一時之間無法瞭解它帶的那些類似參數的數值是什麼意義,而右邊的欄位是很接近 5 的數字。因為這裡只是作個示範,所以也不打算去仔細研究這些數據背後的意思。
https://ithelp.ithome.com.tw/upload/images/20181114/201119531lDf5UqZ06.png

接下來是 graph 介面的示範,位址端點為 graph,例如 http://localhost:9090/graph。這裡請輸入 rate(prometheus_tsdb_head_chunks_created_total[1m]) 後按下 Execute 執行,會出現如下列的圖形。一樣的目前也先不要管這個圖形代表了什麼意義。
https://ithelp.ithome.com.tw/upload/images/20181114/20111953TL9FE13kNV.png

只監控自己有點無聊,所以文件接下來以模擬的方式在本機執行三個 client 在不同的 port 上,再以伺服器抓取資訊。因為我們有虛擬機器,所以可以不用在同一個機器上執行三個 client。Prometheus 客戶端,官方提供 Go、Java (Scala)、Python 及 Ruby 四種客戶端程式庫,可視應用服務本身所用的語言來選擇,相關內容請參考 https://prometheus.io/docs/instrumenting/clientlibs/,以 Python 為例,先以 pip 安裝程式庫,指令為 pip install prometheus_client,接下來新增一 python 檔案,內容如下:

from prometheus_client import start_http_server, Summary
import random
import time

# Create a metric to track time spent and requests made.
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')

# Decorate function with metric.
@REQUEST_TIME.time()
def process_request(t):
    """A dummy function that takes some time."""
    time.sleep(t)

if __name__ == '__main__':
    # Start up the server to expose the metrics.
    start_http_server(8000)
    # Generate some requests.
    while True:
        process_request(random.random())

接下來執行此 python script,會起一個在 8000 port 的服務,即可取得監控數據,例如:

# TYPE request_processing_seconds summary
request_processing_seconds_count 1141.0
request_processing_seconds_sum 570.9092462062836
# TYPE request_processing_seconds_created gauge
request_processing_seconds_created 1542038242.758009
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 199274496.0

Prometheus 的 Get Started 就先到這裡。透過這個範例,大概知道了 Prometheus Server 端及 Client 端的安裝方式,並嘗試使用 Web UI 來查看所得到的數據。不過其實就像剛才提到的,工具的使用並不因難,難的是要透過監控系統取得哪些數據,以及要如何使用它們,這部分除了文件的說明之外,或許更需要的是經驗吧。


Intermission

三十天的挑戰終於進入尾聲了…。原本打算在三十天內寫完認證中提到的十一種工具,最後共寫了九種(包括這兩天只寫了一點 Get Started 的 Packer 和 Prometheus),分別是:

  1. Vagrant - 透過設定檔快速建立虛擬機器
  2. Git - 源碼版本控制系統
  3. Ansible - 透過設定檔對主機進行開通、設置
  4. Docker - 利用容器化技術以執行應用程式
  5. Docker Swarm - 將 Docker 應用程式部署到叢集中並管理
  6. Kubernetes - 對運行容器的叢集進行管理,提供許多高層的抽象介面
  7. Jenkins - 將 CI/CD Pipeline 自動化
  8. Packer - 針對不同平台建立客製化映像檔
  9. Prometheus - 應用服務系統監控工具

實際開始寫沒幾天之後就發現這個題目挑得太大了,如果是之前有研究過的東西,會因為覺得重要的東西太多而寫不完,但沒碰過的東西又很難在幾天內就抓到重點。接下來應該會把內容移回自己的部落格,把其他幾樣工具以及之前沒寫完或沒寫好的部分整理整理,另一件重要的事就是要去考證照,作為這一陣子所耗費心力的總結。

以前的我不想也不敢寫技術類文章,因為覺得每個題目幾乎都有人寫過,而且寫得更好,例如這次有寫的 Ansible、Git、Docker 之類的工具,每一項之前的鐵人賽都有前輩寫過三十天的主題系列還得獎。但一開始動手,才發現重點不是有沒有人寫過、寫得好不好、有沒有人看,而是透過書寫的過程,自己能夠對這個主題更加的熟悉,使用這些工具也更加有信心。

學習工具的使用沒有想像中的困難,難的是為什麼要用、用了後可以達到什麼效果,尤其是在沒有實務經驗或實際需求的狀況下,可能根本想像不到它的運用場景,然後就會開始懷疑自己學這個有用嗎,為什麼要學這個,類似像這樣的問題,這一點我到現在還是沒有答案。但經過這一個多月,我開始有個想法,如果覺得有興趣,那就去學吧,不要去擔心學了有沒有用,也不要擔心一學就忘,享受學習過程中帶來的樂趣,比如說調了很久的設定檔終於能照想像中的結果運行,而不要去想學習結束後會遇到的那些問題。抱持著這樣的心情,就不會覺得要一直追技術是件很辛苦的事,覺得有趣就去學,學過忘了就算了,大概是這樣的想法,這是我三十天來最大的收穫,那麼三十天就到此結束囉。


上一篇
[Day 29] Packer
系列文
30 天準備 LPI DevOps Tools Engineer 證照30

尚未有邦友留言

立即登入留言