grafana/loki
Replace `go.uber.go/atomic` with Go standard library `sync/atomic`
开放
#20,673 创建于 2026年2月4日
good first issue
仓库指标
- 星标
- (28,187 个星标)
- PR 合并指标
- (平均合并 5天 20小时) (30 天内合并 522 个 PR)
描述
Summary
We currently have a linter rule that blocks usage of sync/atomic and forces us to use go.uber.go/atomic instead. This rule was originally added because sync/atomic required atomic operations on primitive types, which was considered error-prone.
However, since Go 1.19, the standard library sync/atomic package now includes typed wrappers (e.g., atomic.Uint32, atomic.Int64, atomic.Bool, etc.) that provide the same safety guarantees as go.uber.go/atomic. This makes the uber package redundant.
Context
Prometheus is also making this transition:
- Issue: https://github.com/prometheus/prometheus/issues/14866
- PR: https://github.com/prometheus/prometheus/pull/18009
Proposed Changes
- Remove the linter rule that blocks
sync/atomic - Migrate all
go.uber.go/atomicusage to the standard librarysync/atomictyped wrappers - Configure a linter rule to block the old-style atomic functions that operate on primitive types (e.g.,
atomic.AddInt64,atomic.LoadUint32) to ensure we only use the new typed wrappers and avoid accidental misuse
This approach gives us:
- Fewer external dependencies
- Alignment with the broader Go ecosystem
- Same safety guarantees we had with uber/atomic
References
- Go 1.19 release notes on atomic types: https://tip.golang.org/doc/go1.19#atomic_types
sync/atomicpackage docs: https://pkg.go.dev/sync/atomic