NGINXのSPDYの送受信フレーム数を可視化する

Webサーバであれば当然、各レスポンスコード毎にグラフ化して4xxがしきい値を超えた場合はアラートを投げたりすると思います。


その他にも各種グラフはサーバ運用する上で非常に有益なものになります。SPDYやHTTP/2でも同様だと考えられます。


今回は、簡単ながら試しにNGINXでSPDYの各フレーム数をグラフ化してみた。


こんな感じで受信したSYN_STREAM,SYN_REPLYの数がグラフとして表示できる。

ざっくりと仕組み

NGINXでは、Log LevelをdebugにするとSPDYレイヤのログも表示されるようになります(凄い量でますが)。

2015/01/10 13:42:52 [debug] 21906#0: *2144 process spdy frame head:80030001 f:1 l:216
2015/01/10 13:42:52 [debug] 21906#0: *2144 spdy SYN_STREAM frame sid:1 prio:3
2015/01/10 13:42:52 [debug] 21906#0: *2144 posix_memalign: 0000000001BA5F60:4096 @16
2015/01/10 13:42:52 [debug] 21906#0: *2144 process spdy header block 206 of 206
2015/01/10 13:42:52 [debug] 21906#0: *2144 spdy inflateSetDictionary(): 0
2015/01/10 13:42:52 [debug] 21906#0: *2144 spdy inflate out: ni:00007F2044D250F0 no:0000000001BA704E ai:0 ao:833 rc:0


このdebugログからfluentdで回収・集計しFocuslightに投げ込んでいる。

集計に使用したログ行

色々なログが出てるがカウントするのに使用したのは大体以下のようなログ

2015/01/10 13:42:52 [debug] 21906#0: *2144 spdy SYN_STREAM frame sid:1 prio:3
2015/01/10 13:06:42 [debug] 21908#0: *1633 spdy PING frame
2015/01/10 13:42:52 [debug] 21906#0: *2144 spdy:1 DATA frame 0000000001BA78D8 was sent
2015/01/10 13:06:51 [debug] 21906#0: *1718 spdy:1 SYN_REPLY frame 0000000001BA78D8 was sent
2015/01/10 13:07:01 [debug] 21906#0: *1720 spdy send WINDOW_UPDATE sid:0 delta:2147418111

一番ほしい、GOAWAY、RST_STREAMが何故か上手く出なかった。
(https://github.com/nginx/nginx/blob/master/src/http/ngx_http_spdy.c#L2115)

td-agent.conf

tail -> datacounter -> growthforecast

<source>
  type tail
  path /var/log/nginx/debug.log
  pos_file /var/log/td-agent/nginx-debug.log.pos
  tag nginx.log
  format /^(?<time>[^ ]* [^ ]*) \[(?<level>[^\]]*)\] [^:]*:(?<message>.*)$/
</source>

<match nginx.log>
  type datacounter
  tag spdy.frame
  unit minute
  count_key message

  pattern1 SYN_STREAM SYN_STREAM
  pattern2 SYN_REPLY  SYN_REPLY.*was.sent
  pattern3 DATA DATA.*was.sent   
  pattern4 PING PING              
  pattern5 WINDOW_UPDATE spdy.WINDOW_UPDATE 
  pattern6 RST_STREAM RST_STREAM            
  pattern7 GOAWAY GOAWAY                    
</match>

<match spdy.frame>
  type growthforecast
  gfapi_url http://192.168.0.171:5125/api/
  service   my_server
  section   nginx
  name_keys nginx.log_SYN_STREAM_count,nginx.log_DATA_count,nginx.log_SYN_REPLY_count,nginx.log_DATA_count,nginx.log_PING_count
</match>

おわりに

ざっとグラフ化出来たので何か面白い事できないか考える(fluentd力あげたい
NGINXの内部パラメータとかもグラフ化出来たら楽しそう
HTTP/2でも多分おんなじ感じで出来るはず