Skip to content

Add and use abstractions over labels.Labels#11717

Merged
bboreham merged 35 commits intoprometheus:mainfrom
bboreham:labels-abstraction
Dec 20, 2022
Merged

Add and use abstractions over labels.Labels#11717
bboreham merged 35 commits intoprometheus:mainfrom
bboreham:labels-abstraction

Conversation

@bboreham
Copy link
Copy Markdown
Member

@bboreham bboreham commented Dec 14, 2022

This is #10887, adding all the abstractions but not actually changing labels.Labels.
This should be possible to merge without breaking too much downstream.

There are one or two breaking changes, like IndexReader.Series gets a new ScratchBuilder parameter.

Use simpler utility function to create Labels objects, making fewer
assumptions about the data structure.

Signed-off-by: Bryan Boreham <[email protected]>
if l.Name == name {
return true
}
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

does it make sense to assume sorted and do something like if l.Name > name {return false} ?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I think not: we know conflictingExposedLabels is sorted at the beginning, but after we have renamed one foo to exported_foo it is no longer certain.

Copy link
Copy Markdown
Member

@roidelapluie roidelapluie left a comment

Choose a reason for hiding this comment

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

LGTM

This code is a bit cleaner.

Signed-off-by: Bryan Boreham <[email protected]>
Without changing the definition of `labels.Labels`, add methods which
enable code using it to work without knowledge of the internals.

Signed-off-by: Bryan Boreham <[email protected]>
Instead of relying on being able to append to it like a slice.

Signed-off-by: Bryan Boreham <[email protected]>
Re-did the FromStrings test to avoid assumptions about how it works.

Signed-off-by: Bryan Boreham <[email protected]>
Parse metrics using labels.ScratchBuilder, so we reduce assumptions about
internals of Labels.

Signed-off-by: Bryan Boreham <[email protected]>
We don't want to touch the result labels now we create them differently.

Signed-off-by: Bryan Boreham <[email protected]>
Incomplete - needs further changes to `Decoder.Series()`.

Signed-off-by: Bryan Boreham <[email protected]>
This necessitates a change to the `tsdb.IndexReader` interface:
`index.Reader` is used from multiple goroutines concurrently, so we
can't have state in it.

We do retain a `ScratchBuilder` in `blockBaseSeriesSet` which is
iterator-like.

Signed-off-by: Bryan Boreham <[email protected]>
Note in one cases we needed an extra copy of labels in case they change.

Signed-off-by: Bryan Boreham <[email protected]>
Implement decoding via labels.ScratchBuilder, which we retain and re-use
to reduce memory allocations.

Signed-off-by: Bryan Boreham <[email protected]>
We use `labels.Builder` to parse metrics, to avoid depending on the
internal implementation. This is not efficient, but the feature is only
used in tests. It wasn't efficient previously either - calling `Sort()`
after adding each label.

`createLabelsForAbsentFunction` also uses a Builder now, and gets
an extra `map` to replace the previous `Has()` usage.

Signed-off-by: Bryan Boreham <[email protected]>

Fix up promql to compile with changes to Labels
`QueueManager.externalLabels` becomes a slice rather than a `Labels` so
we can index into it when doing the merge operation.

Note we avoid calling `Labels.Len()` in `labelProtosToLabels()`.
It isn't necessary - `append()` will enlarge the buffer and we're
expecting to re-use it many times.

Also, we now validate protobuf input before converting to Labels.
This way we can detect errors first, and we don't place unnecessary
requirements on the Labels structure.

Re-do seriesFilter using labels.Builder (albeit N^2).

Signed-off-by: Bryan Boreham <[email protected]>
Use ScratchBuilder to create labels.

Signed-off-by: Bryan Boreham <[email protected]>
Use `FromStrings` instead of assuming the data structure.

And don't sort individual labels, since `labels.Labels` are always sorted.

Signed-off-by: Bryan Boreham <[email protected]>
Instead of passing in a `ScratchBuilder` and `Labels`, just pass the
builder and the caller can extract labels from it. In many cases the
caller didn't use the Labels value anyway.

Now in `Labels.ScratchBuilder` we need a slightly different API: one
to assign what will be the result, instead of overwriting some other
`Labels`. This is safer and easier to reason about.

Signed-off-by: Bryan Boreham <[email protected]>
@bboreham
Copy link
Copy Markdown
Member Author

I changed IndexReader.Series() again - now it only takes a ScratchBuilder, and the caller can call Labels() on that if they want.

This is simpler, more foolproof, and faster in a couple of places where the labels value is not used.

@bboreham
Copy link
Copy Markdown
Member Author

@roidelapluie, @bwplotka (since you reviewed related PRs) I am ready to merge this; please let me know if I should wait a little (e.g. until 2.41 is released).

@roidelapluie
Copy link
Copy Markdown
Member

You can merge this, 2.41 is on its branch.

@bwplotka
Copy link
Copy Markdown
Member

Feel free to go 👍🏽

@bboreham bboreham merged commit ccea61c into prometheus:main Dec 20, 2022
krajorama added a commit to krajorama/prometheus that referenced this pull request Jan 8, 2023
Comment was not updated when code changed from labels to builder
in prometheus#11717

Signed-off-by: György Krajcsovits <[email protected]>
vjsamuel pushed a commit to vjsamuel/prometheus that referenced this pull request Jan 9, 2023
Comment was not updated when code changed from labels to builder
in prometheus#11717

Signed-off-by: György Krajcsovits <[email protected]>
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.

3 participants