前回の続き。システムの一部を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。
severity
やnode_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でも意外となんとか書けるんだなぁ(*´ω`*)