> For the complete documentation index, see [llms.txt](https://training.onedoggo.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://training.onedoggo.com/tech-sharing/uncle-joe-teach-es-elastc-observability/metrics-guan-cha-xi-tong-de-jian-kang-zhi-biao/metrics-yu-metricbeat-de-ji-ben-jie-shao.md).

# Metrics 與 Metricbeat 的基本介紹

### 本篇學習重點

* 什麼是 Metrics
* Metricbeat 的運作架構與設計概念簡介
* 怎麼安裝及設定 Metricbeat 來收集 Metrics 資料

***

## 什麼是 Metrics

Metric 的中文是『指標』，在維基百科的定義為『a measure of some property of a piece of software or its specifications』\[1]，也就是一個對於軟體其中某些屬性的量測方法，這邊的屬性可以像是作業系統的 CPU、Memory、Disk I/O、資料庫的連線數…等。

一般使用 Metrics 所關注的這些資訊，也就是我們用來觀察系統健康指標的重要依據，與先前介紹的 Uptime 相比，Uptime 強調的是『生死』，也就是系統是不是活著的，而 Metrics 強調的是『各種表達系統狀態的指標數字』，讓我們知道系統運作的情況，如果以人的健康來比喻，就好比人的體溫、心率、血壓、血糖、體重…等，這些資訊可以讓我們知道人體的身體健康狀態，能協助我們判斷是否要做出一些生活作息的調整、去看醫生、吃藥…等安排。

收集並監控系統的 Metrics 已經是系統穩定度監控 (Monitoring) 行之有年、也常重要、做法也非常成熟的一件事了， 而 Metrics 也是這系列文章的主軸 - Observability 的三本柱 (Metrics, Traces, Logs) 之一，我們接下來將介紹，如何在 Elastic 的解決方案中，收集 Metrics。

## Metricbeat 的介紹

Elastic 針對 Metrics 的收集，主要是使用 Elastic Beats 家族裡的 Metricbeat，如同先前介紹過的 Heartbeat 一樣，Metricbeat 也是基於 `libbeat` 所開發，並且是一個很輕量的常駐程式，可以安裝在某台主機上，持續的收集這台主機本身的系統指標、或是運作在這台主機上指定服務的指標資訊，也能從這台主機透過網路收集另台遠端主機上指定的某個服務的指標資訊，並且將這些資訊送到指定的地點，例如 Elasticsearch 或是 Logstash，最終能透過 Kibana 的 Dashboard，從單一入口，來觀看這些散落在各地的 Metrics 資料。

![07-metricbeat-system-dashboard](https://i.imgur.com/lTibBKB.png)

### Metricbeat 的運作架構

Metricbeat 本身定義了基本的資料收集、處理、送出的邏輯，而收集的方法，因為每種系統或服務的接口都不一樣、或是要收集的資訊也不同，因此這部份是用模組化 (Modulized) 的設定架構，針對各種不同的服務開發出各種 module，並且在 module 裡面實作對應的處理。

Metricbeat module 本身能收集到的資訊，也必然是該服務有對外揭露的資訊，以下圖 Redis module 為例，Redis module 有提供一個 `info` 的 Metricset，而這個 `info` 的 Metricset 就是透過 Redis 的 `INFO` 指令取得資訊，另外像是 MySQL module 所提供的 `status` 的 Metrics 則是使用 `SHOW GLOBAL STATUS` 的 SQL 語法取得的資訊。

![07-metricsbeat-module-overview](https://i.imgur.com/3OGewD0.png)

圖片來源：[官方文件 - How Metricbeat works](https://www.elastic.co/guide/en/beats/metricbeat/current/how-metricbeat-works.html) \[2]

### Metricbeat 的設計原理

這邊列出幾個 Metricbeat 的重點原理，透過了解 Metricbeat 的運作設計，讓我們知道該如何使用 Metricbeat，減少錯誤的期待。

* Metricbeat 除了收集指定系統或服務的 Metric 之外，如果收集的過程發生錯誤，Metricbeat 會發送 error event，讓我們在之後分析時能知道有發生拿不到 Metrics 的資訊。
* Metricbeat 不支援彙總 (aggregation)，每一個時間點收集到的 event 都是獨立一筆，不支援把多筆 event 的結果進行加總、總計等，有這些需求都需要等資料到 Elasticsearch 之後再進行處理。
* Metricbeat 相較於一般的收集 Metrics 的工具比，他記錄不只是數字的資料，在不同的 module 裡，甚至會包含文字的內容，所以每個 module 裡所定義的 Metricset 在 Elasticsearch 也都會有對應的 Mapping 定義，以優化資料在 Elasticsearch 裡儲存及搜尋的效能。
* Metricbeat 會在將資料傳送到 Elasticsearch 時，將多筆的 events 存在同一筆 document 之中來傳送，以減少資料傳輸的 overhead，並且在 Elasticsearch 裡面使用 `array` 或是 `nested object` 的方式來存取這些資料，如果我們會需要將資料的格式存成像是 [Metrics2.0](http://metrics20.org/) 這種標準格式的話，要注意到這些資料在 Elasticsearch 是被合併儲存的，當然我們也可以另外透過 Logstash 等方式，將這些 raw event 拆開儲存。

## Metricbeat 的使用方式

要使用 Metricbeat 之前，要先另外準備好 Elasticsearch 和 Kibana，接著再進行 Metricbeat 的安裝，以下是使用最簡單的安裝步驟來做介紹，其實與官方的 Quick start 的文件差不多，先大約知道將 Metricbeat 運作起來的流程為何，我將會以 `MacOS` 為例。

1. 下載，並解壓縮 Metricbeat。

```
curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.14.2-darwin-x86_64.tar.gz
tar xzvf metricbeat-7.14.2-darwin-x86_64.tar.gz
```

1. 在解壓縮目錄下的 `metricbeat.yml` 指定 Elasticsearch 的位置

```
output.elasticsearch:
  hosts: ["myEShost:9200"]
  username: "metricbeat_internal"
  password: "YOUR_PASSWORD" 
```

1. 同樣在 `metricbeats.yml` 裡，也指定 Kibana 的位置，這是接下來要匯入 Dashboard 所使用的。

```
setup.kibana:
  host: "mykibanahost:5601" 
  username: "my_kibana_user"  
  password: "{pwd}"
```

1. 啟動要安裝的模組

```
./metricbeat modules enable {module_name}
```

Metricbeat 提供了非常多內建的模組 (modules)，像是 `Apache`、`HTTP`、`Nginx`、`MySQL`、`PostgreSQL`、`Redis`、`MongoDB`、`HAProxy`、`Zookeeper`...等，詳細可以查看 [官方文件 Metricbeat Modules](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-modules.html) \[3]。

另外針對啟動的模組，通常都會要調整這些模組的 config 檔，檔案的路徑就在 `./modules.d/` 裡面，檔名就會是 module 的名字，副檔名為 `.yml`。

1. 安裝 Metricbeat 內建的 Kibana Dashboard，以及 Elasticsearch 的 Index Template。

```
./metricbeat setup -e
```

1. 啟動 Metricbeat

```
./metricbeat -d
```

若是要以 `root` 執行，要記得把 config 的擁有者也改成 `root`

```
sudo chown root metricbeat.yml 
sudo chown root modules.d/system.yml 
sudo ./metricbeat -e
```

接下來就可以到 Kibana 查看 Metricbeat 所發送的資料，有沒有成功的進入到 Elasticsearch了。

## 參考資料

1. [Wikipedia - Metric](https://en.wikipedia.org/wiki/Metric)
2. [官方文件 - How Metricbeat works](https://www.elastic.co/guide/en/beats/metricbeat/current/how-metricbeat-works.html)
3. [官方文件 - Metricbeat Modules](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-modules.html)
