Slide 1

Slide 1 text

k 6 を活 用 した再現性 ・ 拡張性の 高 い 負荷試験基盤の構築 株式会社サイバーエージェント 岩 見 彰太 GitHub:@BIwashi X: @B_Sardine 負荷テストツール4選!ユーザーが語る効果的なパフォーマンステストのプラクティス!

Slide 2

Slide 2 text

自己 紹介 岩 見 彰太 / Iwamin 株式会社サイバーエージェント ೥౓৽ଔೖࣾ "*ࣄۀຊ෦ڠۀϦςʔϧϝσΟΞ%JW アプリ運 用 カンパニー @BIwashi @B_Sardine (Pͷ1SPUPDϓϥάΠϯΛ׆༻ͨ͠ޮ཰తͳෛՙࢼݧઓུ 0QFO'FBUVSFͱࣗಈੜ੒Λ׆༻ͨ͠ϑΟʔνϟʔϑϥάͷએݴత ू໿؅ཧ

Slide 3

Slide 3 text

はじめに

Slide 4

Slide 4 text

今回の話のベース (Pͷ1SPUPDϓϥάΠϯΛ׆༻ͨ͠ޮ཰తͳෛՙࢼݧઓུ େن໛αʔϏεͷϩʔϯνʹ޲͚ɺύϑΥʔϚϯενϡʔχϯάͨ͠࿩

Slide 5

Slide 5 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録を全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gRPC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景

Slide 6

Slide 6 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録を全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gRPC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景 高 速な処理速度

Slide 7

Slide 7 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録を全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gRPC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景 高 速な処理速度 大 量のシナリオを 短期間で作れる仕組み

Slide 8

Slide 8 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録を全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gRPC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景 高 速な処理速度 大 量のシナリオを 短期間で作れる仕組み 記録機能のカスタマイズ化

Slide 9

Slide 9 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録を全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gRPC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景 高 速な処理速度 大 量のシナリオを 短期間で作れる仕組み 記録機能のカスタマイズ化 長 期保守性

Slide 10

Slide 10 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録を全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gRPC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景 高 速な処理速度 大 量のシナリオを 短期間で作れる仕組み 記録機能のカスタマイズ化 長 期保守性 gRPC 対応

Slide 11

Slide 11 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録を全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gRPC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景 高 速な処理速度 大 量のシナリオを 短期間で作れる仕組み 記録機能のカスタマイズ化 長 期保守性 gRPC 対応 Datadog との連携

Slide 12

Slide 12 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録を全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gRPC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景 高 速な処理速度 大 量のシナリオを 短期間で作れる仕組み 記録機能のカスタマイズ化 長 期保守性 gRPC 対応 Datadog との連携 シナリオの書きやすさ

Slide 13

Slide 13 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録が全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gRPC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景 高 速な処理速度 大 量のシナリオを 短期間で作れる仕組み 記録機能のカスタマイズ化 長 期保守性 gRPC 対応 これらを満たすように ツール選定を 行 う + ツールで出来ない部分は カスタマイズ Datadog との連携 シナリオの書きやすさ

Slide 14

Slide 14 text

負荷ツール選定

Slide 15

Slide 15 text

• 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録が全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gPRC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 背景 高 速な処理速度 大 量のシナリオを 短期間で作れる仕組み 記録機能のカスタマイズ化 長 期保守性 gRPC 対応 Datadog との連携 シナリオの書きやすさ 選定するツールで 考慮する項 目

Slide 16

Slide 16 text

比 較したツール k 6 Locust ghz Vegeta Gatling gRPC対応 ⚫︎ ⚫︎ ⚫︎ ※逆に gRPC 専 用 × ⚫︎ ※plugin が必要 試験結果の レポート出 力 ⚫︎ ※ダッシュボードは簡易的 ⚫︎ ⚫︎ ⚫︎ ⚫︎ シナリオ記述 JavaScript Python ※boomerを使うと Go で書ける json or toml Go Scala GitHub Star 数 2 5 . 1 k 2 4 . 6 k 3 k 2 3 . 4 k 6 . 4 k Datadog 連携 ▲ ※extension が必要 or OTLP × × × × 備考 Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 社内で過去に採 用 例あり Pythonをなんとなく書ける必要 RESTの試験をする可能性もあった ため、gPRC限定なのが微妙 高 負荷をかけた際の挙動が おかしいという報告を 見 た pluginを 入 れないといけないのが 少し微妙なのと、Scala を 書けるようになる必要がある

Slide 17

Slide 17 text

比 較したツール k 6 Locust ghz Vegeta Gatling gRPC対応 ⚫︎ ⚫︎ ⚫︎ ※逆に gRPC 専 用 × ⚫︎ ※plugin が必要 試験結果の レポート出 力 ⚫︎ ※ダッシュボードは簡易的 ⚫︎ ⚫︎ ⚫︎ ⚫︎ シナリオ記述 JavaScript Python ※boomerを使うと Go で書ける json or toml Go Scala GitHub Star 数 2 5 . 1 k 2 4 . 6 k 3 k 2 3 . 4 k 6 . 4 k Datadog 連携 ▲ ※extension が必要 or OTLP × × × × 備考 Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 社内で過去に採 用 例あり Pythonをなんとなく書ける必要 RESTの試験をする可能性もあった ため、gPRC限定なのが微妙 高 負荷をかけた際の挙動が おかしいという報告を 見 た pluginを 入 れないといけないのが 少し微妙なのと、Scala を 書けるようになる必要がある

Slide 18

Slide 18 text

比 較したツール k 6 Locust ghz Vegeta Gatling gRPC対応 ⚫︎ ⚫︎ ⚫︎ ※逆に gRPC 専 用 × ⚫︎ ※plugin が必要 試験結果の レポート出 力 ⚫︎ ※ダッシュボードは簡易的 ⚫︎ ⚫︎ ⚫︎ ⚫︎ シナリオ記述 JavaScript Python ※boomerを使うと Go で書ける json or toml Go Scala GitHub Star 数 2 5 . 1 k 2 4 . 6 k 3 k 2 3 . 4 k 6 . 4 k Datadog 連携 ▲ ※extension が必要 or OTLP × × × × 備考 Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 社内で過去に採 用 例あり Pythonをなんとなく書ける必要 RESTの試験をする可能性もあった ため、gPRC限定なのが微妙 高 負荷をかけた際の挙動が おかしいという報告を 見 た pluginを 入 れないといけないのが 少し微妙なのと、Scala を 書けるようになる必要がある

Slide 19

Slide 19 text

比 較したツール k 6 Locust ghz Vegeta Gatling gRPC対応 ⚫︎ ⚫︎ ⚫︎ ※逆に gRPC 専 用 × ⚫︎ ※plugin が必要 試験結果の レポート出 力 ⚫︎ ※ダッシュボードは簡易的 ⚫︎ ⚫︎ ⚫︎ ⚫︎ シナリオ記述 JavaScript Python ※boomerを使うと Go で書ける json or toml Go Scala GitHub Star 数 2 5 . 1 k 2 4 . 6 k 3 k 2 3 . 4 k 6 . 4 k Datadog 連携 ▲ ※extension が必要 or OTLP × × × × 備考 Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 社内で過去に採 用 例あり Pythonをなんとなく書ける必要 RESTの試験をする可能性もあった ため、gPRC限定なのが微妙 高 負荷をかけた際の挙動が おかしいという報告を 見 た pluginを 入 れないといけないのが 少し微妙なのと、Scala を 書けるようになる必要がある

Slide 20

Slide 20 text

比 較したツール k 6 Locust ghz Vegeta Gatling gRPC対応 ⚫︎ ⚫︎ ⚫︎ ※逆に gRPC 専 用 × ⚫︎ ※plugin が必要 試験結果の レポート出 力 ⚫︎ ※ダッシュボードは簡易的 ⚫︎ ⚫︎ ⚫︎ ⚫︎ シナリオ記述 JavaScript Python ※boomerを使うと Go で書ける json or toml Go Scala GitHub Star 数 2 5 . 1 k 2 4 . 6 k 3 k 2 3 . 4 k 6 . 4 k Datadog 連携 ▲ ※extension が必要 or OTLP × × × × 備考 Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 社内で過去に採 用 例あり Pythonをなんとなく書ける必要 RESTの試験をする可能性もあった ため、gPRC限定なのが微妙 高 負荷をかけた際の挙動が おかしいという報告を 見 た pluginを 入 れないといけないのが 少し微妙なのと、Scala を 書けるようになる必要がある

Slide 21

Slide 21 text

比 較したツール k 6 Locust ghz Vegeta Gatling gRPC対応 ⚫︎ ⚫︎ ⚫︎ ※逆に gRPC 専 用 × ⚫︎ ※plugin が必要 試験結果の レポート出 力 ⚫︎ ※ダッシュボードは簡易的 ⚫︎ ⚫︎ ⚫︎ ⚫︎ シナリオ記述 JavaScript Python ※boomerを使うと Go で書ける json or toml Go Scala GitHub Star 数 2 5 . 1 k 2 4 . 6 k 3 k 2 3 . 4 k 6 . 4 k Datadog 連携 ▲ ※extension が必要 or OTLP × × × × 備考 Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 社内で過去に採 用 例あり Pythonをなんとなく書ける必要 RESTの試験をする可能性もあった ため、gPRC限定なのが微妙 高 負荷をかけた際の挙動が おかしいという報告を 見 た pluginを 入 れないといけないのが 少し微妙なのと、Scala を 書けるようになる必要がある

Slide 22

Slide 22 text

比 較したツール k 6 Locust ghz Vegeta Gatling gRPC対応 ⚫︎ ⚫︎ ⚫︎ ※逆に gRPC 専 用 × ⚫︎ ※plugin が必要 試験結果の レポート出 力 ⚫︎ ※ダッシュボードは簡易的 ⚫︎ ⚫︎ ⚫︎ ⚫︎ シナリオ記述 JavaScript Python ※boomerを使うと Go で書ける json or toml Go Scala GitHub Star 数 2 5 . 1 k 2 4 . 6 k 3 k 2 3 . 4 k 6 . 4 k Datadog 連携 ▲ ※extension が必要 or OTLP × × × × 備考 Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 社内で過去に採 用 例あり Pythonをなんとなく書ける必要 RESTの試験をする可能性もあった ため、gPRC限定なのが微妙 高 負荷をかけた際の挙動が おかしいという報告を 見 た pluginを 入 れないといけないのが 少し微妙なのと、Scala を 書けるようになる必要がある

Slide 23

Slide 23 text

比 較したツール k 6 Locust ghz Vegeta Gatling gRPC対応 ⚫︎ ⚫︎ ⚫︎ ※逆に gRPC 専 用 × ⚫︎ ※plugin が必要 試験結果の レポート出 力 ⚫︎ ※ダッシュボードは簡易的 ⚫︎ ⚫︎ ⚫︎ ⚫︎ シナリオ記述 JavaScript Python ※boomerを使うと Go で書ける json or toml Go Scala GitHub Star 数 2 5 . 1 k 2 4 . 6 k 3 k 2 3 . 4 k 6 . 4 k Datadog 連携 ▲ ※extension が必要 or OTLP × × × × 備考 Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 社内で過去に採 用 例あり Pythonをなんとなく書ける必要 RESTの試験をする可能性もあった ため、gPRC限定なのが微妙 高 負荷をかけた際の挙動が おかしいという報告を 見 た pluginを 入 れないといけないのが 少し微妙なのと、Scala を 書けるようになる必要がある k 6 ⚫︎ ⚫︎ ※ダッシュボードは簡易的 JavaScript 2 5 . 1 k ▲ ※extension が必要 or OTLP Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 比 較的条件に合っている k 6 を選定 しかし… 今後もこの選択がずっと正しいかは 現時点ではわからない…

Slide 24

Slide 24 text

比 較したツール k 6 Locust ghz Vegeta Gatling gRPC対応 ⚫︎ ⚫︎ ⚫︎ ※逆に gRPC 専 用 × ⚫︎ ※plugin が必要 試験結果の レポート出 力 ⚫︎ ※ダッシュボードは簡易的 ⚫︎ ⚫︎ ⚫︎ ⚫︎ シナリオ記述 JavaScript Python ※boomerを使うと Go で書ける json or toml Go Scala GitHub Star 数 2 5 . 1 k 2 4 . 6 k 3 k 2 3 . 4 k 6 . 4 k Datadog 連携 ▲ ※extension が必要 or OTLP × × × × 備考 Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 社内で過去に採 用 例あり Pythonをなんとなく書ける必要 RESTの試験をする可能性もあった ため、gPRC限定なのが微妙 高 負荷をかけた際の挙動が おかしいという報告を 見 た pluginを 入 れないといけないのが 少し微妙なのと、Scala を 書けるようになる必要がある k 6 ⚫︎ ⚫︎ ※ダッシュボードは簡易的 JavaScript 2 5 . 1 k ▲ ※extension が必要 or OTLP Grafana Labs が メイン開発してる安 心 感と 拡張の豊富さ 比 較的条件に合っている k 6 を選定 しかし… 今後もこの選択がずっと正しいかは 現時点ではわからない… できるだけツールに依存しない シナリオ 生 成の仕組みを作る

Slide 25

Slide 25 text

拡張性

Slide 26

Slide 26 text

背景 • 小 売企業と協業でアプリを開発 • リリース後に少なくとも数百万 人 が利 用見 込み • 新規開発で多くの試験を短期間でこなす必要 • API(60本)×負荷パターン( 4 )= 2 40 + α • 負荷試験時の記録が全て残し即座に確認可能 • 継続的に全く同じ条件で再試験できる • API は gPRC を使 用 • O 11 y ツールで Datadog を使 用 • シナリオ作成はバックエンドエンジニアが 行 う 高 速な処理速度 大 量のシナリオを 短期間で作れる仕組み 記録機能のカスタマイズ化 長 期保守性 gRPC 対応 Datadog との連携 シナリオの書きやすさ 自 動 生 成で 解決する

Slide 27

Slide 27 text

Go Generate!! The Go gopher was designed by Renée French. Created using gopherize.me

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

z service SampleService { // Coupon rpcs. rpc ListCoupons(ListCouponsRequest) returns (ListCouponsResponse) {} // Scenario options. option (ext.scenario_executor) = { scenarios : [ { constant_arrival_rate : { rate : 100, time_unit : "1s", duration : "300s", pre_allocated_vus : 75, } }, { constant_arrival_rate : { rate : 200, time_unit : "1s", duration : "300s", pre_allocated_vus : 150, } } ] }; } z // Code generated by protoc-gen-go-grpc-scenario. DO NOT EDIT. import grpc from 'k6/net/grpc'; import { check } from 'k6'; … export const options …= {… scenarios: { contacts: { executor: 'constant-arrival-rate', rate: 100, timeUnit: '1s', duration: '300s', preAllocatedVUs: 75, } }, }; … export function listCoupons(token, req) { client.connect(baseURL, { plaintext: plaintext }); const params = { metadata: { "Authorization": 'Bearer ' + token, }, }; let response = client.invoke("sampleservice.SampleService/ListCoupons", req, params); check(response, { 'status is OK': (r) => r && r.status === grpc.StatusOK, }); client.close(); } … export default function () { let req = randomItem(reqs); let token = randomItem(users).AccessToken; listCoupons(token, req); } 生 成イメージ service.proto list_coupons__constant_arrival_rate__rate_ 1 00 _time_unit_ 1 s_duration_ 3 0 0 s_pre_allocated_vus_ 75 .pb.js

Slide 30

Slide 30 text

z service SampleService { // Coupon rpcs. rpc ListCoupons(ListCouponsRequest) returns (ListCouponsResponse) {} // Scenario options. option (ext.scenario_executor) = { scenarios : [ { constant_arrival_rate : { rate : 100, time_unit : "1s", duration : "300s", pre_allocated_vus : 75, } }, { constant_arrival_rate : { rate : 200, time_unit : "1s", duration : "300s", pre_allocated_vus : 150, } } ] }; } 生 成イメージ service.proto gRPC 用 のrpc定義 シナリオ 用 の Options • 負荷シナリオなどを記述 • service に対するextend

Slide 31

Slide 31 text

z // Code generated by protoc-gen-go-grpc-scenario. DO NOT EDIT. import grpc from 'k6/net/grpc'; import { check } from 'k6'; … export const options …= {… scenarios: { contacts: { executor: 'constant-arrival-rate', rate: 100, timeUnit: '1s', duration: '300s', preAllocatedVUs: 75, } }, }; … export function listCoupons(token, req) { client.connect(baseURL, { plaintext: plaintext }); const params = { metadata: { "Authorization": 'Bearer ' + token, }, }; let response = client.invoke("sampleservice.SampleService/ListCoupons", req, params); check(response, { 'status is OK': (r) => r && r.status === grpc.StatusOK, }); client.close(); } … export default function () { let req = randomItem(reqs); let token = randomItem(users).AccessToken; listCoupons(token, req); } 生 成イメージ list_coupons__constant_arrival_rate__rate_ 1 00 _time_unit_ 1 s_duration_ 3 0 0 s_pre_allocated_vus_ 75 .pb.js • 負荷試験に関する全ての情報が記載 実 行 時はファイルを指定 振り返る際は1ファイルを 見 ればいい 負荷試験シナリオを 宣 言 的に管理する

Slide 32

Slide 32 text

z service SampleService { rpc Get(GetRequest) returns (GetResponse) { option (google.api.http) = {get: "/sample/get"}; option (ext.scenario_method) = { http_status_code: 200, }; } // Scenario options. option (ext.scenario_executor) = { scenarios : [ { constant_arrival_rate : { rate : 100, time_unit : "1s", duration : "300s", pre_allocated_vus : 75, } }, … ] }; z // Code generated by protoc-gen-go-scenario. DO NOT EDIT. import http from 'k6/http'; import { check } from 'k6'; import { SharedArray } from 'k6/data'; import { htmlReport } from "https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js"; import { textSummary } from "https://jslib.k6.io/k6-summary/0.0.1/index.js"; import { URLSearchParams } from 'https://jslib.k6.io/url/1.0.0/index.js'; import { randomItem } from 'https://jslib.k6.io/k6-utils/1.4.0/index.js' … export const options = { scenarios: { … }, … }; … export function register(req) { const queryParams = new URLSearchParams(); … const url = `${scheme}://${base_url}/auth/register?${queryParams.toString()}`; const params = { headers: { "x-loadtest": "true", "x-scenario": "get", }, tags: { "name": "get" }, }; let response = http.get(url, params); check(response, { 'status is 200': (r) => r && r.status === 200, }); } … export default function () { let req = randomItem(reqs); register(req); } … export function handleSummary(data) { … return { … } } REST にも対応 service.proto get__constant_arrival_rate__rate_ 10 0 _time_unit_ 1 s_duration_ 300 s_pre_allocated_vus_ 75 .pb.js

Slide 33

Slide 33 text

z service SampleService { rpc Get(GetRequest) returns (GetResponse) { option (google.api.http) = {get: "/sample/get"}; option (ext.scenario_method) = { http_status_code: 200, }; } // Scenario options. option (ext.scenario_executor) = { scenarios : [ { constant_arrival_rate : { rate : 100, time_unit : "1s", duration : "300s", pre_allocated_vus : 75, } }, … ] }; REST にも対応 service.proto grpc-gateway の記法 grpc-gateway を使わなくても proto でスキーマ管理

Slide 34

Slide 34 text

• 既存の gRPC の proto fi le の情報から 300 近い k 6 のシナリオを 自 動 生 成 新規開発時期などで rpc 名が変わるなどの破壊的な変更があっても勝 手 に追従 シナリオの保守性を気にしなくてもいい • 負荷試験に対する情報(ドメイン情報 + 負荷シナリオ)は全て proto に集約 protoc plugin の template を書き換えると、k 6 以外のツールのシナリオの 自 動 生 成も可能 自 動 生 成の恩恵

Slide 35

Slide 35 text

• 既存の gRPC の proto fi le の情報から 300 近い k 6 のシナリオを 自 動 生 成 新規開発時期などで rpc 名が変わるなどの破壊的な変更があっても勝 手 に追従 シナリオの保守性を気にしなくてもいい • 負荷試験に対する情報(ドメイン情報 + 負荷シナリオ)は全て proto に集約 protoc plugin の template を書き換えると、k 6 以外のツールのシナリオの 自 動 生 成も可能 自 動 生 成の恩恵 300近いシナリオを全部書き直し… などが必要ない template を差し替えれば 全て 自 動 生 成される

Slide 36

Slide 36 text

• Extension という独 自 の拡張機能を xk 6 と いう CLI を使ってカスタムビルドできる • コミュニティーによってすでに多くの拡張 機能が開発されている • 欲しいものがない場合は 自 作(Go)可能 k 6 の拡張性 &YQMPSFLFYUFOTJPOTc(SBGBOBLEPDVNFOUBUJPO

Slide 37

Slide 37 text

• 現在 Datadog と連携するには拡張を 入 れる必要 (xk 6 -output-statsd) • ※OpenTelemetry Output でも可能 • 特定の試験でレスポンスデータ全て保存する必要 (xk 6 - fi le) • Datadog に送らずにリアルタイム監視および リッチなサマリーが出る機能を追加 (xk 6 -dashboard) • ※v 0 . 4 9 から built-in されたため、 環境変数 (K 6 _WEB_DASHBOARD) の指定のみで動作 z xk6 build \ --with github.com/LeonAdato/xk6-output-statsd@v${XK6_OUTPUT_STATSD_VER} \ --with github.com/grafana/xk6-dashboard@v${XK6_DASHBOARD_VER} \ --with github.com/avitalique/xk6-file@v${XK6_FILE_VER} \ --output /repo/.k6/k6 k 6 の拡張性 Version 0 . 49 . 0 release notes | Grafana k 6 documentation

Slide 38

Slide 38 text

再現性

Slide 39

Slide 39 text

負荷試験で必要なフローをひとまとめ にして実 行 できるようにする Step Functions

Slide 40

Slide 40 text

Step Functions preparer 負荷試験に必要なデータを DBに作成

Slide 41

Slide 41 text

Step Functions converter preparer で 生 成した データの情報を元に、 リクエストデータを作成

Slide 42

Slide 42 text

Step Functions runner 実際に負荷をかける

Slide 43

Slide 43 text

Step Functions result reporter 試験結果をまとめてs 3 に保存 結果を Slack に通知

Slide 44

Slide 44 text

Step Functions

Slide 45

Slide 45 text

Step Functions 実 行 したシナリオのファイル名を表 示 ファイル名からシナリオの概要がわかる リンクを踏むと commit hash 付きで GitHub に 飛 ぶ

Slide 46

Slide 46 text

Step Functions step functions で実 行 時に 振られる実 行 ID リンクを踏むと execution id の step functions の実 行 画 面 に 飛 ぶ

Slide 47

Slide 47 text

Step Functions Datadog の k 6 Dashboard に test_run_id = {execution id} で 飛 ぶ 試験開始終了時刻の前後2分の範囲 を指定して 飛 ぶ

Slide 48

Slide 48 text

Step Functions k 6 デフォルトの簡易サマリー画 面 Cloud fl are Zero Trust 経由のみ確認可能

Slide 49

Slide 49 text

Step Functions xk 6 -dashboard のサマリー画 面 Cloud fl are Zero Trust 経由のみ確認可能

Slide 50

Slide 50 text

インフラやチューニングの話 େن໛αʔϏεͷϩʔϯνʹ޲͚ɺύϑΥʔϚϯενϡʔχϯάͨ͠࿩ パフォーマンスチューニングを どうやったかなどの全体的な話は ぜひブログ記事を 見 てみてください!

Slide 51

Slide 51 text

• 負荷試験を 行 うのに必要な条件を洗い出して、それをできるだけ満たすツー ルを選定する必要 • ツールで満たせない場合はカスタマイズして条件を達成する ツールの拡張性が重要 • 自 動 生 成を活 用 することで、シナリオの保守性を上げる • 一 回試験したら終わりではなく、再現性の 高 い仕組みを作り継続的に試験を 行 なっていけるようにする 場合によっては CI などに組み込めるようにする まとめ