読者です 読者をやめる 読者になる 読者になる

decadence

個人のメモ帳

mackerel-agentから見るサーバリソースの見方

なにこれ

はてなが出してるサーバ監視サービスであるmackerel
サーバに常駐させるagentがGitHubで公開されてる
mackerelio/mackerel-agent · GitHub

これを眺める事でどの値を見るべきなのか、どのようにして取得するのかを主要な所のみ学べるのでは
http://www.flickr.com/photos/82825649@N00/438036244
photo by richard ling

そもそも

メトリック仕様 - mackerel.io ヘルプ があるわけだけど、どうやって取ってるのとかを見るのが趣旨

送信タイプ

agentは長い周期で定期的に送信する値と短い周期で定期的に送信する値を持つ
package名にならって前者をspec、後者をmetricsと呼ぶ
以下のようなテンプレートに習って記述する、つもりだったけどグダグダになった

  • mackerel-agentで見る構造体名の一部を用いた区分
    • [command|file]command名 or ファイル名
    • (comment)
      • [option]: 個々の値の取り方とか, 個々の値の取り方とか,...
      • [regex]: 個々の値の取り方とか, 個々の値の取り方とか,...

個々の値はコマンドのオプションを使ったり、まとめて出した結果から正規表現で抜き出したりもする
regexにはソースにきちんと正規表現が書いてるが、コピペするのは億劫なのでその一部分のみを載せる
コマンド1発で出てくる値を用いている場合もある

ちなみに、mackerel-agentのソースは mackerelio/mackerel-agent at 124f303f3c62edd12514fba57f0c8aa307ad396f · GitHub のコミットのものを見てるし、linuxのしか見てない

spec

specは初回登録時にすぐに実行され、その後は送信頻度を少なくするように周期を長くとって送信する値である
頻繁に変化するのではなく予めサーバに決められたスペックなどを表すものになっているはず
無限ループを実装する関数の中のこのあたりでgoroutineとして呼ばれてる
以下の5種類の区分から値が複数個送信される

  • Kernel
    • [command]uname
      • [option]: -s, -r, -v, -m, -o
  • CPU
    • [file]/proc/cpuinfo
      • [regex]processor, vendor_id, cpu family, model, stepping, physical id, core id, cpu cores, model name, cpu MHz, cache size, flags
  • Memory
    • [file]/proc/meminfo
      • [regex]MemTotal, MemFree, Buffers, Cached, Active, Inactive, HighTotal, HighFree, LowTotal, LowFree, Dirty, Writeback, AnonPages, Mapped, Slab, SReclaimable, SUnreclaim, PageTables, NFS_Unstable, Bounce, CommitLimit, Committed_AS, VmallocTotal, VmallocUsed, VmallocChunk, SwapCached, SwapTotal, SwapFree
  • BlockDevice
    • [file]/sys/block/:deviceName/size
    • [file]/sys/block/:deviceName/removable
  • Filesystem
    • [command]df -P
      • 全て送信 ⇒ Filesystem, 1024-blocks, Used, Available, Capacity, Mounted on

metrics

metricsは短い周期で値が収集され、送信されるもの
動的にすぐに値が変化して、特にサーバリソースの監視すべき値が含まれているはず
この辺で値の収集が行われ、この辺で周期的に送信している*1
以下の6種類の区分から値が複数個送信される

  • Loadavg5
    • [file]/proc/loadavg
    • (2列目、つまり過去5分間の CPU 及び IO の使用率のみ送信)
  • Cpuusage
    • [file]/proc/stat
    • (合計値である出力の1行目とcpu数を基に、// percentage of increased amount of CPU time、増加量の百分率を送信してる)
  • Memory
    • [file]/proc/meminfo
      • [regex]MemTotal, MemFree, Buffers, Cached, Active, Inactive, SwapCached, SwapTotal, SwapFree
  • Uptime
    • [file]/proc/uptime
    • (1列目、つまりシステムが起動してから経過した合計時間のみ送信)
  • Interface
    • [file]/proc/net/dev
    • (全ての値の増加量を送信)
      • receive: bytes, packets, errs, drop, fifo, frame, compressed, multicast
      • transmit: bytes, packets, errs, drop, fifo, colls, carrier, compressed
  • Disk
    • [file]/proc/diskstats
    • (4列目以降全ての値の増加量を送信)

ユーザ定義のメトリックを投稿する - mackerel.io ヘルプ で用意された値もmetricsで送信されてるけど割愛

結び

個々の取得する値に対して何か書こうと思ったけど多いからやめた

*1:どうでも良いけど参照透過性について固執せず、書いてる言語によって完全に頭切り替えるのが良い