DEV Community

スシロー
スシロー

Posted on

【実体験】ログ/監視のコスト爆死あるある5選と回避策

ログ/監視のコスト爆死あるある5選と回避策

結論から言うと、個人開発のオブザーバビリティ破産はほぼ全て「取り込み量(ingest)課金」で起きる。 Datadog/New Relic/CloudWatch はストレージではなく流し込んだバイト数とカスタムメトリクスのカーディナリティで請求するため、コードを1行変えただけで月額が10倍になる。以下、実際に財布が燃える5パターンと、コードで止める回避策をまとめる。

1. DEBUGログを本番で垂れ流す

logger.debug() を消し忘れたまま本番デプロイ → CloudWatch Logs の取り込みは $0.50/GB。1リクエスト10KBのログ × 月500万リクエスト = 50GB = $25/月、これがサービス数分積み上がる。

回避策: 環境変数でレベルを固定し、デバッグ出力を構造化サンプリングする。

import logging, os
logging.basicConfig(level=os.getenv("LOG_LEVEL", "WARNING"))
Enter fullscreen mode Exit fullscreen mode

CloudWatch なら保持期間を必ず設定(デフォルトは「無期限」=ストレージ無限課金)。

aws logs put-retention-policy --log-group-name /app/prod --retention-in-days 14
Enter fullscreen mode Exit fullscreen mode

2. カスタムメトリクスのカーディナリティ爆発

Datadog のカスタムメトリクスは タグの組み合わせ1つ=1メトリクスで課金($0.05/100メトリクス/月)。user_idrequest_id をタグに入れると一瞬で数十万系列になる。

# 爆死: user_idは無限に増える
statsd.increment("api.call", tags=[f"user:{user_id}"])
# 安全: 有限の次元だけ
statsd.increment("api.call", tags=[f"endpoint:{route}", f"status:{code}"])
Enter fullscreen mode Exit fullscreen mode

タグの値は 必ず有限集合(エンドポイント名・ステータスコード・リージョン) に限定する。ID系は絶対にタグにしない。

3. APMの全リクエストトレース

トレースを100%サンプリングすると、トラフィックに比例してスパン課金が膨らむ。個人開発の規模なら ヘッドサンプリング10%で十分、エラーだけ100%拾えばいい。

# OpenTelemetry
from opentelemetry.sdk.trace.sampling import ParentBasedTraceIdRatio
sampler = ParentBasedTraceIdRatio(0.1)  # 10%
Enter fullscreen mode Exit fullscreen mode

4. ヘルスチェック/Botのアクセスログを保存

ALB のヘルスチェックが5秒間隔 = 月50万行、UptimeRobot や検索Botも加算。中身ゼロのログに金を払うことになる。

回避策: 取り込み前にフィルタで捨てる。Fluent Bit なら数行。

[FILTER]
    Name    grep
    Match   *
    Exclude path ^/(health|healthz|ping)$
Enter fullscreen mode Exit fullscreen mode

5. 高解像度メトリクスとアラート無しの放置

CloudWatch の高解像度メトリクス(1秒粒度)は標準の数倍。個人開発に1秒粒度は不要、60秒で十分。そして最大の地雷は「請求アラートを張っていない」こと。気づくのは請求書が届いた翌月だ。

aws cloudwatch put-metric-alarm \
  --alarm-name billing-guard \
  --namespace AWS/Billing --metric-name EstimatedCharges \
  --statistic Maximum --period 21600 \
  --threshold 20 --comparison-operator GreaterThanThreshold \
  --evaluation-periods 1
Enter fullscreen mode Exit fullscreen mode

まとめチェックリスト

項目 危険 安全
ログレベル DEBUG固定 WARNING + 保持14日
メトリクスタグ user_id等の高カーディナリティ 有限集合のみ
トレース 100% 10% + エラー全取得
ヘルスチェック 全保存 フィルタ除外
請求監視 なし $20で必ずアラート

根本原則は「課金は取り込み量とカーディナリティで決まる。だから捨てる設計を最初に入れる」。 高機能なダッシュボードより、put-retention-policy と請求アラートの2つを最初の30分で設定するほうが、月末の財布を確実に守ってくれる。


関連リンク

※自社商品(プロモーションを含みます)。

Top comments (0)