【2023.08.02】

性能見える化で明るい未来を
AXLBIT株式会社
ソリューション部磯田 将太

Copyright AXLBITAXLBIT Inc.
Inc.All
AllRights
RightsReserved
Reserved

0

INTERNAL USE ONLY自己紹介
AXLBIT株式会社
磯田 将太 (Shota Isoda)

2022年4月新卒
所属：ソリューション部（自社サービスのインフラ部門）

Copyright AXLBIT Inc. All Rights Reserved

1

前置き
背景
• 弊社で開発運用している自社サービスのレスポンス性能の問題が増えてきていました。
• しかし実際にどれくらいの問題があるのか、性能を見たり統計値を取るのが、かなり大変な状態でした。
本発表で話すこと• 性能見える化するために、Elasticsearch, Kibana, td-agentを用いて実現した方法について話します。

Copyright AXLBIT Inc. All Rights Reserved2アジェンダ• 性能見える化ができていないことによる問題点• 性能見える化した方法• 性能見える化したことによる効果• 今回の改善で大変だった点• 今後の課題• まとめ

Copyright AXLBIT Inc. All Rights Reserved3性能見える化ができていないことによる問題点

Copyright AXLBIT Inc. All Rights Reserved4問題点その①

性能分析の工数が上がってしまう
具体的に何が問題か•••

性能問題を特定するまでの時間の増加
人的リソースの無駄
手作業の性能分析による正確性の低下

Copyright AXLBIT Inc. All Rights Reserved5性能分析の工数が上がる
性能分析の工数が上がる理由•

ほぼ手作業での性能分析になってしまっている。

具体的に、以下のような手順で性能を見る必要がありました。
1. 手作業で対象期間のログをログサーバから収集
2. 収集したログに対して、grepなどでパスであったり、レスポンスタイムなどの分析対象を抽出
3. そのログからエクセルなどで統計値を抽出
4. 他の範囲のログを分析したいとなったら1から繰り返し

Copyright AXLBIT Inc. All Rights Reserved6問題点その②
能動的に性能改善に取り組むのが難しい
具体的に何が問題か••

ユーザからの信頼を失う
開発者、運用担当の問題意識の欠如

Copyright AXLBIT Inc. All Rights Reserved

7能動的に性能改善に取り組むのが難しい
能動的に動くのが難しい理由••

性能劣化していたとしても気付くことが遅れてしまう。
レスポンスが遅いのが分かっていたとしても具体的にどこが原因で遅いのか調査するのが困難。

Copyright AXLBIT Inc. All Rights Reserved

8性能見える化した方法

Copyright AXLBIT Inc. All Rights Reserved

9Elasticsearch + Kibana + td-agent(Fluentd)を使用した見える化構成•••

td-agent(Fluentd)でログの収集
Elasticsearchで検索閲覧にKibana

Kibanaのvisualizeという可視化の機能を使用して見える化を実現したい

ログ収集対象ホスト

Copyright AXLBIT Inc. All Rights Reserved

収集

Elasticsearch

10

閲覧Kibanaどういった見える化を実現したかったのか？
例: nginxにおける• レスポンスタイムの平均、中央、最大などの統計値• パス毎のレスポンスタイムの統計値
上記のことをKibanaのvisualizeで見えるようにしたい。

visualizeで見える化を実現するためには、Elasticsearchに保存されているデータが基本的に以下の状態でなければならない。
• ログのデータが各項目毎に分割されいること。
• 各項目に分割されたデータの型が適切に指定されていること。

Copyright AXLBIT Inc. All Rights Reserved

11改善前の設定だとvisualizeを見える化で使用するのが困難
改善前の設定だと• ログのデータが1行でElasticsearchに保存されていて、ログのデータが各項目毎に分割されていない。
• 各項目に分割されたデータがElasticsearchに保存されるときに想定している型にならない可能性がある。
改善前までのElasticsearchに格納されていたデータ例"message": "192.168.xxx.xxx - - [DD/May/YYYY:HH:MM:SS +0900] "GET /hogehoge/fuga
HTTP/2.0" 200 7963 "https://hogehoge/fuga" "Mozilla/5.0 (Windows NT 10.0; Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" "-"“XXXXX" “XXXXXXXXXXXXXXXXXXXXXX" 0.418 48 8439",

Copyright AXLBIT Inc. All Rights Reserved

12改善した箇所
• td-agentのログ収集format• Elasticsearchのmapping

Elasticsearch

Copyright AXLBIT Inc. All Rights Reserved

13

td-agent(Fluentd)のログ取得方法を改善
改善前のtd-agentのinputの設定<source>
typeformat
path
pos_filetag</source>

tailnone/var/log/nginx/access.log/var/log/td-agent/buffer/nginx/access.pos
nginx.accessformatがnoneだと、ログが分解されることなく、1行でそのままElasticsearchに投げてしまい、ログの項目ごとにデータを扱えない状態になってしまう。項目毎にデータを扱えないと項目毎の統計値もとれなくなってしまう。
ログを分割するにはformatに正規表現を設定する必要がある。

ログ

このまま投げます！

192.168.xxx.xxx - - [DD/May/YYYY:HH:MM:SS+0900] "GET /hogehoge/fuga HTTP/2.0" 200 7963
"https://hogehoge/fuga" "Mozilla/5.0 (WindowsNT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/125.0.0.0 Safari/537.36" "" “XXXXX" “XXXXXXXXXXXXXXXXXXXXXX" 0.418 48
8439
Copyright AXLBIT Inc. All Rights Reserved

Elasticsearch
14format部分の改善方法
format部分の正規表現について
td-agent側であらかじめいくつかの定義が用意されているが、それ以外の場合は自分で正規表現を作成する必要がある。

•定義が用意されているものの例• apache• nginx• syslog• etc..

今回取得したいログでは、td-agent側で定義されている正規表現と実際のログフォーマットが一致するものはありませんでした。なので、取得するログの数だけ全て自分で正規表現を作成する必要がありました。
• 先ほどnginxは定義されているといいましたが、ログフォーマットをカスタマ
イズしている場合はtd-agent側で定義されている正規表現と一致しない場合があります。
•Copyright AXLBIT Inc. All Rights Reserved

15format部分の改善方法
改善後のtd-agentのinputの設定<source>type
tailformat/^(?<nginx_remote>[^ ]*) (?<nginx_host>[^ ]*) (?<nginx_user>[^ ]*)¥[(?<timestamp>[^¥]]*)¥] "(?<nginx_method>¥S+)(?: +(?<nginx_path>[^ ]*) +¥S*)?"(?<nginx_code>[^ ]*) (?<nginx_size>[^ ]*)(?: "(?<nginx_referer>[^¥"]*)""(?<nginx_agent>[^¥"]*)" "(?<nginx_forwarder>[^¥"]*)" "(?<nginx_ssl_protocol>[^¥"]*)""(?<nginx_ssl_cipher>[^¥"]*)" (?<nginx_request_time>[^ ]*)(?<nginx_request_length>[^ ]*) (?<nginx_bytes_sent>[^ ]*))?/
path/var/log/nginx/access.log
pos_file/var/log/td-agent/buffer/nginx/access.pos
tag
nginx.access</source>※赤い部分を改善
formatを正規表現で表すことにより、ログを分解できる。

Copyright AXLBIT Inc. All Rights Reserved16

改善後のイメージ
formatを指定することにより、各項目毎にログが分解できるようになる。
nginx_remote: 192.168.xxx.xxx
timestamp: DD/May/YYYY:HH:MM:SS +0900
nginx_method: GET
nginx_path: /hogehoge/fuga
nginx_request_time : 0.418
etc…

※各項目毎にデータを扱えるようになり、各項目毎の統計値を取れるようになりました。
ログを項目ごとに分解して投げます！

Elasticsearch
Copyright AXLBIT Inc. All Rights Reserved

17

Elasticsearchへの保存についてtd-agentの修正で、ログが分解できるようになった。
しかし、項目毎に想定している型にならないと今回実施したい見える化で使用できない。
見える化例その① : パス毎の統計値を取りたい
nginx_path : /hogehoge/fuga ・・・ 文字列型(string)を想定
キーワードとして扱われることが多いので、全文検索の対象となるようにしたい。また、正規表現の検索の対象としたいので文字列型の必要がある

見える化例その② : レスポンスタイムの統計値を取りたい
nginx_request_time : 0.418・・・ 数値型(float)を想定
数値演算や、グラフ化などに使用したいので数値型の必要がある。

Copyright AXLBIT Inc. All Rights Reserved

18データの型を指定するにはmappingの設定が必要
Mappingとはドキュメントとそれに含まれるフィールドをどのように保存し、インデックスを作成するかを定義するものです。
Mappingには静的Mappingと動的Mappingがあります。

Copyright AXLBIT Inc. All Rights Reserved19動的mapping
動的mappingは、Elasticsearchが自動的にfieldの型を定義してしまうので、こちらが想定していた型にならない可能性があります。

ログ投げます！

動的mappingで自動的に型判定します。
nginx_request_time : 0.418

Elasticsearch

Copyright AXLBIT Inc. All Rights Reserved20

静的mapping
静的mappingはこちらが指定した型でfieldを定義してインデックスを作成してくれます。
なので、各項目毎に明示的に型を指定することができます。

これはmappingに数値(float)とあるので、数値として保存します！

ログ投げます！
nginx_request_time : 0.418

Elasticsearch

Copyright AXLBIT Inc. All Rights Reserved21

Index Templatesに静的mappingを指定
今回は、Index Templatesに静的mappingを指定して、Index patternsにマッチするIndexが作成されたときは、静的mappingが設定されるようにしました。
mapping一部抜粋"nginx_request_time": {"type": "float"},"nginx_path": {"type": "text",},

Copyright AXLBIT Inc. All Rights Reserved

22

td-agentのformatとElasticsearchのmappingの設定を改善した結果
td-agentのformatにより、ログが各項目毎に分解されました。
ドキュメント（一部抜粋）"nginx_method": "POST","nginx_path": "/hoge/hoge/","nginx_code": "200","nginx_request_time": "0.xxx",

Elasticsearchのmappingにより、型を明示的に指定することができたました。
mapping一部抜粋"nginx_method": {"type": "text",},"nginx_path": {"type": "text",},"nginx_code": {"type": "integer"},"nginx_request_time": {"type": "float"},Copyright AXLBIT Inc. All Rights Reserved

23

Kibanaのvisualizeで見える化①平均、中央、最高、回数などの統計値を出したり②グラフ化して視覚的に性能推移を確認したり

Copyright AXLBIT Inc. All Rights Reserved

24性能見える化したことによる効果

Copyright AXLBIT Inc. All Rights Reserved

25

性能見える化したことによる効果
性能の指標が取りやすくなった。
• 今まで性能指標を取りたいときは、前述の手動手順が必要だったが、visualizeで取得可能になり、高速になった。
• KibanaのGUIだけの操作で性能指標が取れるので、CUIの操作が苦手な人でも性能指標が取れるようになった。

Copyright AXLBIT Inc. All Rights Reserved26

一部の機能に関しては、性能が劣化したら把握できるようになった
性能指標が取りやすくなったことにより、基本的な機能の部分に関しては、定期的に性能の推移をみるようになりました。
例• よく使用される画面のレスポンスタイムの推移

Copyright AXLBIT Inc. All Rights Reserved27

今回の改善で大変だった点

Copyright AXLBIT Inc. All Rights Reserved28

今回の改善で大変だった点
td-agent, Elasticsearchに共通することですが、各ログ毎にformatの正規表現や、型を指定する必要があったので、パターンが多く大変でした。
192.168.xxx.xxx - - [DD/May/YYYY:HH:MM:SS +0900] "GET /hogehoge/fuga HTTP/2.0" 200 7963 "https://hogehoge/fuga""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36""-" "XXXXX" "XXXXXXXXXXXXXXXXXXXXXX" 0.418 48 8439

どの項目毎に分解して、分解した項目はどのような型にするべきか、各MWのログ毎に判断が必要
td-agent側で分解"nginx_remote": "192.168.xxx.xxx ","nginx_host": "-",
"nginx_user": "-",
"timestamp": "DD/May/YYYY:HH:MM:SS +0900","nginx_method": "GET","nginx_path": "/hogehoge/fuga","nginx_code": "200",………etcCopyright AXLBIT Inc. All Rights Reserved

分解した項目毎に型を決める

29"nginx_remote": {"type": "text"},"nginx_host": {"type": "text"},"nginx_user": {"type": "text"},"nginx_method": {"type": "text"},"nginx_path": {"type": "text"},"nginx_code": {"type": "integer"},……etc

今回の改善で大変だった点
Elasticsearchのmappingは一度indexに登録されると変更、削除ができない。
静的mappingを指定する前に動的mappingによって作成されたindexの型が変更できなくなってしまいました。
"nginx_request_time": {"type": “text"},"nginx_path": {"type": "text",},同一のindexでは変更できない"nginx_request_time": {"type": “float"},"nginx_path": {"type": "text",},例えば、nginxのレスポンスタイムは数値として扱いたいのに、文字列型としてしまってもあとから変えられなくなってしまいます。

弊社の場合は日次で新しいindexを作成しているので、新しくできるindexの型は、明示的に指定することができました。

Copyright AXLBIT Inc. All Rights Reserved30

今後の課題Copyright AXLBIT Inc. All Rights Reserved

31

今後の課題性能見える化が一部手動の部分が存在する。
•

一部のMWのログなどで手動で性能を取得する必要があり、完全に自動化できていない。

一部手動の手順が属人化している。
• 一部自動化できていない弊害として、手動手順が誰でもできるようにドキュメント化がされておらず、属人化している。

Copyright AXLBIT Inc. All Rights Reserved32

今後の課題オブザーバビリティ（可観測性）を実現したい• 今回の改善で、オブザーバビリティの3本柱である。メトリクス、ログ、トレースのなかでログに関して、分析がしやすくなりました。
• これにより、システム全体を把握することに一歩近づきました。
• 今後は、オブザーバビリティを意識してメトリクスやトレースの収集も含めて、システムの可視化を強化していきたいと考えています。

Copyright AXLBIT Inc. All Rights Reserved

33

まとめ

Copyright AXLBIT Inc. All Rights Reserved

34

まとめ
以前は、性能見える化できておらず性能指標を取るのが大変だった。
Elasticsearch + Kibana + td-agentの設定を改善し、性能見える化を実現したことにより性能の指標が取りやすくなりました。
性能指標を簡単に取れるようになったことで、一部機能の性能の推移をみるようになり性能の劣化に気づけるようになりました。
性能見える化は、サービスの明るい未来に繋がってくることだと思いますので、参考になれば幸いです。

Copyright AXLBIT Inc. All Rights Reserved

35

は、一緒に会社を大きくする仲間・エンジニアを募集しております。
36
Copyright AXLBIT Inc. All Rights Reserved

36

を支える技術
運用監視

アプリケーション開発環境

運用基盤

開発管理・テスト
37
Copyright AXLBIT Inc. All Rights Reserved

37

採用情報についてのコーポレートサイトからアクセスしてご応募ください。
https://axlbit.com/recruit/

アクセルビット

本日、展示ブースに

Copyright AXLBIT Inc. All Rights Reservedのブースも出しているので是非立ち寄ってください！

38