Alibaba CloudのSAEにデプロイしたアプリケーションをモニタリングする
overview
前回、SAEにアプリケーションをデプロイしたので、それのモニタリングについてまとめていく!
前回記事:Alibaba Cloud SAEでwebアプリをコンテナデプロイする
Basic Monitoringのタブがあったのでみてみると、基本的な項目のメトリクスがあった
アラートだしてみたいのでとりあえずベルのマークをクリックしてみると
クラウドモニターに飛んで権限求められたのでOKする
クラウドモニタリングのアラーム設定
まずはアラームの送信先設定をみてみる
Slack Webhookがあるからこれ使う!
アラーム通知サービスのエリアはなぜかシンガポールしか選べなかったけどwebhookのテストも通ったのでこれで登録する
アラーム送信先グループにあるDefault Contact Groupにこの連絡先を追加する
これで連絡先はおっけーかな?
アラームルール作成
続いてアラームのルールを作成する
applicationのcpuが30%超えたらアラーム飛ばすように設定してみた!
ちなみにダッシュボードのクラウド製品モニタリングからリージョンを選んだあとサービスを選ぶとSAEのモニタリングができた
ここのベルマークからもアラートルール作成できるのね
実際に負荷をかける
前回デプロイしたSAEのアプリケーションのコードに素数判定を追加して、これでcpu負荷をかけてみる〜
from fastapi import FastAPI
import math
app = FastAPI()
def cpu_intensive_task(n: int) -> int:
# 素数判定を使った負荷
count = 0
for num in range(2, n):
is_prime = True
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
count += 1
return count
@app.get("/cpu")
def cpu_load(n: int = 10000):
result = cpu_intensive_task(n)
return {"prime_count": result}
@app.get("/")
def read_root():
return {"Hello": "World!"}
これをSAEにデプロイ!
んで、今回は負荷テストツールとしてk6を使う お手軽〜
以下スクリプトを用意する
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
// A number specifying the number of VUs to run concurrently.
vus: 30,
// A string specifying the total duration of the test run.
duration: '10s',
// The following section contains configuration options for execution of this
// test script in Grafana Cloud.
//
// See https://grafana.com/docs/grafana-cloud/k6/get-started/run-cloud-tests-from-the-cli/
// to learn about authoring and running k6 test scripts in Grafana k6 Cloud.
//
// cloud: {
// // The ID of the project to which the test is assigned in the k6 Cloud UI.
// // By default tests are executed in default project.
// projectID: "",
// // The name of the test in the k6 Cloud UI.
// // Test runs with the same name will be grouped.
// name: "script.js"
// },
// Uncomment this section to enable the use of Browser API in your tests.
//
// See https://grafana.com/docs/k6/latest/using-k6-browser/running-browser-tests/ to learn more
// about using Browser API in your test scripts.
//
// scenarios: {
// // The scenario name appears in the result summary, tags, and so on.
// // You can give the scenario any name, as long as each name in the script is unique.
// ui: {
// // Executor is a mandatory parameter for browser-based tests.
// // Shared iterations in this case tells k6 to reuse VUs to execute iterations.
// //
// // See https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/ for other executor types.
// executor: 'shared-iterations',
// options: {
// browser: {
// // This is a mandatory parameter that instructs k6 to launch and
// // connect to a chromium-based browser, and use it to run UI-based
// // tests.
// type: 'chromium',
// },
// },
// },
// }
};
// The function that defines VU logic.
//
// See https://grafana.com/docs/k6/latest/examples/get-started-with-k6/ to learn more
// about authoring k6 scripts.
//
export default function() {
http.get('http://[SAE endpoint]/cpu?n=300000')
sleep(1);
}
k6 run script.js
をいざ実行!
/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/
execution: local
script: script.js
output: -
scenarios: (100.00%) 1 scenario, 30 max VUs, 40s max duration (incl. graceful stop):
* default: 30 looping VUs for 10s (gracefulStop: 30s)
data_received..................: 4.7 kB 119 B/s
data_sent......................: 2.8 kB 70 B/s
http_req_blocked...............: avg=16.13ms min=17µs med=16.59ms max=20.56ms p(90)=19.01ms p(95)=20.5ms
http_req_connecting............: avg=15.89ms min=0s med=16.58ms max=19.67ms p(90)=18.99ms p(95)=19.61ms
http_req_duration..............: avg=31.67s min=3.25s med=34.71s max=38.96s p(90)=38.95s p(95)=38.96s
{ expected_response:true }...: avg=31.67s min=3.25s med=34.71s max=38.96s p(90)=38.95s p(95)=38.96s
http_req_failed................: 0.00% 0 out of 31
http_req_receiving.............: avg=30.65ms min=48µs med=299µs max=803.82ms p(90)=7.19ms p(95)=45.14ms
http_req_sending...............: avg=33.03µs min=6µs med=10µs max=355µs p(90)=37µs p(95)=170.49µs
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=31.64s min=3.25s med=34.71s max=38.96s p(90)=38.94s p(95)=38.96s
http_reqs......................: 31 0.775103/s
iteration_duration.............: avg=32.69s min=4.27s med=35.71s max=39.99s p(90)=39.97s p(95)=39.98s
iterations.....................: 31 0.775103/s
vus............................: 8 min=8 max=30
vus_max........................: 30 min=30 max=30
running (40.0s), 00/30 VUs, 31 complete and 0 interrupted iterations
default ✓ [======================================] 30 VUs 10s
実行できた〜〜〜〜〜〜〜〜〜〜〜〜
負荷テスト結果
んでメトリクスを見てみると
負荷ってますね〜〜〜〜〜〜〜〜〜〜〜✌️
しばし待つこと数分。。。設定してあったslackにアラームきた〜〜〜〜〜〜〜〜〜〜〜!
アラーム送信先、メールがマストで飛ぶからslackのみにできるともっと嬉しいかも〜
でも違和感なく使えていいかんじ!
おわり
Discussion