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でも多分おんなじ感じで出来るはず