Upgrade to Pro — share decks privately, control downloads, hide ads and more …

日経電子版のアプリ開発を 支えるログ活用術/nikkei-log-201609

bungoume
October 28, 2016
1.3k

日経電子版のアプリ開発を 支えるログ活用術/nikkei-log-201609

bungoume

October 28, 2016
Tweet

More Decks by bungoume

Transcript

  1. 2 About me • 梅崎 裕利(うめざき ゆうり) • 日本経済新聞社 2014年入社

    • DevOps担当 ‒ Django+Elasticsearchで検索API・オートコンプリートAPIなど ‒ Fluentd+Elasticsearch+Kibanaでログ分析 ‒ Docker(Amazon Elastic Beanstalk)を使ったマイクロサービス化 ‒ Ansibleでサーバ管理
  2. 3 日本経済新聞 電子版でのElasticsearch利用 • 検索 ‒ 記事検索: 約500万記事、秒100クエリ前後 ‒ 企業名検索:

    約5万件 • ログ分析 ‒ アクセスログ: 約3億件/日 × 7日 (ロードバランサのログ) + 約1000万/日 × 3 × 60日 (各バックエンドサービスのログ) + 約2億/日 × 7日(Cloudfront) ‒ ユーザ行動ログ: 約1000万件/日 × 数年 ‒ エラーログ
  3. 4 検索機能としてのElasticsearch利用箇所 • 検索画面 ‒ 記事検索 ‒ キーワードハイライト ‒ アグリゲーション

    ‒ オートコンプリート • 記事画面 ‒ 類似記事 • アプリ ‒ 紙面を撮って関連記事を表示
  4. 5 きょう主に話すこと • 検索 ‒ 記事検索: 約500万記事、秒100クエリ前後 ‒ 企業名検索: 約5万件

    • ログ分析 ‒ アクセスログ: 約3億件/日 × 7日 (ロードバランサのログ) + 約1000万/日 × 3 × 60日 (各バックエンドサービスのログ) + 約2億/日 × 7日(Cloudfront) ‒ ユーザ行動ログ: 約1000万件/日 × 数年 ‒ エラーログ
  5. 7 アジェンダ • アクセスログとは • 分析にESを使うと何が嬉しいか • 具体的な利用例 ‒ ユーザ分析

    ‒ 運用・障害対応 ‒ サービス改善 • 今後 ‒ 実験中のこと ‒ 課題 ‒ ES5.0に期待していること
  6. 9 アクセスログを使った分析 • 従来 ‒ とりあえず圧縮して保管しておき、困ったときに秘伝のシェル芸を使って見る ‒ エラー数やアクセス数など、項目を事前に決めた上でバッチ集計して確認 • 問題点

    ‒ バッチ集計結果から詳細が気になったときは分析が面倒 ‒ 確認方法が変わってしまうため、時間がかかる上に可視化しにくい ‒ 項目を増やすのが難しい(≒バッチがどんどん増える) ‒ ◦◦APIの平均レスポンス時間と人気なURLと毎時リクエスト数推移と… • 理想 ‒ データベースに全部突っ込んでおいて、あとで必要なメトリクスを集計する
  7. 10 分析にES+Kibanaを使うと何が嬉しいか • 目的に合わせて都度、条件を指定して集計できる ‒ 複数の条件を指定してメトリクスを確認 ‒ 抽象的な情報を見てより詳細に確認できる ‒ 目的の数値を変更

    ‒ 例: レスポンス時間の平均値、最大値、99%タイル • 直接ログの中身が確認できる ‒ 詳細な分析がすぐに可能 • 高速 従来の問題が一通り解決
  8. 22 アプリ開発サポート • リクエストが異常に多いユーザがいる ‒ エラー時に無限リトライになっていた ‒ 非同期通信にバグがあった • 同じ画像に一人あたり数回リクエストしている

    ‒ 何度かリクエストする作りになっていた → 改修して通信量削減 • ログインできないという報告がある ‒ ログインでリトライしており不正アクセス検知に引っかかっていた • 権限エラーが出ている ‒ Client_IPやUA, ユーザID(独自ログ)などで対象の通信のみにフィルタ ‒ どこでエラーになっているか調査 ‒ 解約済みだった、期限切れトークンでリクエストしていたなど アプリのバグ調査
  9. 23 都度発生する特殊な障害対応/実際にあった例 • 調査:対象ブラウザ/影響ユーザ数を調べる 1. 該当pathリクエストのUAと、全体のUA一覧を取得 2. 全体のUA一覧から該当pathのUA一覧を除いたリストを作成 • 原因

    ‒ SSLの設定が問題で特定のブラウザからリクエストが来ていない ‒ CSSの記法が問題でファイルが読み込まれていない、など • TODO:修正が必要なファイルを調査 1. 対象ブラウザでアクセスがないPathを出力 特定のブラウザだけ特定のパスが表示できていない気がする
  10. 26 実験中のこと • デプロイ後のプロセスにKibana監視を追加 • 数分後にSlackにKibanaの状態を通知 ‒ サーバ切り替わり状況 ‒ リクエスト推移

    ‒ エラー状況 ‒ レスポンス時間の変化 • 数分間は自動でログを高頻度にチェック ‒ エラーが増えると自動で戻す
  11. 28 ES5.0に期待していること • 高速、省データ容量化 • Keywordフィールド:ログ用にスキーマを作りやすくなった • BM25/N-Best: 検索のスコアリングが改善 •

    Ingest Node: インデクシング時にデータを加工できる ‒ Apacheやnginxでのログの時間単位の違い(秒?ミリ秒?)をESで吸収できそう
  12. 30 サーバを準備する • Elasticsearch ‒ docker run -d -p 9200:9200

    --name es elasticsearch • Kibana ‒ docker run -d --link es:elasticsearch -p 5601:5601 kibana • Webserver ‒ https://github.com/bungoume/httpbin-container ‒ sudo docker run -d -p 80:80 -v /tmp/log:/log bungoume/httpbin-container • Log-sender(Fluentd) ‒ https://github.com/bungoume/log-sender-demo ‒ docker run -d --link es:elasticsearch.local -v /tmp/log:/data/log bungoume/log-sender-demo