Merge pull request #16436 from prymitive/slicelabels

Use stringlabels by default
pull/16368/head^2
Bryan Boreham 2 months ago committed by GitHub
commit 2e9ab9cc62
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      .github/workflows/ci.yml
  2. 2
      .promu.yml
  3. 4
      model/labels/labels.go
  4. 17
      model/labels/labels_stringlabels.go
  5. 2
      model/labels/sharding.go
  6. 2
      model/labels/sharding_stringlabels.go
  7. 10
      tsdb/agent/series_test.go
  8. 10
      tsdb/head_test.go

@ -18,8 +18,8 @@ jobs:
- uses: ./.github/promci/actions/setup_environment
with:
enable_npm: true
- run: make GOOPTS=--tags=stringlabels GO_ONLY=1 SKIP_GOLANGCI_LINT=1
- run: go test --tags=stringlabels ./tsdb/ -test.tsdb-isolation=false
- run: make GO_ONLY=1 SKIP_GOLANGCI_LINT=1
- run: go test ./tsdb/ -test.tsdb-isolation=false
- run: make -C documentation/examples/remote_storage
- run: make -C documentation/examples

@ -14,10 +14,8 @@ build:
all:
- netgo
- builtinassets
- stringlabels
windows:
- builtinassets
- stringlabels
ldflags: |
-X github.com/prometheus/common/version.Version={{.Version}}
-X github.com/prometheus/common/version.Revision={{.Revision}}

@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build !stringlabels && !dedupelabels
//go:build slicelabels
package labels
@ -453,7 +453,7 @@ func (b *ScratchBuilder) Add(name, value string) {
}
// UnsafeAddBytes adds a name/value pair, using []byte instead of string.
// The '-tags stringlabels' version of this function is unsafe, hence the name.
// The default version of this function is unsafe, hence the name.
// This version is safe - it copies the strings immediately - but we keep the same name so everything compiles.
func (b *ScratchBuilder) UnsafeAddBytes(name, value []byte) {
b.add = append(b.add, Label{Name: string(name), Value: string(value)})

@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build stringlabels
//go:build !slicelabels && !dedupelabels
package labels
@ -70,7 +70,7 @@ func (ls Labels) IsZero() bool {
// MatchLabels returns a subset of Labels that matches/does not match with the provided label names based on the 'on' boolean.
// If on is set to true, it returns the subset of labels that match with the provided label names and its inverse when 'on' is set to false.
// TODO: This is only used in printing an error message
// TODO: This is only used in printing an error message.
func (ls Labels) MatchLabels(on bool, names ...string) Labels {
b := NewBuilder(ls)
if on {
@ -292,6 +292,7 @@ func Equal(ls, o Labels) bool {
func EmptyLabels() Labels {
return Labels{}
}
func yoloBytes(s string) []byte {
return unsafe.Slice(unsafe.StringData(s), len(s))
}
@ -364,7 +365,7 @@ func Compare(a, b Labels) int {
return +1
}
// Copy labels from b on top of whatever was in ls previously, reusing memory or expanding if needed.
// CopyFrom will copy labels from b on top of whatever was in ls previously, reusing memory or expanding if needed.
func (ls *Labels) CopyFrom(b Labels) {
ls.data = b.data // strings are immutable
}
@ -434,11 +435,11 @@ func (ls Labels) DropMetricName() Labels {
}
// InternStrings is a no-op because it would only save when the whole set of labels is identical.
func (ls *Labels) InternStrings(intern func(string) string) {
func (ls *Labels) InternStrings(_ func(string) string) {
}
// ReleaseStrings is a no-op for the same reason as InternStrings.
func (ls Labels) ReleaseStrings(release func(string)) {
func (ls Labels) ReleaseStrings(_ func(string)) {
}
// Builder allows modifying Labels.
@ -603,7 +604,7 @@ func (b *ScratchBuilder) Add(name, value string) {
b.add = append(b.add, Label{Name: name, Value: value})
}
// Add a name/value pair, using []byte instead of string to reduce memory allocations.
// UnsafeAddBytes adds a name/value pair using []byte instead of string to reduce memory allocations.
// The values must remain live until Labels() is called.
func (b *ScratchBuilder) UnsafeAddBytes(name, value []byte) {
b.add = append(b.add, Label{Name: yoloString(name), Value: yoloString(value)})
@ -631,7 +632,7 @@ func (b *ScratchBuilder) Labels() Labels {
return b.output
}
// Write the newly-built Labels out to ls, reusing an internal buffer.
// Overwrite will write the newly-built Labels out to ls, reusing an internal buffer.
// Callers must ensure that there are no other references to ls, or any strings fetched from it.
func (b *ScratchBuilder) Overwrite(ls *Labels) {
size := labelsSize(b.add)
@ -644,7 +645,7 @@ func (b *ScratchBuilder) Overwrite(ls *Labels) {
ls.data = yoloString(b.overwriteBuffer)
}
// Symbol-table is no-op, just for api parity with dedupelabels.
// SymbolTable is no-op, just for api parity with dedupelabels.
type SymbolTable struct{}
func NewSymbolTable() *SymbolTable { return nil }

@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build !stringlabels && !dedupelabels
//go:build slicelabels
package labels

@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build stringlabels
//go:build !slicelabels && !dedupelabels
package labels

@ -77,13 +77,13 @@ func TestNoDeadlock(t *testing.T) {
func labelsWithHashCollision() (labels.Labels, labels.Labels) {
// These two series have the same XXHash; thanks to https://github.com/pstibrany/labels_hash_collisions
ls1 := labels.FromStrings("__name__", "metric", "lbl1", "value", "lbl2", "l6CQ5y")
ls2 := labels.FromStrings("__name__", "metric", "lbl1", "value", "lbl2", "v7uDlF")
ls1 := labels.FromStrings("__name__", "metric", "lbl", "HFnEaGl")
ls2 := labels.FromStrings("__name__", "metric", "lbl", "RqcXatm")
if ls1.Hash() != ls2.Hash() {
// These ones are the same when using -tags stringlabels
ls1 = labels.FromStrings("__name__", "metric", "lbl", "HFnEaGl")
ls2 = labels.FromStrings("__name__", "metric", "lbl", "RqcXatm")
// These ones are the same when using -tags slicelabels
ls1 = labels.FromStrings("__name__", "metric", "lbl1", "value", "lbl2", "l6CQ5y")
ls2 = labels.FromStrings("__name__", "metric", "lbl1", "value", "lbl2", "v7uDlF")
}
if ls1.Hash() != ls2.Hash() {

@ -6372,13 +6372,13 @@ func TestHeadCompactionWhileAppendAndCommitExemplar(t *testing.T) {
func labelsWithHashCollision() (labels.Labels, labels.Labels) {
// These two series have the same XXHash; thanks to https://github.com/pstibrany/labels_hash_collisions
ls1 := labels.FromStrings("__name__", "metric", "lbl1", "value", "lbl2", "l6CQ5y")
ls2 := labels.FromStrings("__name__", "metric", "lbl1", "value", "lbl2", "v7uDlF")
ls1 := labels.FromStrings("__name__", "metric", "lbl", "HFnEaGl")
ls2 := labels.FromStrings("__name__", "metric", "lbl", "RqcXatm")
if ls1.Hash() != ls2.Hash() {
// These ones are the same when using -tags stringlabels
ls1 = labels.FromStrings("__name__", "metric", "lbl", "HFnEaGl")
ls2 = labels.FromStrings("__name__", "metric", "lbl", "RqcXatm")
// These ones are the same when using -tags slicelabels
ls1 = labels.FromStrings("__name__", "metric", "lbl1", "value", "lbl2", "l6CQ5y")
ls2 = labels.FromStrings("__name__", "metric", "lbl1", "value", "lbl2", "v7uDlF")
}
if ls1.Hash() != ls2.Hash() {

Loading…
Cancel
Save