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

codt-2022-yappli

 codt-2022-yappli

Masahito Mochizuki

June 27, 2022
Tweet

More Decks by Masahito Mochizuki

Other Decks in Technology

Transcript

  1. 利用者視点での外形監視をしたいが・・・ • ブラウザリプレイ形式の外形監視:❎ ◦ 自分アプリなんで ◦ Appium版の外形監視欲しいなー(チラッ) • Ping形式の外形監視:❎ ◦

    障害を握りつぶしているケース ◦ 200だけどレスポンス内に「表示/利用できません」ケース ◦ 歴史的経緯でインフラ経路が様々(ALB→EC2→Aurora、CloudFront→S3、 NLB→Fargate→SQLite等) ◦ コア機能に絞ってもヘルスチェックをそれぞれ用意するのは大変 課題1:障害の緊急性にふさわしいレベルで通知されなかった
  2. var assert = require('assert'); var request = require('request'); var options

    = { uri: 'https://apiserver/api/show/123456', form: { contents_id: 'xxx' }, headers: { "User-Agent": "I am Android.", }, json: true }; request.post(options, function(error, response, body){ assert.equal(response.statusCode, 200); if (body.indexOf("使えるクーポン :あなただけのクーポン ") > -1) { console.log("OK"); } else { console.log("リトライ"); request.post(options, function(error, retry_response, retry_body){ assert.equal(retry_response.statusCode, 200); assert(retry_body.indexOf("使えるクーポン :あなただけのクーポン ") > -1); }); } }); 課題1:障害の緊急性にふさわしいレベルで通知されなかった requestを自由に加工 assertで独自の条件判定 条件分岐など自由に制御 ユーザー操作をそのまま シナリオとして実装 ヤプリのために用意してく れた機能では・・・?
  3. 課題2:障害が発生したサーバーからアラートが通知されなかった 通知全般を見直して必要なものが当たり前に飛ぶ状態 そして通知チャンネルを拡張 監視サービス #error #サービスA #ディスク容量不足 #warn #info #サービスB

    #サービスC #SSL証明書期限 切れ #脅威・セキュリティ 従来の総合的な通知 (New)サービス毎の通知 (New)特定アクションが 必要となる通知 *現在構築中
  4. • 従来の総合的な通知 ◦ サービス全体の健全性を俯瞰する ◦ 障害レベルごとに状況を把握する ◦ #errorではオンコールに直結して迅速対応する • サービス毎の通知

    ◦ どの系統で障害・変化が起きているか把握する ◦ 即時のアクションが不要な通知も積極的に流して中長期的な変化を捉える ◦ 課題3の解決と連動(後述) • 特定アクションが必要となる通知 ◦ ディスク容量が一定割合を超えたサーバ、期限が近づいている SSL証明書、脅威・セキュリティ系 の通知など、後続アクションが明確に決まっているものを把握する ◦ Slackスタンプで実施状況を可視化する(将来的にはチケット化など) 課題2:障害が発生したサーバーからアラートが通知されなかった
  5. • 大きく分類すると2種類の基盤がある ◦ PHP on EC2(旧系統) ◦ Go on Fargate(新系統)

    • 徐々に新系統に寄せているが旧系統も現役 • 他にも色々なインフラがあって複雑に関連し合っている ◦ Lambdaをベースとした配信基盤 ◦ Aurora、SQLite、Elasticsearch、DynamoDB、Redisなど依存サービス ◦ embulkをベースとしたETL基盤 ◦ 外部APIと連携するケース • 旧系統はロギングが弱い 課題4:障害の状況把握・原因調査に時間がかかる
  6. 課題4:障害の状況把握・原因調査に時間がかかる サービスA(旧系 統) サービスC(旧系 統) サービスB(新系 統) データベー スA 通常のアクセス量

    通常のアクセス量 通常のアクセス量 異常なアクセス量 異常なアクセス量 サービスC目線では、色々なところから利用される汎 用的なAPIを、サービスAから大量にコールされてい るところまでは分かる サービスA目線では、色々なところで サービスCをコールしているところまで は分かるが、このタイミングで激増し た要因が分からない(ログ等で目ぼし い情報もない)
  7. 課題4:障害の状況把握・原因調査に時間がかかる サービスA (旧系統) サービスC (旧系統) サービスB (新系統) データベー スA ある要因で特定テーブルが長時間

    ロック 解除待ちのSQLがたくさん滞留 サービスCが特定レスポンスを返却 DBコネクションが枯渇気味 サービスAが前述の不具合でループ DBコネクションがさらに枯渇気味 以下略
  8. 改善後 • 障害の緊急性にふさわしいレベルで通知されなかった • 障害発生したサーバーからアラートが通知されなかった • 特定ロールのエンジニアしか対処できない障害があった • 障害の状況把握・原因調査に時間がかかる •

    事前に予兆があったが気づけなかった 👍ユーザーシナリオを模したScripted API監視で即時対応 👍サービス・アクション毎のチャンネルで適切な通知 👍サービス毎のSlackチャンネルに対応ドキュメント 👍とりあえずAPM、落ち着いて全体を俯瞰しよう 👍ダッシュボードやメトリクス化で変化に気づく
  9. • 全ての系統にAPMを導入しサービス全体を俯瞰できる分散トレーシング基盤 • バックエンドだけではなく、フロントエンドやiOS/Androidのモバイル、セキュリティな ども監視 • 実際のデータを基準としたSLI/SLO管理 • ステージング環境に監視を入れて、定期的なQAプロセスに合わせて、監視サービ ス視点でも変化に気づける

    • エンジニアの開発環境にも監視を入れて、自身が加えたプログラム変更に対して、 QA前のエラーレート変化やパフォーマンス観点での気づき提供 • 本番同等の監視を入れた検証環境で、サーバーが死んだ時やデータベースが詰 まった時など再現し、アラートから復旧までの訓練・行動確認をしたい 妄想していた未来
  10. • まだまだヤプリは変化が激しいフェーズ 実際に利用されたデータ量に応じて課金されるため無駄がない ◦ 年間契約したものの途中から不要になるケース ◦ 検証などでほんの一時だけ使いたいケース ◦ スパイク時に一時的にインフラを増強するケース ◦

    余裕を見て多めにホストを用意しているケース • 一時的な利用超過に対する柔軟な対応 • 先の紹介の通り今後ヤプリでは重要性が高まるSynthetics(外形監視) ◦ 種類・頻度・ロケーションがコストに影響しない • NRQL(SQLライクなクエリ)で複雑な条件でも可視化・アラート • 迅速な日本語サポート、オンボーディングの手厚さ ◦ ユーザーグループの活発さ、活用事例も充実 Goodなポイント👍
  11. • GoのAPMがもっと使いやすくなるとGood👍 ◦ 計測したい単位でTransaction/Segmentの挿入が必要 ◦ redigoのインテグレーションがなかった ◦ nrmysqlでクエリが自動記録されない *それぞれ有志のOSSやワークアラウンドが公開されていたりする •

    Alertの条件がもっと分かりやすくなるとGood👍 ◦ ログをベースにしたAlertが条件を満たしても通知されなかった ◦ Fine-tune advanced signal settingsのStereaming methodをEvent timerに すべきだった(デフォルトがEvent flow) *日本語ブログで細かく説明されていたりする 改善してほしいポイント🙏