Grafana Alloy

Grafana alloy是Grafana的一個log收集工具,而且除了收集log以外,還能收集系統指標。

Grafana Alloy

原本我一開始是考慮要先研究怎麼使用grafana promtail把Log傳到Loki的, 但我在Promtail的文件上面看到,promtail 的功能已經完整了,未來新的功能,只會被加到Grafana Alloy上面。

在這邊我才知道,Alloy應該是比較新的,並且擁有更多的功能。Alloy除了可以偵測logs,還提供把一些系統指標抓取起來的功能。 所以最後想說既然要學,那我就先來學Alloy好了。

Components

Alloy的功能是圍繞在三種component上,運用以下三種component來做到把資料收集、處理、寫出去:

  • collector: 把資料收集起來

  • transformer: 對資料做額外處理

  • writer: 把資料寫出去

例如:我們可以利用loki.source.file 來偵測log檔案的內容變動,並收集起來,傳遞給loki.writer,把資料寫到Loki server上。

loki.source.file "foo_file" {
  targets    = [{__path__ = "/tmp/foo.txt"}]
  forward_to = [loki.write.local.receiver]
}
loki.write "local" {
  endpoint {
    url = "loki:3100/loki/api/v1/push"
  }
}

Collector

Alloy提供不同的Collector,讓我們能收集不同的logs。例如可以從檔案、HTTP、gRPC、message queue收集logs。

Transformer

Alloy提供不同的transformer,來讓我們對於collector收集到的logs做額外的處理,例如加上額外的metadata、過濾某些logs、壓縮整理logs,讓他更好傳輸到Loki上。

Writer

就是負責把收集好的logs送出去的元件,Grafana Alloy除了提供寫到Loki之外,也有提供不少寫到其它服務的Writer,例如Kafaka。


這邊是Alloy支援的Component 列表: components list


介紹完畢了,接下來就是開始安裝了

安裝

我是直接照著官網上面的做法,在macOS上面使用homebrew來安裝的。

  1. 首先,先把grafana的tap加到我的home brew上
brew tap grafana/grafana
  1. 再來就是使用home brew來安裝了
brew install grafana/grafana/alloy

這邊要注意的是,Alloy是一個背景作業的程式,他會一直執行監控要監控的目標。但因為我只是要在需要的時候打開,所以我會在需要使用的時候才打開,平常的時候會關掉它。

打開的指令

brew services start alloy

關掉的指令

brew services stop alloy

設定

接下來就要進入到重要關頭了,也就是設定Alloy的pipeline怎麼接。這個設定要寫在config.alloy這個檔案裡面。

不同安裝方式的config.alloy位置都不太一樣,像是home brew 安裝的Alloy會被放在/opt/homebrew/etc/alloy/config.alloy

我們可以在這個設定裡面,利用components,來組出我們希望Alloy執行的pipeline。

例如我們可以讓Alloy監控 /tmp/foo.txt 當它的內容有變更的時候,就把記錄寫到Loki上。

loki.source.file "foo_file" {
  targets    = [{__path__ = "/tmp/foo.txt"}]
  forward_to = [loki.write.local.receiver]
}
loki.write "local" {
  endpoint {
    url = "loki:3100/loki/api/v1/push"
  }
}

這邊要注意的地方是,對於Alloy的每個元件,我們都可以命名,並且會擁有一個完整的名稱。

例如loki.write “local” 會命名一個loki.write的component叫做local。 它會有個完整名稱叫做 loki.write.local ,這個名稱可以用來在別的component上面使用

(但只有被設計為Export的欄位可以被使用。)

以上面的例子來說就是

  1. loki.source.file.foo_file藉由foward_to來指定,指定說要把收集到的資料,送到loki.wrti.local.receiver這個接口

  2. loki.write.local會把receiver接口收到的資料,送到loki:3100/loki/api/v1/push上面。

接下來,設定完config.alloy後,我們就可以讓Alloy來重新載入設定了

用Debug Web來重新載入設定

首先連到Alloy的debug web界面:http://localhost:12345

要注意,它預設只能在架設Alloy的機器上,使用localhost來存取到,避免把secret的資料從debug資訊中暴露出去。

重新讀取設定,只要request這個頁面即可 http://localhost:12345/-/reload

成功重新讀取設定,會顯示reloaded的訊息。

如果有遇到config有寫錯,可以在存取reload頁面的時候,看到解析失敗的訊息。

如何確定有正確運作

可以到Alloy的log去檢查

以macOS homebrew安裝的Alloy的log,會被放在 /opt/homebrew/var/log 裡面。

可以在裡面查看alloy.err.logalloy.log 來看看是否有正常收集資料、處理資料、傳輸資料到Loki(或目的地)去。

ref

comments powered by Disqus