1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

1
Posted at

ログ/監視のコスト爆死あるある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"))

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

aws logs put-retention-policy --log-group-name /app/prod --retention-in-days 14

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}"])

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

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

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

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

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

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

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

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

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

まとめチェックリスト

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

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


関連リンク

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

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?