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

tjinjin's blog

いつかすごいエンジニアになることを目指して、日々学んだことを書いていきます。

Mackerelでnginxのステータスコードをグラフ表示する

Mackerel fluentd nginx

GW明けから5月病に苦しんでいるブログ主です。Rails疲れしたので、最近社内で話題のMackerelをちょっと試してみたいと思います。すでに事例があるので、それをなぞる形ですね。

やりたいこと

作業一覧

  • Mackerelの個人アカウントを作成する
  • terraformでEC2インスタンスを起動する
  • EC2インスタンスにmackerel-agent, nginx, fluentdをインストールする

Mackererlの個人アカウントを作成する

  • githubのアカウントで簡単に登録できます。5ホストまでは無料なので、個人で使う分には問題なさそうです。最初はトライアル期間なのでほとんどの機能が使えます。mackerel-agentで利用するAPIキーがダッシュボードにあるので、それをメモしておきます。

terraformでEC2インスタンスを起動する

とりあえずEC2インスタンスが1ホスト起動していて、外からSSHできるような環境を作っておきます。

krossblack777/terraform-test · GitHub

EC2インスタンスに各製品をインストールする

mackerel-agent のインストール

$ curl -fsSL https://mackerel.io/assets/files/scripts/setup-yum.sh | sh
$ sudo yum install -y mackerel-agent
$ sudo vi /etc/mackerel-agent/mackerel-agent.conf
# apikeyを設定

初期のAPIキーはデフォルトが一緒みたいなので、マニュアル通りやっていけばそのままホストの登録までできそうです。気になる人はAPIキーを発行しなおしといた方がいいかもしれません。その後はインストールガイドに従い、ダッシュボードに対象ホストが登録されている状態にします。

nginxをインストールする

$ sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ sudo yum -y install nginx

ログの形式はltsvにしたいので、下記の用に設定ファイルを変更します。

    log_format ltsv  "time:$time_local"
                     "\thost:$remote_addr"
                     "\tforwardedfor:$http_x_forwarded_for"
                     "\treq:$request"
                     "\tstatus:$status"
                     "\tsize:$body_bytes_sent"
                     "\treferer:$http_referer"
                     "\tua:$http_user_agent"
                     "\treqtime:$request_time"
                     "\tvhost:$host";

    access_log  /var/log/nginx/access.log  ltsv;

fluentdをインストールする

$ curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-mackerel
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-datacounter

td-agentをインストールした後に、pluginをインストールする必要があります。

設定ファイルは下記のような感じです。

<source>
  type tail
  format ltsv
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx.log.pos
  tag raw.nginx
</source>

<match raw.nginx>
  type datacounter
  count_interval 1m
  count_key status
  aggregate all
  tag nginx.status
  outcast_unmatched yes
  # patternX: X(1-20)
  pattern1 2xx ^2\d\d$
  pattern2 3xx ^3\d\d$
  pattern3 4xx ^4\d\d$
  pattern4 5xx ^5\d\d$
</match>

<match nginx.status>
  type mackerel
  api_key XXX
  hostid_path /var/lib/mackerel-agent/id
  metrics_name http_status.${out_key}
  out_keys nginx_2xx_count,nginx_3xx_count,nginx_4xx_count,nginx_5xx_count
</match>

最終的に

これでうまくいくと思ったのですが、グラフが一向に更新されず。。。読み込み中のまま止まってしまうんですよね。データがなければデータがないと表示されると思うのですが。あと、やってる最中に気づいたんですが、Mackerelのドキュメントにfluentd使う方法が載っていました。先に気づいていれば…

追記

match部分をhostidではなくてserviceに変更した所、サイドバーのServiceの項目からカスタムメトリックが見れるようになりました。ここで出力先を制御しているみたいですね。仕様ちゃんと読めよというところですけどw

<match nginx.status>
  type mackerel
  api_key XXX
  service test
  remove_prefix
  metrics_name access_name.${out_key}
  out_keys 2xx_count,3xx_count,4xx_count,5xx_count
</match>

実際の画像はこんな感じになりました。200と404しか出力させてないので、偏ってますがグラフ化できてよかったです。

f:id:cross_black777:20150510153017p:plain

参考

fluent-plugin-mackerel の使い方 - Qiita

fluentdでサービスメトリックを投稿する - Mackerel ヘルプ