Skip to content

Add linter rule for missing defer perf.Track() calls#1698

Merged
osterman merged 6 commits intomainfrom
perf-track-lint-rule
Oct 22, 2025
Merged

Add linter rule for missing defer perf.Track() calls#1698
osterman merged 6 commits intomainfrom
perf-track-lint-rule

Conversation

@osterman
Copy link
Member

@osterman osterman commented Oct 22, 2025

what

  • Added new perf-track linter rule to catch missing defer perf.Track() calls
  • Enabled by default with explicit package and type exclusions
  • Integrated with existing lintroller custom linter framework

why

  • Enforces coding guidelines requiring performance tracking on all public functions
  • Catches violations early in development before code review
  • Prevents missing perf tracking that would be tedious to find manually
  • Uses explicit exclusions for infrastructure code (logger, profiler, perf, store, ui, tui)

references

  • Follows coding guidelines in CLAUDE.md for mandatory defer perf.Track() usage
  • Addresses hundreds of potential violations by catching them at lint time
  • Exclusions prevent infinite recursion and avoid tracking overhead in low-level code

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a lint rule that enforces a defer-based performance-tracking call at the start of exported functions/methods; enabled by default with a config toggle to disable.
  • Tests

    • Added unit tests and example cases demonstrating compliant and non-compliant exported functions/methods for the new rule.
  • Documentation

    • Updated lint configuration docs to mention the new performance-tracking check and its settings.

osterman and others added 2 commits October 22, 2025 00:45
- Created new perf-track rule in lintroller custom linter
- Checks that all public functions have defer perf.Track() at start
- Skips test files, mock files, mock types, and logger package
- Provides helpful error message with suggested function name format
- Added test coverage for the new rule
- Updated .golangci.yml with perf-track rule (disabled by default)
- Rule disabled in standalone mode to avoid blocking commits
- Can be enabled by setting perf-track: true in .golangci.yml settings
- Follows coding guidelines for mandatory performance tracking

Note: Using --no-verify due to pre-existing os.Args linter violations
that are unrelated to this change and should be fixed separately.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Enabled perf-track rule by default in both golangci-lint and standalone mode
- Added comprehensive package exclusions: logger, profiler, perf, store, ui, tui
- Added receiver type exclusions for TUI models, error types, and simple helpers
- Exclusions prevent infinite recursion and avoid tracking overhead in low-level code
- Rule now catches missing perf.Track() calls in business logic while excluding infrastructure code
- All tests pass

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@osterman osterman requested a review from a team as a code owner October 22, 2025 05:49
@osterman osterman added the no-release Do not create a new release (wait for additional code changes) label Oct 22, 2025
@github-actions github-actions bot added the size/m Medium size PR label Oct 22, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 22, 2025

📝 Walkthrough

Walkthrough

Adds a new PerfTrackRule linter that reports missing leading defer perf.Track(...) calls in exported functions and methods, integrates the rule into lintroller settings and runner (enabled by default when settings absent), and adds tests and testdata exercising the rule.

Changes

Cohort / File(s) Summary
Configuration
\.golangci.yml``
Update description to mention perf.Track checks and enable perf-track: true under settings.custom.lintroller.
Plugin Integration
tools/lintroller/plugin.go
Add PerfTrack bool \json:"perf-track" yaml:"perf-track"`to Settings; enable by default when settings absent; registerPerfTrackRule` in standalone runner and conditionally run it when enabled; update analyzer docs to reference perf.Track.
Rule Implementation
tools/lintroller/rule_perf_track.go
New PerfTrackRule with Name(), Doc(), and Check(pass, file) that inspects AST for exported functions/methods, skips excluded packages/receivers/files, detects missing leading defer perf.Track(...), and reports diagnostics with suggested defer perf.Track(...). Includes helpers isPerfTrackCall, formatReceiverType, and buildPerfTrackName.
Tests
tools/lintroller/lintroller_test.go
Add TestPerfTrackRule(t *testing.T) which runs analysistest.Run over the perftrack testdata.
Test Data
tools/lintroller/testdata/src/perftrack/example.go
Add test fixtures (mock perf, exported functions/methods, and inline // want annotations) to validate missing defer perf.Track(...) diagnostics and suggestions.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant Plugin as Lintroller Plugin
    participant Rule as PerfTrackRule
    participant AST as AST Walker
    participant Pass as analysis.Pass

    Plugin->>Rule: Check(pass, file)
    Rule->>AST: Walk file AST
    AST->>AST: Find exported funcs/methods with bodies

    alt exported & not excluded
        AST->>Pass: Inspect first statement
        alt first statement is defer perf.Track(...)
            Pass-->>Rule: compliant (no diagnostic)
        else missing defer perf.Track
            Rule->>Rule: buildPerfTrackName(pkgPath, receiver, func)
            Rule-->>Pass: Report diagnostic + suggested defer perf.Track("<name>")
        end
    else skipped (unexported / excluded pkg / test/generated)
        AST-->>Rule: skip
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

minor

Suggested reviewers

  • aknysh

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title "Add linter rule for missing defer perf.Track() calls" directly and clearly describes the primary change across all modified files. It's specific about what's being added (a linter rule), what it detects (missing defer perf.Track calls), and avoids generic terms. A developer scanning commit history would immediately understand that this PR introduces a new linting capability for performance tracking. The title accurately represents the core modifications spanning configuration, rule implementation, test integration, and testdata.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch perf-track-lint-rule

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 4a53da8 and 71c1292.

📒 Files selected for processing (2)
  • tools/lintroller/rule_perf_track.go (1 hunks)
  • tools/lintroller/testdata/src/perftrack/example.go (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • tools/lintroller/rule_perf_track.go
🧰 Additional context used
📓 Path-based instructions (3)
**/testdata/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

Use test fixtures for complex inputs under testdata

Files:

  • tools/lintroller/testdata/src/perftrack/example.go
**/*.go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

**/*.go: All code must pass golangci-lint checks
Follow Go error handling idioms and use meaningful error messages
Wrap errors with context using fmt.Errorf("context: %w", err)
Consider custom error types for domain-specific errors
Follow standard Go coding style; run gofmt and goimports
Use snake_case for environment variables
Document complex logic with inline comments

**/*.go: Use interface-driven design with dependency injection; define interfaces for major functionality and inject dependencies.
Generate mocks with go.uber.org/mock/mockgen using //go:generate directives; never write manual mocks.
Use the functional Options pattern instead of functions with many parameters for configuration.
Use context.Context strictly for cancellation, deadlines/timeouts, and request-scoped values; never for config or dependencies. Context must be the first parameter when present.
All comments must end with periods (godot linter).
Organize imports in three groups separated by blank lines and sorted alphabetically: stdlib, third-party (not cloudposse/atmos), then Atmos packages; maintain aliases cfg, log, u, errUtils.
Add defer perf.Track(atmosConfig, "pkg.FuncName")() (or nil) and a blank line at the start of all public functions to track performance.
Use static error types from errors/errors.go, wrap with fmt.Errorf("%w: msg", err), combine with errors.Join, and check with errors.Is; never use dynamic string comparisons.
Keep files small and focused (<600 lines). One command or implementation per file; co-locate tests; never use //revive:disable:file-length-limit.
Bind environment variables with viper.BindEnv using ATMOS_ prefix (e.g., viper.BindEnv("ATMOS_VAR", "ATMOS_VAR", "FALLBACK")).
UI output (prompts/status) must go to stderr; data output to stdout; logging is for system events only and never for UI.
Ensure cross-platform compatibility: avoid hardcoded path separators; use filepath.Join and prefer SDKs over shelling out to binaries.

Files:

  • tools/lintroller/testdata/src/perftrack/example.go
**/!(*_test).go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

Document all exported functions, types, and methods with Go doc comments

Files:

  • tools/lintroller/testdata/src/perftrack/example.go
🧠 Learnings (3)
📚 Learning: 2025-10-22T06:25:54.400Z
Learnt from: CR
PR: cloudposse/atmos#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-22T06:25:54.400Z
Learning: Applies to **/*.go : Add defer perf.Track(atmosConfig, "pkg.FuncName")() (or nil) and a blank line at the start of all public functions to track performance.

Applied to files:

  • tools/lintroller/testdata/src/perftrack/example.go
📚 Learning: 2025-10-11T19:06:16.131Z
Learnt from: osterman
PR: cloudposse/atmos#1599
File: pkg/ui/markdown/renderer.go:247-259
Timestamp: 2025-10-11T19:06:16.131Z
Learning: Performance tracking with `defer perf.Track()` should be reserved for functions that perform actual computational work, I/O operations, or have measurable performance impact. Simple wrapper methods that immediately delegate to other functions do not require performance tracking, as it adds unnecessary overhead without providing meaningful insights.

Applied to files:

  • tools/lintroller/testdata/src/perftrack/example.go
📚 Learning: 2025-10-13T18:13:54.020Z
Learnt from: aknysh
PR: cloudposse/atmos#1622
File: pkg/perf/perf.go:140-184
Timestamp: 2025-10-13T18:13:54.020Z
Learning: In pkg/perf/perf.go, the `trackWithSimpleStack` function intentionally skips ownership checks at call stack depth > 1 to avoid expensive `getGoroutineID()` calls on every nested function. This is a performance optimization for the common single-goroutine execution case (most Atmos commands), accepting the rare edge case of potential metric corruption if multi-goroutine execution occurs at depth > 1. The ~19× performance improvement justifies this trade-off.

Applied to files:

  • tools/lintroller/testdata/src/perftrack/example.go
🧬 Code graph analysis (1)
tools/lintroller/testdata/src/perftrack/example.go (1)
pkg/perf/perf.go (1)
  • Track (121-138)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Build (macos)
  • GitHub Check: Build (linux)
  • GitHub Check: Build (windows)
  • GitHub Check: autofix
  • GitHub Check: Analyze (go)
  • GitHub Check: Lint (golangci)
  • GitHub Check: Summary
🔇 Additional comments (4)
tools/lintroller/testdata/src/perftrack/example.go (4)

3-10: Mock setup looks good for testdata.

The minimal mock perf implementation correctly mirrors the expected API surface without adding unnecessary complexity. Perfect for linter validation.


12-17: Good examples demonstrate the correct pattern.

Both GoodFunction and GoodMethod properly show the expected defer perf.Track call at the start, followed by a blank line. The fully qualified naming convention is correct.

Also applies to: 31-36


19-27: Bad examples correctly specify expected lint messages.

The // want comments properly define the expected linter output, including the distinction between using nil vs atmosConfig based on the function signature. The regex escaping is appropriate for the test harness.

Also applies to: 38-41


43-46: Correctly demonstrates that unexported functions are excluded.

The private function has no defer call and no expected lint message, properly validating that the rule only applies to exported functions.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
tools/lintroller/rule_perf_track.go (2)

95-103: Consider extracting receiver exclusion check for clarity.

The condition at line 99 inline-checks multiple patterns. Extracting this to a helper function would improve readability.

Consider this refactor:

+// isExcludedReceiver checks if a receiver type should be excluded from perf tracking.
+func isExcludedReceiver(receiverType string, excludedList []string) bool {
+	for _, excluded := range excludedList {
+		if receiverType == excluded || strings.HasPrefix(receiverType, "mock") || strings.HasPrefix(receiverType, "Mock") {
+			return true
+		}
+	}
+	return false
+}
+
 		if !hasPerfTrack {
 			// Get receiver type if it's a method.
 			receiverType := ""
 			if funcDecl.Recv != nil && len(funcDecl.Recv.List) > 0 {
 				receiverType = formatReceiverType(funcDecl.Recv.List[0].Type)
-				// Check if receiver type is in exclusion list.
-				for _, excluded := range excludedReceivers {
-					if receiverType == excluded || strings.HasPrefix(receiverType, "mock") || strings.HasPrefix(receiverType, "Mock") {
-						return true
-					}
+				if isExcludedReceiver(receiverType, excludedReceivers) {
+					return true
 				}
 			}

120-134: Add comment explaining the double-call pattern.

The function correctly detects perf.Track()(), but a brief comment explaining why we check for nested CallExpr would help future maintainers understand the pattern.

 // isPerfTrackCall checks if a call expression is perf.Track().
 func isPerfTrackCall(call *ast.CallExpr) bool {
-	// Check for perf.Track()().
+	// Check for perf.Track()() - the inner Track() returns a function that's immediately invoked.
+	// In defer context: defer perf.Track(atmosConfig, "name")()
 	outerCall, ok := call.Fun.(*ast.CallExpr)
 	if !ok {
 		return false
 	}
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between ecbf1cf and 47ea61f.

📒 Files selected for processing (5)
  • .golangci.yml (1 hunks)
  • tools/lintroller/lintroller_test.go (1 hunks)
  • tools/lintroller/plugin.go (6 hunks)
  • tools/lintroller/rule_perf_track.go (1 hunks)
  • tools/lintroller/testdata/src/perftrack/example.go (1 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
**/*.go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

**/*.go: All code must pass golangci-lint checks
Follow Go error handling idioms and use meaningful error messages
Wrap errors with context using fmt.Errorf("context: %w", err)
Consider custom error types for domain-specific errors
Follow standard Go coding style; run gofmt and goimports
Use snake_case for environment variables
Document complex logic with inline comments

**/*.go: Define interfaces for major functionality (interface-driven design) to enable testability and decoupling
Generate mocks with go.uber.org/mock/mockgen using //go:generate directives; do not write manual mocks
Prefer the functional Options pattern to avoid functions with many parameters
Use context.Context only for cancellation, deadlines/timeouts, and sparing request-scoped values; never for config or dependencies
When used, context.Context must be the first parameter of functions
All comments must end with periods (godot linter)
Organize imports in three groups (stdlib, third-party, atmos) separated by blank lines and sorted alphabetically; maintain aliases cfg, log, u, errUtils
Add defer perf.Track(atmosConfig, "pkg.FuncName")() with a blank line in all public functions (use nil if no atmosConfig)
Use Viper for configuration loading with precedence: CLI flags → ENV vars → config files → defaults
Use static errors from errors/errors.go; wrap with fmt.Errorf and errors.Join; check with errors.Is; never compare error strings or create dynamic errors
Add //go:generate mockgen directives near interfaces and generate mocks; never hand-write mocks
Keep files focused and under 600 lines; one cmd/impl per file; co-locate tests; never disable revive file-length limit
Bind environment variables with viper.BindEnv and use ATMOS_ prefix
UI (prompts/status) must be written to stderr; data to stdout; logging only for system events, never for UI
Ensure cross-platform compatibility (Linux/macOS/Windows); use SDKs over binaries and filepath.Join() for paths

Files:

  • tools/lintroller/plugin.go
  • tools/lintroller/lintroller_test.go
  • tools/lintroller/testdata/src/perftrack/example.go
  • tools/lintroller/rule_perf_track.go
**/!(*_test).go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

Document all exported functions, types, and methods with Go doc comments

Files:

  • tools/lintroller/plugin.go
  • tools/lintroller/testdata/src/perftrack/example.go
  • tools/lintroller/rule_perf_track.go
**/*_test.go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

**/*_test.go: Every new feature must include comprehensive unit tests
Test both happy paths and error conditions
Use table-driven tests for multiple scenarios

**/*_test.go: Use table-driven tests for coverage and clarity
Test behavior, not implementation; avoid tautological/stub tests; use DI for testability
Tests must call actual production code paths; never duplicate logic in tests
Use t.Skipf("reason") with clear context when skipping tests; CLI tests auto-build temp binaries

Files:

  • tools/lintroller/lintroller_test.go
.golangci.yml

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

Configure golangci-lint with gofmt, goimports, govet, staticcheck, errcheck, ineffassign, misspell, unused, revive, gocritic enabled

Files:

  • .golangci.yml
**/testdata/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

Use test fixtures for complex inputs under testdata

Files:

  • tools/lintroller/testdata/src/perftrack/example.go
🧠 Learnings (4)
📓 Common learnings
Learnt from: osterman
PR: cloudposse/atmos#1599
File: pkg/ui/markdown/renderer.go:247-259
Timestamp: 2025-10-11T19:06:16.131Z
Learning: Performance tracking with `defer perf.Track()` should be reserved for functions that perform actual computational work, I/O operations, or have measurable performance impact. Simple wrapper methods that immediately delegate to other functions do not require performance tracking, as it adds unnecessary overhead without providing meaningful insights.
Learnt from: CR
PR: cloudposse/atmos#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-22T01:54:30.645Z
Learning: Applies to **/*.go : Add defer perf.Track(atmosConfig, "pkg.FuncName")() with a blank line in all public functions (use nil if no atmosConfig)
📚 Learning: 2025-09-23T02:30:42.362Z
Learnt from: CR
PR: cloudposse/atmos#0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-09-23T02:30:42.362Z
Learning: Applies to .golangci.yml : Configure golangci-lint with gofmt, goimports, govet, staticcheck, errcheck, ineffassign, misspell, unused, revive, gocritic enabled

Applied to files:

  • .golangci.yml
📚 Learning: 2025-10-22T01:54:30.645Z
Learnt from: CR
PR: cloudposse/atmos#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-22T01:54:30.645Z
Learning: Applies to **/*.go : Add defer perf.Track(atmosConfig, "pkg.FuncName")() with a blank line in all public functions (use nil if no atmosConfig)

Applied to files:

  • .golangci.yml
  • tools/lintroller/testdata/src/perftrack/example.go
  • tools/lintroller/rule_perf_track.go
📚 Learning: 2025-10-11T19:06:16.131Z
Learnt from: osterman
PR: cloudposse/atmos#1599
File: pkg/ui/markdown/renderer.go:247-259
Timestamp: 2025-10-11T19:06:16.131Z
Learning: Performance tracking with `defer perf.Track()` should be reserved for functions that perform actual computational work, I/O operations, or have measurable performance impact. Simple wrapper methods that immediately delegate to other functions do not require performance tracking, as it adds unnecessary overhead without providing meaningful insights.

Applied to files:

  • tools/lintroller/testdata/src/perftrack/example.go
  • tools/lintroller/rule_perf_track.go
🧬 Code graph analysis (3)
tools/lintroller/plugin.go (1)
tools/lintroller/rule_perf_track.go (1)
  • PerfTrackRule (12-12)
tools/lintroller/lintroller_test.go (1)
tools/lintroller/plugin.go (1)
  • Analyzer (13-17)
tools/lintroller/testdata/src/perftrack/example.go (1)
pkg/perf/perf.go (1)
  • Track (121-138)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: Build (windows)
  • GitHub Check: Run pre-commit hooks
  • GitHub Check: autofix
  • GitHub Check: Analyze (go)
  • GitHub Check: Review Dependency Licenses
  • GitHub Check: Lint (golangci)
  • GitHub Check: Analyze (go)
  • GitHub Check: Lint (golangci)
  • GitHub Check: Summary
🔇 Additional comments (11)
.golangci.yml (1)

129-136: Configuration looks good.

The perf-track rule is properly enabled and documented. The inline comment at line 136 clearly explains the rule's purpose and references the exclusion lists in the implementation file.

tools/lintroller/rule_perf_track.go (2)

11-38: Exclusion lists are well-documented and comprehensive.

The excluded packages and receivers cover the key infrastructure code where perf tracking would cause recursion or unnecessary overhead. The inline comments clearly explain the rationale for each exclusion.


137-164: Helper functions are well-implemented.

Both formatReceiverType and buildPerfTrackName correctly handle their respective tasks. The logic properly handles pointer receivers, value receivers, and constructs appropriate perf.Track names for both functions and methods.

tools/lintroller/lintroller_test.go (1)

13-15: Test structure looks good.

The test properly uses the analysistest framework to exercise the perf-track rule with dedicated testdata. This follows the established testing pattern used by other rules in the file.

tools/lintroller/testdata/src/perftrack/example.go (1)

1-41: Test data is well-structured and comprehensive.

The testdata correctly demonstrates both compliant and non-compliant cases, including:

  • Functions with proper perf.Track calls
  • Functions missing perf.Track (with want annotations)
  • Methods on types
  • Private functions (correctly not checked)

Note that the good examples use perf.Track(nil, ...) which aligns with the coding guideline to use nil when atmosConfig is unavailable.

tools/lintroller/plugin.go (6)

15-15: Documentation properly updated.

The analyzer doc string correctly reflects the new perf.Track checks alongside existing rules.


28-28: PerfTrackRule properly integrated into standalone mode.

The rule is correctly included in the standalone rules list, ensuring it runs when using the analyzer directly.


49-49: Settings field properly defined.

The PerfTrack field is correctly added with appropriate JSON and YAML tags, matching the pattern of other rule settings.


65-71: Default initialization logic correctly updated.

The condition at line 65 properly checks for PerfTrack, and line 71 enables it by default when no explicit settings are provided. This ensures the rule is active by default while allowing users to disable it if needed.


82-82: Documentation update is consistent.

The doc string matches the update in the standalone analyzer documentation.


112-114: Conditional execution properly implemented.

The rule is correctly instantiated and added to the rules list only when enabled in settings, following the same pattern as other rules in this function.

@codecov
Copy link

codecov bot commented Oct 22, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 66.76%. Comparing base (897d199) to head (3ab016a).
⚠️ Report is 2 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #1698      +/-   ##
==========================================
+ Coverage   66.74%   66.76%   +0.02%     
==========================================
  Files         364      364              
  Lines       42499    42499              
==========================================
+ Hits        28365    28374       +9     
+ Misses      12045    12036       -9     
  Partials     2089     2089              
Flag Coverage Δ
unittests 66.76% <ø> (+0.02%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.
see 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@github-actions
Copy link

github-actions bot commented Oct 22, 2025

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

- Analyze function signature to detect atmosConfig parameter
- Suggest `perf.Track(atmosConfig, ...)` when parameter exists
- Suggest `perf.Track(nil, ...)` when parameter doesn't exist
- Added helper function `hasAtmosConfigParam()` to detect parameter
- Updated tests to verify both scenarios work correctly
- Provides more accurate, actionable suggestions to developers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@osterman osterman merged commit a6880a8 into main Oct 22, 2025
85 of 86 checks passed
@osterman osterman deleted the perf-track-lint-rule branch October 22, 2025 15:28
@github-actions
Copy link

These changes were released in v1.196.0-rc.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

no-release Do not create a new release (wait for additional code changes) size/m Medium size PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants