0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Alibaba Cloud SAEにデプロイしたアプリケーションをモニタリングする

Posted at

overview

前回、SAEにアプリケーションをデプロイしたので、それのモニタリングについてまとめていく!

前回記事:Alibaba Cloud SAEでwebアプリをコンテナデプロイする

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-10-30_11.43.24.png

Basic Monitoringのタブがあったのでみてみると、基本的な項目のメトリクスがあった

アラートだしてみたいのでとりあえずベルのマークをクリックしてみると

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-10-30_12.00.56.png

クラウドモニターに飛んで権限求められたのでOKする

クラウドモニタリングのアラーム設定

まずはアラームの送信先設定をみてみる

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-10-30_12.03.18.png

Slack Webhookがあるからこれ使う!

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-10-30_12.49.23.png

アラーム通知サービスのエリアはなぜかシンガポールしか選べなかったけどwebhookのテストも通ったのでこれで登録する

アラーム送信先グループにあるDefault Contact Groupにこの連絡先を追加する

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-10-30_12.53.57.png

これで連絡先はおっけーかな?

アラームルール作成

続いてアラームのルールを作成する

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-11-14_13.29.08.png

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-11-14_13.30.34.png

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-11-14_13.31.44.png

applicationのcpuが30%超えたらアラーム飛ばすように設定してみた!

ちなみにダッシュボードのクラウド製品モニタリングからリージョンを選んだあとサービスを選ぶとSAEのモニタリングができた

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-11-14_13.43.41.png

ここのベルマークからもアラートルール作成できるのね

実際に負荷をかける

前回デプロイした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

実行できた〜〜〜〜〜〜〜〜〜〜〜〜

負荷テスト結果

んでメトリクスを見てみると

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-11-14_13.55.27.png

負荷ってますね〜〜〜〜〜〜〜〜〜〜〜✌️

しばし待つこと数分。。。設定してあったslackにアラームきた〜〜〜〜〜〜〜〜〜〜〜!

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-11-14_13.57.13.png

アラーム送信先、メールがマストで飛ぶからslackのみにできるともっと嬉しいかも〜

でも違和感なく使えていいかんじ!

おわり

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?