Dockerで作る開発環境:k6で負荷試験とGrafanaによる可視化を試す

スポンサーリンク
Dockerで作る開発環境:k6で負荷試験とGrafanaによる可視化を試す ノウハウ
Dockerで作る開発環境:k6で負荷試験とGrafanaによる可視化を試す
この記事は約8分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、dockerで構築した開発環境において、k6を使用した負荷試験環境を導入する手順をご紹介します。

スポンサーリンク

実行環境

この記事では、下記の記事で構築している開発環境を前提にしていますので、環境構築をされていない方は、記事を参考に環境構築をお願いします。

k6を追加

負荷試験に使用するk6のサービスを追加します。

ディレクトリ構造

ディレクトリ構造は下記のようになっています。赤字の箇所が新規&更新になります。

.
├── LICENSE
├── Makefile (更新)
├── README.md
└── app
    ├── docker-compose.yml (更新)
    ├── flyway
    ├── grafana
    ├── influxdb (新規)
    │   └── Dockerfile (新規)
    ├── k6 (新規)
    │   ├── Dockerfile (新規)
    │   └── scripts (新規)
    │              └── http_get.js (新規)
    ├── mysql
    ├── mysqld-exporter
    ├── prometheus
    ├── schemaspy
    └── web

Makefile

下記の内容をファイル(Makefile) 59-64行目に追記します。

# 負荷試験の実施
.PHONY: run_k6
run_k6:
	cd $(WOKR_DIR) \
	&& docker compose run --rm -T k6-cmd run - < k6/scripts/http_get.js

docker-compose.yml

下記の内容をファイル(docker-compose.yml) 151-175行目に追記します。

  influxdb:
    build: ./influxdb
    container_name: influxdb
    environment:
      - INFLUXDB_DB=k6
    ports:
      - "8086:8086"
    networks:
      - net

  k6-cmd:
    build: ./k6
    container_name: k6
    platform: linux/x86_64
    volumes:
      - ./k6/scripts:/scripts
    environment:
      - K6_OUT=influxdb=http://influxdb:8086/k6
    ports:
      - "6565:6565"
    networks:
      - net
    profiles:
      - k6

influxdb/Dockerfile

下記の内容で新規ファイル(influxdb/Dockerfile)を作成します。

FROM influxdb:1.8

k6/Dockerfile

下記の内容で新規ファイル(k6/Dockerfile)を作成します。

FROM grafana/k6:latest

k6/scripts/http_get.js

下記の内容で新規ファイル(k6/scripts/http_get.js)を作成します。

import http from 'k6/http';

export const options = {
  stages: [
    { target: 10, duration: '5m' },
  ],
};

export default function () {
  http.get('http://host.docker.internal:8080/Sample');
};

動作確認

下記のコマンドを実行して、サービスを起動します。

make setup

ブラウザで「http://localhost:3000/」にアクセスして、Grafanaにログインし、influxdbのデータソースを追加します。

インポート後に、下記のコマンドを実行します。

make run_k6

実行中にGrafanaで「2587」のダッシュボードをインポートします。インポートすると、下図のようなダッシュボードが表示されていれば成功です。

Grafanaでのデータソースの追加とダッシュボードのインポート方法については、下記の記事を参考にしてみてください。

解説

k6 とは

k6は、負荷テストやパフォーマンステストを行うためのオープンソースのツールです。k6は、Golangで書かれており、CLIツールとして実行できます。

以下は、k6を使用して負荷テストを行う手順の概要です。

  1. k6のインストール: k6を使用するには、最初にコンピュータにk6をインストールする必要があります。k6は、Windows、Linux、およびmacOSで動作します。
  2. テストスクリプトの作成: k6では、JavaScriptを使用してテストスクリプトを作成します。テストスクリプトには、サーバーに送信するHTTPリクエストの種類や頻度、およびテストを実行するためのユーザーの数などが含まれます。
  3. 負荷テストの実行: テストスクリプトを作成したら、k6 CLIツールを使用して負荷テストを実行できます。テストの実行中に、k6はテスト結果を表示し、実行中のスクリプトの詳細をログに出力します。
  4. テスト結果の分析: 負荷テストが完了したら、k6はテスト結果をJSON形式で出力します。これらの結果を分析して、テスト中に発生したエラーや、サーバーの負荷に関する情報を確認できます。

k6には、いくつかの便利な機能があります。たとえば、k6は、テストの負荷を自動的に増加させるスクリプトを生成することができます。また、k6は、テスト中にリアルタイムでサーバーの負荷を監視し、サーバーの応答時間やエラー率などの情報を表示することもできます。

k6は、比較的簡単に使える負荷テストツールの1つですが、JavaScriptに慣れていない場合は、スクリプトの作成が少し難しいかもしれません。しかし、k6には豊富なドキュメントとチュートリアルが用意されているため、初心者でも学習することができます。

inflaxdbとは

InfluxDBは、高速でスケーラブルな時系列データベースであり、IoT、センサーデータ、アプリケーションパフォーマンスなど、様々なデータを収集、格納、分析するために使用されます。InfluxDBは、オープンソースのデータベースであり、InfluxData社によって開発、メンテナンスされています。

InfluxDBは、以下のような特徴を持ちます。

  1. 時系列データに最適化されている: InfluxDBは、時系列データを高速に処理するために設計されています。データは、タグ、フィールド、タイムスタンプの3つの要素で構成されます。
  2. SQLライクなクエリ言語を使用する: InfluxDBは、InfluxQLと呼ばれるSQLライクなクエリ言語を使用してデータを抽出、操作することができます。また、Fluxと呼ばれる新しいクエリ言語もサポートしています。
  3. シームレスなスケーリング: InfluxDBは、クラスター環境でシームレスにスケーリングできます。クラスターは、水平方向に拡張可能で、負荷分散、高可用性、耐久性を提供します。
  4. 多数のプラグインが利用可能: InfluxDBには、多数のプラグインが用意されており、Grafanaなどの可視化ツールとの統合も容易です。

InfluxDBは、多数のアプリケーションで使用されており、センサーデータやIoTデバイスからのデータを収集、分析するためにも広く使用されています。また、InfluxDBは、Chronograf、Telegraf、KapacitorなどのInfluxData社によって開発された他のオープンソースツールと統合することもできます。

負荷試験の内容について

今回の負荷試験は下記のソース内容で実施しています。

import http from 'k6/http';

export const options = {
  stages: [
    { target: 10, duration: '5m' },
  ],
};

export default function () {
  http.get('http://host.docker.internal:8080/Sample');
};

このソースコードは、k6と呼ばれる負荷テストツールを使用して、HTTPリクエストを送信するシンプルなテストを行っています。

最初の行では、k6のhttpモジュールをインポートしています。これは、HTTPリクエストを送信するための関数を提供します。

次に、テストのオプションを設定しています。stagesオプションでは、テストの段階を設定することができます。ここでは、10のユーザーを5分間にわたってシミュレートするように設定されています。

最後に、http.get()関数を使用して、サンプルのHTTP GETリクエストを送信しています。リクエストのURLは、host.docker.internal:8080/Sampleです。このリクエストは、指定されたURLにアクセスして、レスポンスを受信することを目的としています。

このテストは、10のユーザーが5分間にわたって、指定されたURLにアクセスしてHTTPリクエストを送信することをシミュレートします。これにより、Webアプリケーションの負荷テストを実行し、その性能を測定することができます。

おわりに

今日は、dockerで構築した開発環境にk6を使用して、負荷試験をできる環境を構築し、負荷試験の結果をGrafanaで可視化する方法をご紹介しました。負荷試験をして、負荷につよいシステム開発を目指しましょう。

今回使用したファイルは下記のGitHubにタグ付けしています。

よっしー
よっしー

また明日お会いしましょう!

コメント

タイトルとURLをコピーしました