はじめに
2023/5/12にはてな株式会社様におけるMackerel Azure インテグレーション開発の事例を公開しました。
https://cloudpack.jp/casestudy/257.html
アイレットでは SaaS 型サーバー監視サービス「Mackerel」における Azure SDK の旧ライブラリから新ライブラリへの切り替えをご支援させて頂きました。
概要
以前支援させていただいたAWSインテグレーション開発では、テスト環境やメトリック発生方法が共有されていなかったことから、はてな様側でのレビュー時に手間がかかる課題がありました。
そこでAzureインテグレーション開発では、テスト環境の構築はTerraformを、メトリックの収集はシェルスクリプトを活用して自動化することで、テストとレビューを効率化しました。
本記事はそのテスト環境の構築とテストの自動化について技術的に解説する記事となります。
詳細
テスト環境について
以前はどのような環境でテストが実施されたのかが明確に共有されておらず、レビュー時に同一の環境でテストが実施されていませんでした。
一つのサービスでも、価格帯レベルによってテスト対象の環境が複数ある場合や、特定の設定によって収集可能なメタデータやメトリックがあるなど、様々な要素が関わっています。これらの要素はレビューをするはてな様側に大きな負担をかけていました。
この課題を解決するため、今回からはテスト環境の再現性と管理の容易性を高めるためにIaCを採用することにしました。
今回活用したツールは以下のとおりです。
Terraform
Terraformを採用した理由としては、マルチクラウドに対応しており元々AWSを扱うエンジニアからも扱いやすく学習コストが低い点です。また、インフラのコード化が可能なため、バージョン管理システムであるGithub上でのテスト環境の共有が容易にできます。
AzureRM
Azureのリソースを構築するにあたりTerraformのプロバイダーがいくつかありますが、
今回は既存サービスのSDKの切り替えが主な作業であったため、AzureRM プロバイダーを使用しています。
random
Terraformの設定内でランダムな値を扱えるようにするプロバイダーです。
一意の値にしたいストレージアカウント名やパスワードの生成に使っています。
Azure terrafy
Azureの既存のリソースをTerraformにインポートするツールで、既にterraform importコマンドがありますが、こちらはリソースグループ単位でインポートすることが可能です。
テストの自動化について
Mackerelはクラウドのリソースからメトリックを収集しグラフを表示するサービスです。
したがって、テスト時には実際にリソースのメトリックを発生させる必要があります。
メトリックは通常時に発生するものからエラー時に発生するものまで多岐にわたるため、ドキュメントを参照しながら試行錯誤でメトリックを発生をさせる工程が含まれます。
前述のとおり以前はメトリックの発生方法まで共有されておらず、アイレット側とレビュー段階のはてな様側でこれらの工程が行われ二度手間になってしまう課題がありました。
この課題を解決するために、シェルスクリプトとツールを併用してメトリックの発生を自動化しました。
具体的には、テスト環境作成後に動作させるシェルスクリプトと既存のツールを組み合わせてリソースの操作をすることで、通常の負荷で発生するメトリックから特定条件下で発生するメトリックなどを自動的に発生させることができるようになりました。
これによって、手作業でメトリックを発生させる必要がなくなり、結果的にアイレット側とはてな様側でのテストやレビューでの二度手間が解消され、大幅な効率化に繋がりました。
各サービスごとの自動化方法と収集したメトリックを簡単に紹介します。
Virtual Machine
Virtual Machineの作成時にツール(stress)をブートストラップで動作させてメトリックの収集を行なっています。

- 収集するメトリックの一覧
| メトリック | 単位 | 集計 | 
|---|---|---|
| Percentage CPU | percentage | Average | 
| CPU Credits | float | Average | 
| Disk IOPS | iops | Average | 
| Network In/Out | bytes | Total | 
| Network In/Out Total | bytes | Total | 
| Disk Read/Write Bytes | bytes | Total | 
Cache for Redis
Redisとコマンド実行用のVirtual Machine、メトリック収集のために追加でバックアップ用のストレージを作成しています。
Virtural Machineからベンチマークツールを動作させて、通常負荷時のメトリックを収集し、azコマンドによる再起動でフェイルオーバーやバックアップストレージのパブリックアクセスの無効化するなどでエラーのメトリックを収集しています。

- 収集するメトリックの一覧
| メトリック | 単位 | 集計 | 
|---|---|---|
| CPU | percentage | Maximum | 
| Connected Clients | integer | Maximum | 
| Total Keys | integer | Maximum | 
| Used Memory | bytes | Maximum | 
| Server Load | percentage | Maximum | 
| Cache Read/Write | integer | Maximum | 
| Cache Hits/Misses | integer | Total | 
| Commands | integer | Total | 
| Evicted/Expired Keys | integer | Total | 
| Operations Per Second | iops | Maximum | 
| Errors | integer | Maximum | 
SQL Database
Standard(Serverless), Premium, Hyperscale,Business Criticalの4つのSKUでSQL Databaseを作成しています。
こちらもVirtual Machineと組み合わせており、ベンチマークツールを動作させて負荷をかけています。ただし、通常の負荷では収集できないメトリックに関しては、別途SQLクエリを用意して実行しています。

- 収集するメトリックの一覧
- 一部抜粋(DTUベース Basic, Standard, Premium)
 
| メトリック | 単位 | 集計 | 
|---|---|---|
| Data space allocated | bytes | Average | 
| Connections | integer | Total | 
| CPU | percentage | Average | 
| Deadlocks | integer | Total | 
| DTU Consumption | percentage | Average | 
| DTU | float | Average | 
| Log Write | percentage | Average | 
| Data Read | percentage | Average | 
| Sessions | percentage | Average | 
| SQL Server process core percent | percentage | Maximum | 
| SQL Server process memory percent | percentage | Maximum | 
| Data space used | bytes | Maximum | 
| Data space used percent | percentage | Maximum | 
| Tempdb Data File Size | bytes | Maximum | 
| Tempdb Log File Size | bytes | Maximum | 
| Tempdb Percent Log Used | percentage | Maximum | 
| Workers | percentage | Average | 
| In-Memory OLTP Storage | percentage | Average | 
Load Balancer
Load BalancerからVirtual Machineにルーティングする構成でリソースの作成を行なっていて、VIrtual MachineからLoad Balancerへcurlコマンドを実行することで簡易的な動作を行いメトリックの収集を行なっています。

- 収集するメトリックの一覧
| メトリック | 単位 | 集計 | 
|---|---|---|
| Byte Count | bytes | Total | 
| Data Path Availability | percentage | Average | 
| Health Probe Status | percentage | Average | 
| Packet Count | integer | Total | 
| SNAT Connection Count | integer | Total | 
| SYN Count | integer | Total | 
Database for PostgreSQL
Basic, General Purpose, Memory Optimizedの3つのSKUでPostgreSQL作成しています。SQLクエリを実行し、負荷を与えることでメトリックの収集を行なっています。

- 収集するメトリックの一覧
- 一部抜粋(Basic)
 
| メトリック | 単位 | 集計 | 
|---|---|---|
| Active/Failed Connections | float | Average Total | 
| Backup Storage used | bytes | Average | 
| CPU percent | percentage | Average | 
| Max Lag Across Replicas | bytes | Maximum | 
| Memory percent | percentage | Average | 
| Network In/Out | bytes | Total | 
| Replica Lag | float | Maximum | 
| Server Log storage limit/used | bytes | Maximum Average | 
| Server Log storage percent | percentage | Average | 
| Storage limit/used | bytes | Maximum Average | 
| Storage percent | percentage | Average | 

 
     
     
     
     
    