k6のドキュメントから負荷テストを学ぶ

k6はドキュメントが充実して勉強になるらしいので、負荷テスト初心者として読む

observability
オブザビリティと読んでしまっていたけど、オブザーバビリティなのね。
ブラックボックスであるシステム内部の状態をどれくらい知ることができるかの指標。
システムの健康状態を知る。
人間基本的に外部からみて健康かどうかはわからないが、体温を測定することで体調不良かどうかの目安がつくみたいな?
従来のモノリスで完結するシステムであれば、不具合が発生したとき、生成されたログをみたりしてデバッグができたけど、マイクロサービス化していくと、それだけじゃデバッグしにくいよね、みたいな。もっと、積極的に内部システムを可観測にしていこうよ、という話。

observabilityで扱うデータの種類
メトリクス
メトリクスは何かが失敗する頻度を教えてくれるが、その理由はわからない。
よく収集するメトリクス
- メモリやストレージなど、現在使用されているシステムリソースの数
- 特定のサービスがリクエストに応答するまでにかかる時間
- 現在アプリケーションにアクセスしているユーザーの数
毎日体温測ると平熱こえてるから体調不良になっているとわかるが、なぜ体調不良になったのか原因まではわからない、みたいな?
ログ
ログは、障害や問題の根本原因が含まれていることがよくある重要なデータ。
ログを活用すれば以下の分析も可能
- 1 秒あたりに処理されるリクエストの数はいくつですか?
- リクエストの何パーセントが失敗していますか?
- 先月訪問したユーザーのうち、今月戻ってきた人は何人ですか?
- 1 日に何人のユーザーがサイトにアクセスしていますか?
twitterのツイートが、あとから医者にその日の行動を伝えるのに使えたみたいな?
トレース
トレースにより、根本的な原因を理解しやすくなり、システム喉の部分が遅いのか、またはその他の問題が発生しているのかを特定しやすくなる。
ログを強化して同一リクエスト内部の関連性を紐づけたものと理解。
プロファイル
アプリケーションのプロファイリング。各言語に備わっているパフォーマンス測定ツール。
アプリケーションレベルでCPUやメモリがうまく扱えているかをみる。
メトリクスやログは時系列データとして管理する必要がある。

メトリクス
observalibityの3つの柱はメトリクス、ログ、トレース。
このうちメトリクスは、時系列数字データとして扱うことが一般なので、そのままグラフ化しやすい。
また、その数値が異常値に場合をトリガーになにかアクションをとりやすい。
メトリクスを監視することで、すばやく問題が発生したことを認知でき、積極的な対応が可能になる。SLOを達成するためには重要。
例えば、心拍数を計測するセンサーがベッドに備え付けられていたとして、心拍数が低下したときアラートを出して職員に知らせるなど。

時系列データの難しさ
1時間に1回気温を測定するとする。すると1日24回測定される。それを単純にグラフにプロットすれば、1ヶ月に24×30=720点のデータになる。
これだけでも傾向値はわかるが、もっと測定間隔が短い場合、例えば1ヶ月で10000点のグラフになると、よくわからなくなる。そこで1日ごとの平均をとって1ヶ月で30回のデータとすれば、かなり見やすい。
このように時系列データはGoogleマップを拡大縮小するように、データを一定の間隔(窓)ごとに集計して表示したいニーズがよくある。これを達成できるデータベースを時系列データベースという。
元データをそのまま上書きせず残し、窓ごとに集計して表示させるため、単にデータを表示されるよりもCPUリソースやメモリリソースを消費する(もちろんキャシュもするだろうが)。

パフォーマンステスト
パフォーマンステストを行うことで、実稼働環境前にリクエスト数に対するメトリクスの目安を知ることができる。
さらに、それを実際のシステムメトリクスと一緒に視覚化すればシステムがいまどの状態でどこまで余裕がありそうかがわかる。これがgrafana cloudとk6を一緒に利用するメリット。
パフォーマンステストにおいて重要なこと
- 実際のユーザーの行動(シナリオ)をテストすること
- 想定ユーザー数のリクエストをすること
シナリオを使用して、さまざまなトラフィック パターンと動作をモデル化します。コミュニティが運営する百科事典の例では、1 つのシナリオで 1,000 人の同時ユーザーがさまざまなテキスト ページを読むことをシミュレートし、別のシナリオでは、ログインしてからアプリケーション データベースへの書き込みを引き起こすアクションを実行する 100 人の編集者をシミュレートできます。各シナリオには、異なる負荷形状 (たとえば、ランプまたは一定) も設定できます。

とりあえず一般的なものとして学べるのはこれくらいか