Skip to content

perf(aws): GetLogEvents を時間範囲チャンキングで並列化 (#26) - #27

Merged
myuron merged 1 commit into
mainfrom
feat/parallel-log-fetch
May 22, 2026
Merged

myuron merged 1 commit into
mainfrom
feat/parallel-log-fetch

Conversation

@myuron

@myuron myuron commented May 22, 2026

Copy link
Copy Markdown
Owner

Summary

  • 単一ストリームの GetLogEvents を NextForwardToken 逐次ページネーションから時間範囲チャンキング並列フェッチに変更し、300k 行クラスのログ取得を大幅高速化(Issue feat: It takes a long time to retrieve the logs #26)
  • DescribeLogStreams で firstEventTimestamp / lastEventTimestamp を取得 → planTimeChunks で [first, last+1) を最大 8 等分 → 各窓を StartTime/EndTime 指定で並列 GetLogEvents
  • グローバルセマフォ maxConcurrent = 8 で全 API 呼び出しの並列度を抑制(CloudWatch Logs 25 TPS 制限への配慮)。describe 失敗 / range 不正 / 極小ストリームは逐次 GetLogEvents へフォールバック

Why this works

GetLogEvents の NextForwardToken はトークン依存のため単一ストリームでは並列化不能。一方 StartTime 包含・EndTime 排他の時間窓指定をサポートするため、[first, last+1) を隣接窓に分割すれば重複もギャップもなく並列に投げられる。同一ミリ秒の境界イベントは右側の窓に入る。

想定効果: 300,000行 × ~30 直列呼び出し ≒ 90s → 8 並列で律速チャンク数回 ≈ ~10x 短縮見込み(密度の偏りに依存)。

Changes

  • LogStream に FirstEventTimestamp を追加 + toLogStream ヘルパーへ整理
  • DescribeLogStream(group, stream) — exact-match で単一ストリーム metadata を取得
  • GetLogEventsByTimeRange(group, stream, startMs, endMs) — StartTime/EndTime 指定 + ページネーション
  • GetMultiStreamLogEvents を時間チャンク並列に再実装(チャンクは時間順・非重複なので concat で timestamp 昇順を維持)
  • 新規テスト 7件 + 既存 TestFetchMultiLogEvents_ConcurrencyLimit をセマフォ仕様に追従

Test plan

  • go test ./... 全テスト Green
  • gofmt -l 差分なし / go vet ./... クリーン
  • 実環境 (AWS) で 100k+ 行クラスのストリームを開き、所要時間が短縮されることを確認
  • 短いストリーム(< 8s)でフォールバック動作を確認
  • 複数ストリーム選択時のマージ動作を確認

Closes #26

🤖 Generated with Claude Code

Issue #26 対応。単一ストリームで NextForwardToken による逐次
ページネーションが大規模ログ取得のボトルネックだったのを、
DescribeLogStreams で得た first/last event 時刻範囲を timeChunks
等分し、各窓を StartTime/EndTime 指定で並列に GetLogEvents する
方式に置き換える。

- LogStream に FirstEventTimestamp 追加 + toLogStream ヘルパー
- DescribeLogStream / GetLogEventsByTimeRange を追加
- GetMultiStreamLogEvents を時間チャンク並列に再実装
- グローバルセマフォ maxConcurrent=8 で AWS スロットルを回避
- range 不明 / 極小ストリームは逐次 GetLogEvents へフォールバック

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@myuron
myuron merged commit cbacbe7 into main May 22, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: It takes a long time to retrieve the logs

1 participant