くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

FluentBitでCPUやメモリの使用率が8割超えたらログを送る

前回の続き。システムの一部をCloud RunからVPS化のために、
VPS上のログをGCPのCloud Loggingに送信&検知できるようになったけど、
CPUやメモリ使用率でも通知を送りたいなと思い、
いろいろ試してみたときの備忘録(*´ω`*)

FliterのLuaプラグインを使う

ログを加工や絞り込みたいときには、Fliterを使う

今回は「CPUの使用率が8割以上」のような、
比較や計算などが必要なので、Luaプラグインスクリプト書く感じに。

CPU使用率のフィルタ

設定ファイルはこんな感じ。
Luaプラグインでは、
scriptでファイルの場所を、
callで呼ぶ関数を指定する。

[INPUT]
    name cpu
    tag  system.cpu
    interval_sec 1
[FILTER]
    name    lua
    match   system.cpu
    script  ./filters.lua
    call    cpu_filter

CPUの使用率計測はこのINPUTプラグイン

Filterなしだとこんな感じ。cpu_pがCPU使用率。

[0] [1452185189, {"cpu_p"=>7.00, "user_p"=>5.00, "system_p"=>2.00, "cpu0.p_cpu"=>10.00, "cpu0.p_user"=>8.00, "cpu0.p_system"=>2.00, "cpu1.p_cpu"=>6.00, "cpu1.p_user"=>4.00, "cpu1.p_system"=>2.00}]

呼び出す関数はこんな感じ。

-- ./filters.lua
-- CPU使用率
function cpu_filter(tag, timestamp, record)
  cpu_p = record['cpu_p']
  if cpu_p >= 80 then
    -- n%以上なら通知
    new_record = record
    new_record["type"] = "WARN"
    return 2, timestamp, new_record
  else
    return -1, timestamp, record
  end
end

returnの先頭にある数字は、以下を指定する

  • 0 ... 変更なし
  • 1 ... timestampとrecordをともに変更
  • 2 ... recordeのみ変更
  • -1 ... 削除(ログに表示しない)

これで、cpu_filter()が呼び出されて、
CPU使用率が80%以上の場合のみ、ログを出力する感じになる。

メモリ使用率のフィルタ

設定ファイルはこんな感じ。

[INPUT]
    name    mem
    tag     system.memory
[FILTER]
    name    lua
    match   system.memory
    script  ./filters.lua
    call    memory_filter

メモリ使用率計測はこのINPUTプラグイン

Filterなしだとこんな感じ。使用率はなく、全体と使用量から算出する。

[0] memory: [1488543156, {"Mem.total"=>1016044, "Mem.used"=>841388, "Mem.free"=>174656, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]

呼び出す関数はこんな感じ。

-- ./filters.lua
-- メモリ使用率
function memory_filter(tag, timestamp, record)
  mem_p = record['Mem.used'] / record['Mem.total'] * 100
  if mem_p >= 80 then
    -- n%以上なら通知
    new_record = record
    new_record["Mem.percent"] = mem_p
    new_record["type"] = "WARN"
    return 2, timestamp, new_record
  else
    return -1, timestamp, record
  end
end

使用率を計算して、CPUと同じように判定する

ログの転送

あとはタグを使って転送すればOK。
severitynode_idなどがないので、
Luaスクリプト内で指定するといい感じ。

[OUTPUT]
    name        stackdriver
    match       system.*
    severity_key type
    resource generic_node
    resource_labels location=asia-northeast1,namespace=system,node_id=$node_id
    labels host_name=${HOST_NAME}

あとはCloud Loggingのアラート機能で、
ログが転送されたら通知するようにすれば完璧(*´ω`*)


以上!! Luaでも意外となんとか書けるんだなぁ(*´ω`*)

参考にしたサイトさま