computeRunMetricsDiff computes the diff of run-level metrics between two runs. Returns nil if no meaningful metrics data is available.
(summary1, summary2 *RunSummary)
| 505 | // computeRunMetricsDiff computes the diff of run-level metrics between two runs. |
| 506 | // Returns nil if no meaningful metrics data is available. |
| 507 | func computeRunMetricsDiff(summary1, summary2 *RunSummary) *RunMetricsDiff { |
| 508 | var run1Tokens, run2Tokens int |
| 509 | var run1Duration, run2Duration time.Duration |
| 510 | var run1Turns, run2Turns int |
| 511 | var tu1, tu2 *TokenUsageSummary |
| 512 | var rl1, rl2 *GitHubRateLimitUsage |
| 513 | var m1, m2 *LogMetrics |
| 514 | |
| 515 | if summary1 != nil { |
| 516 | run1Tokens = summary1.Run.TokenUsage |
| 517 | run1Duration = summary1.Run.Duration |
| 518 | run1Turns = summary1.Run.Turns |
| 519 | tu1 = summary1.TokenUsage |
| 520 | rl1 = summary1.GitHubRateLimitUsage |
| 521 | m1 = &summary1.Metrics |
| 522 | } |
| 523 | if summary2 != nil { |
| 524 | run2Tokens = summary2.Run.TokenUsage |
| 525 | run2Duration = summary2.Run.Duration |
| 526 | run2Turns = summary2.Run.Turns |
| 527 | tu2 = summary2.TokenUsage |
| 528 | rl2 = summary2.GitHubRateLimitUsage |
| 529 | m2 = &summary2.Metrics |
| 530 | } |
| 531 | |
| 532 | // Skip if there is no meaningful data |
| 533 | hasTokenDetails := tu1 != nil || tu2 != nil |
| 534 | hasRateLimitDetails := rl1 != nil || rl2 != nil |
| 535 | if run1Tokens == 0 && run2Tokens == 0 && run1Duration == 0 && run2Duration == 0 && run1Turns == 0 && run2Turns == 0 && !hasTokenDetails && !hasRateLimitDetails { |
| 536 | return nil |
| 537 | } |
| 538 | |
| 539 | diff := &RunMetricsDiff{ |
| 540 | Run1TokenUsage: run1Tokens, |
| 541 | Run2TokenUsage: run2Tokens, |
| 542 | Run1Turns: run1Turns, |
| 543 | Run2Turns: run2Turns, |
| 544 | TurnsChange: run2Turns - run1Turns, |
| 545 | } |
| 546 | |
| 547 | if run1Tokens > 0 || run2Tokens > 0 { |
| 548 | diff.TokenUsageChange = formatVolumeChange(run1Tokens, run2Tokens) |
| 549 | } |
| 550 | |
| 551 | if run1Duration > 0 { |
| 552 | diff.Run1Duration = run1Duration.Round(time.Second).String() |
| 553 | } |
| 554 | if run2Duration > 0 { |
| 555 | diff.Run2Duration = run2Duration.Round(time.Second).String() |
| 556 | } |
| 557 | if run1Duration > 0 && run2Duration > 0 { |
| 558 | delta := run2Duration - run1Duration |
| 559 | if delta >= 0 { |
| 560 | diff.DurationChange = "+" + delta.Round(time.Second).String() |
| 561 | } else { |
| 562 | diff.DurationChange = delta.Round(time.Second).String() |
| 563 | } |
| 564 | } |