はじめに
ファミリーマートのアプリ「ファミペイ」では、オブザーバビリティを高めることで、顧客体験の改善に取り組んでいます。
今回は、構造化されていないテキストログをNewRelicに取り込むことで、ログを障害原因調査以上に活用することができました。
システムの状況
- ネイティブアプリ→サーバ→DBのオーソドックスな構成
- 協力会社にシステム開発を委託
- サーバは構造化されていないテキストログを出力
- ログはAmazon CloudWatch Logsに取り込み
これまでのログ調査
NewRelic導入前のログ調査は、「Amazon CloudWatch Logs上で発生時刻のログを流し見し、目grepする」や「高度な分析はCSVダウンロードしてエクセル上で解析」ということをしていました。
また、Amazon CloudWatch Logsのみにログを取り込んでるため、CloudWatch Logsの機能やどのログがどのように保存されているかを熟知している担当者のみログ調査可能で、ログ調査は特定の担当者に集中していました。
NewRelicを導入するも…
このような状況の中で、NewRelicを導入してログを取り込んだところ、使いやすいUI(時刻指定、検索結果の時系列グラフ化等)のおかけでログ調査の負担は改善しました。
しかしながら、取り込むログ自体はどのようなログが出ているかを熟知している担当者のみログ調査しており、それ以上の活用はできていませんでした。
その後も「ログ調査は便利になったものの従来のログ調査ぐらいしか活用できていない」という悩みを抱え、NRUG(NewRelicユーザ会)に参加し、様々な活用事例を聞いていましたが
- 自社システムのログは構造化ログではないため、分析/集計しづらく、ビジュアライズも難しい
- 生ログはログの特徴を熟知していないと読みづらい
- ビジネス側には生ログはとっつきづらい
という理由かからこれ以上のログ活用は難しいと考えていました
NewRelicの機能を活用!
しかし、NewRelicテクニカルサポート様と会話していく中で以下のような機能を使えるのではないかというアドバイスをいただきました
- ログの時系列グラフ化(TIMESERIES)
- ログを正規表現でパースし、複数の時系列グラフを表現する(FACET)
- ダッシュボードの変数機能
実際に作ったもの
エラーコード別の時系列グラフ
使った機能
facet関数
対象となるログ
[INFO ] 2024-11-20 19:01:11,434 foo=123 bar=123 action=get errorCode=123
エラーコードを正規表現でパースするNRQL
select count(*) from Log where 'action=get' facet capture(message,r'.*erroCode=(?P<erroCode>\d).*') timeseries
このグラフを使って、新機能リリース前後に増加しているエラーコードがないかを確認しています。
また、「Create a chart」でグラフの共有リンクを払い出し、ビジネス部門担当者にも共有しています。
これにより、チャットでのアクセス状況の報告が不要になりました。
※Pro以上のプランが必要
ビジネス向けのBIツール
使った機能
- 変数機能
- LookupTable(エラーコードをCSVで取り込み)
このダッシュボードでは会員番号を入力すると、当該会員のログを表示するだけでなく、生ログをわかりやすい言葉に置き換えて表示しています。
これを使うことでログに関する知識なしに、あるお客様がいつどのような操作をしたかを調べることができるようになりました。
運用していて感じた課題
ログパターンごとに正規表現を書くのが大変
NewRelicは、ログ取り込み時点でログを正規表現でパースできるGrokパターンという機能があり、これを使うことで、非構造化ログとして取り込むことができます。
この機能を使えば、NewRelic内でログを構造化ログとして扱えるので、各段に扱いやすくなります。
※Grokパターンでパースした結果は、生ログに戻せないので本番運用時は要注意
一つのログを複数行で出力している
2024年から複数行のログにGrokパターンが対応した
ダッシュボードの描画に時間がかかる
①ログを個別のパーティションとして分割して取り込むことができるパーティション機能を使い、パーティションを指定したNRQLを書くことで検索が早くなる
※パーティションを分割するとLogイベントに関する既存のNRQLすべてに影響を受けるので注意
②これまで正規表現でパースするNRQLとしてcapture関数を使っていましたが、機能は制限されますがaparse関数を使うと検索が早くなる
これからやりたいこと
構造化ログの出力
ログフォーマットの変更や新機能追加ごとにNewRelic上で対応するのではなく、システムから構造化ログを出力する
新機能リリースごとのダッシュボード追加対応の自動化
機能追加ごとにダッシュボードにウィジェットを追加するのではなく、リリース時にNewRelicのAPIを使って自動的にウィジェットを追加する
おわりに
ファミリーマートでは、金融・デジタル戦略を支える自社決済アプリ「ファミペイ」の運用メンバーを募集しています!
累計2,000万ダウンロードを超え、社会インフラとなりつつある「ファミペイ」の運用に少しでもご興味があればぜひ以下サイトからご応募ください!