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

# overview

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

前回記事：[Alibaba Cloud SAEでwebアプリをコンテナデプロイする](https://qiita.com/maipippi/items/bb88c34dc1704f583e24)

![%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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/3289e206-f67c-c8d4-497d-1fd33130d36b.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/c0ee3e4d-ec86-f416-9f88-1c3331a15653.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/a9809a21-05fc-282f-5534-2493a350d8e4.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/a497f4c8-3b0b-2233-54ed-41c9f20fea84.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/a286dc54-eb15-7377-d959-0683d7e2078b.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/0810a0b5-9049-6f1b-a11a-04a4c3957a11.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/f36b6ea2-4b34-096d-6900-ca5860488f95.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/751e4b9c-2203-880f-a717-58b09d21ec43.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/61f3cce4-ddad-8230-287d-dabb63880394.png)


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

# 実際に負荷をかける

前回デプロイしたSAEのアプリケーションのコードに素数判定を追加して、これでcpu負荷をかけてみる〜

```python
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](https://k6.io/)を使う　お手軽〜

以下スクリプトを用意する

```jsx
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` をいざ実行！

```jsx

         /\      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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/d25d71a7-f3e2-36a5-7d2d-2f16114514f3.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267793/cd3517ac-b4bd-830e-6c3f-f9939d1d786d.png)


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

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

おわり