Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ALBのアクセスログをAthenaで分析してSLOをゆるく決める

iwamot
October 17, 2023

 ALBのアクセスログをAthenaで分析してSLOをゆるく決める

2023-10-18
JAWS-UG SRE⽀部 #7 AWSでゆるSRE︕LT⼤会
https://jawsug-sre.connpass.com/event/291843/

iwamot

October 17, 2023
Tweet

More Decks by iwamot

Other Decks in Technology

Transcript

  1. ALBのアクセスログをAthenaで分析して
    SLOをゆるく決める
    2023-10-18
    JAWS-UG SRE支部 #7 AWSでゆるSRE!LT大会
    https://jawsug-sre.connpass.com/event/291843/
    ENECHANGE株式会社 VPoT兼CTO室マネージャー
    岩本隆史 (iwamot)

    View full-size slide

  2. 「SLO決められない」問題
    SREに取り組んでいく方針になりました。ゴールを設定して計画的に進めていく
    ために、まずは設計段階としてSLIと、できればSLOを定めようと思います。
    しかしこのSLIとSLOがなかなか決まらず、設計フェーズから実装フェーズに進め
    られません。
    どうしたらスムーズにSLIとSLOが決まりますか?
    https://x-tech5.co.jp/2023/09/05/828/

    View full-size slide

  3. 僭越ながらアドバイス

    View full-size slide

  4. ALBを使ってるなら、Athenaで分析してみては?

    View full-size slide

  5. ぼくの実例

    View full-size slide

  6. 可用性分析クエリを実行

    View full-size slide

  7. GETばかりでつまらない

    View full-size slide

  8. POSTに絞って再実行

    View full-size slide

  9. 最多リクエストのエンドポイントに対して
    実績値を満たす可用性SLOを決める
    POST /endpoint1 の可用性:28日間で99.9%以上

    View full-size slide

  10. レイテンシ分析クエリも実行(POSTのみ)

    View full-size slide

  11. 同様にレイテンシSLOも決める
    POST /endpoint1 のレイテンシ:2.8秒以内が28日間で95%以上
    POST /endpoint1 のレイテンシ:1.8秒以内が28日間で50%以上

    View full-size slide

  12. こんなふうに数分で決めてます

    View full-size slide

  13. ゆるすぎる?

    View full-size slide

  14. 決められないよりはマシ!

    View full-size slide

  15. 注意:クエリ実行にはログテーブルが必要

    View full-size slide

  16. ログテーブルの作り方はドキュメントを参照
    前提条件(ALBアクセスログ有効化 + Glueデータベース準備)
    パーティション射影を使用した Athena での ALB ログ用のテーブルの作成
    ALB ログのクエリ例
    https://docs.aws.amazon.com/ja_jp/athena/latest/ug/application-load-balancer-
    logs.html

    View full-size slide

  17. SLO、ゆるく決めてもいいじゃない
    ALBを使ってるなら、Athenaで分析してみては?
    決められないよりはマシ!
    ログテーブルの作り方はドキュメントを参照

    View full-size slide

  18. 付録:コピペ用クエリ

    View full-size slide

  19. 可用性分析
    SELECT
    http_method,
    path,
    count(*) AS total_count,
    count_if(is_bad_for_availability) AS bad_count,
    100.0 * (count(*) - count_if(is_bad_for_availability)) / count(*) AS availability
    FROM (
    SELECT
    request_verb AS http_method,
    url_extract_path(request_url) AS path,
    (elb_status_code >= 500 OR elb_status_code = 429) AS is_bad_for_availability
    FROM [ログテーブル名]
    WHERE day >= date_format(date_add('day', -28, current_timestamp), '%Y/%m/%d')
    AND from_iso8601_timestamp(time) >= date_add('day', -28, current_timestamp)
    ) t
    GROUP BY http_method, path
    ORDER BY count(*) DESC
    LIMIT 10

    View full-size slide

  20. レイテンシ分析
    SELECT
    http_method,
    path,
    count(*) AS total_count,
    approx_percentile(latency, 0.5) AS latency_p50,
    approx_percentile(latency, 0.95) AS latency_p95
    FROM (
    SELECT
    request_verb AS http_method,
    url_extract_path(request_url) AS path,
    request_processing_time + target_processing_time + response_processing_time AS latency
    FROM [ログテーブル名]
    WHERE day >= date_format(date_add('day', -28, current_timestamp), '%Y/%m/%d')
    AND from_iso8601_timestamp(time) >= date_add('day', -28, current_timestamp)
    AND (elb_status_code < 500 AND elb_status_code <> 429)
    AND (request_processing_time + target_processing_time + response_processing_time) > 0
    ) t
    GROUP BY http_method, path
    ORDER BY count(*) DESC
    LIMIT 10

    View full-size slide