dstatでサーバの状態を取得して、fluentdで集めて、growthforecastでグラフにする、というのをやってみました。

dstat

dstatというのは、CPU使用率やメモリ使用量などなどの情報を手軽に取得できるツールです。
とっても簡単に使えます。 使い方は以下のサイトを参考にしてみてください。

まずはdstatが必要なのでインストールします。

dstatをfluentdにつなぐのに、shun0102/fluent-plugin-dstat を利用します。
ただ、outputのフォーマットがそのままgrowthforecastに入れるのにうまくつなげなかったので、少しいじって使いました。tjun/fluent-plugin-dstat

追記

しかし、以下の記事のようにやればいじることなくdstatからgrowthforecastに投入できるので、このようにやることをおすすめします。

追記終わり。

設定はこんな感じ

type dstat
tag dstat
option -cmdn delay 5

growthforecast

growthforecastは、APIに投げたデータをグラフィカルにしてくれるツール。
GrowthForecastというグラフ表示ツールで捗る話 - blog.nomadscafe.jp

これもまずはインストールします。 fluentdのpluginはFluentd plugins を使います。

設定はこんな感じ。

<match dstat>
  type copy
  <store>
    type growthforecast
    gfapi_url http://localhost:5000/api/
    service dstat
    section cpu
    name_key_pattern cpu-.*
  </store>
  <store>
    type growthforecast
    gfapi_url http://localhost:5000/api/
    service dstat
    section mem
    name_key_pattern mem-.*
  </store>
  <store>
    type growthforecast
    gfapi_url http://localhost:5000/api/
    service dstat
    section dsk
    name_key_pattern dsk-.*
  </store>
  <store>
    type growthforecast
    gfapi_url http://localhost:5000/api/
    service dstat
    section net
    name_key_pattern net-.*
  </store>
</match>

すると、以下のような感じでCPU使用率やメモリ使用量が表示できるようになりました。


同時に、nginxのアクセスログの集計もやって、アクセス数のグラフやリクエストタイムの割合のグラフも出してみました。

参考にしたサイト

まずnginxのログフォーマットを少し変えました。

log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time';

データの集計には、tagomoris/fluent-plugin-datacounterを使いました。

fluentdの設定は以下のような感じ。

type tail
format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<reqtime>[^\]]*)\] "(?<method>[^ ]*) (?<path>[^ ]*) [^\"]*" (?<code>[^ ]*) (?<size>[^ ]*) "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" (?<response_time>[^ ]*)$/
path /var/log/nginx/access.log
tag nginx.access
pos_file /etc/fluent/nginx_pos

# counter
<match nginx.access>
  type copy
  <store>
    type file
    path /var/log/fluent/access
  </store>
  <store>
    type datacounter
    #unit hour
    count_interval 10m

    count_key code
    aggregate all
    tag nginx.datacount.web
    pattern1 2xx 2\d\d
    pattern2 3xx 3\d\d
    pattern3 4xx 4\d\d
    pattern4 5xx 5\d\d
  </store>
  <store>
    type datacounter
    #unit hour
    count_interval 10m
    count_key response_time
    outcast_unmatched true
    aggregate all
    tag nginx.datacount.response
    pattern1 0_10ms 0\.00\d+$
    pattern2 10_100ms 0\.0[1-9]\d+$
    pattern3 100_500ms 0\.[1-4]\d+$
    pattern4 500_1000ms 0\.[5-9]\d+$
    pattern5 1_1.99s 1\.\d+$
    pattern6 2_4.99s [2-4]\.\d+$
    pattern7 5_9.99s [5-9]\.\d+$
    pattern8 10s_over \d{2,}\.\d+$
  </store>
</match>

#growthforecast
<match nginx.datacount.**>
  type growthforecast
  gfapi_url http://localhost:5000/api/
  service nginx
  tag_for section
  remove_prefix nginx.datacount
  name_key_pattern .*_(rate|count|percentage)$
</match>

リクエストタイムの割合の変化

これを見ると、結構時間かかってる事がわかる。

これとは別に、status code別のアクセス数の推移も見れるようになりました。