Skip to content

refactor(stringlabels): Support stringlabels in storage. #18103

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: main
Choose a base branch
from

Conversation

jeschkies
Copy link
Contributor

@jeschkies jeschkies commented Jun 13, 2025

What this PR does / why we need it:
This is a next step of support Prometheus stringlabels implementation in Loki. It adds support in the storage package.

Special notes for your reviewer:
The tests should compile with build tag stringlabels.

Outstanding Performance Issues

  • Benchmark_store_SelectSample
  • bloom/v1
    • BenchmarkMapClear
    • BenchmarkNewMap
    • BenchmarkBlockQuerying
    • BenchmarkScalableBloomTestAndAdd
  • Chunk encoding and decoding
  • series.BenchmarkParseIndexEntries
  • series.index.BenchmarkEncode
  • Benchmark_BlocksCacheOld
  • tsdb
    • BenchmarkTenantHeads
    • BenchmarkTSDBIndex_Volume
  • Benchmark_MultiQueries

Checklist

  • Reviewed the CONTRIBUTING.md guide (required)
  • Documentation added
  • Tests updated
  • Title matches the required conventional commits format, see here
    • Note that Promtail is considered to be feature complete, and future development for logs collection will be in Grafana Alloy. As such, feat PRs are unlikely to be accepted unless a case can be made for the feature actually being a bug fix to existing behavior.
  • Changes that require user attention or interaction to upgrade are documented in docs/sources/setup/upgrade/_index.md
  • If the change is deprecating or removing a configuration option, update the deprecated-config.yaml and deleted-config.yaml files respectively in the tools/deprecated-config-checker directory. Example PR
@jeschkies jeschkies requested a review from chaudum June 13, 2025 15:53
@jeschkies jeschkies requested a review from a team as a code owner June 13, 2025 15:53
@jeschkies jeschkies mentioned this pull request Jun 6, 2025
32 tasks
@jeschkies
Copy link
Contributor Author

I still have to run the benchmarks

@jeschkies
Copy link
Contributor Author

Here are the benchmark results

                                                        │ before.log  │             after.log              │
                                                        │   sec/op    │   sec/op     vs base               │
_store_SelectSample/count_over_time({foo="bar"}[5m])-16   370.7µ ± 4%   392.4µ ± 3%  +5.86% (p=0.000 n=10)
_store_SelectSample/rate({foo="bar"}[5m])-16              356.8µ ± 2%   375.8µ ± 8%  +5.34% (p=0.001 n=10)
_store_SelectSample/bytes_rate({foo="bar"}[5m])-16        364.7µ ± 2%   380.8µ ± 3%  +4.40% (p=0.000 n=10)
_store_SelectSample/bytes_over_time({foo="bar"}[5m])-16   358.2µ ± 3%   385.7µ ± 2%  +7.67% (p=0.000 n=10)
geomean                                                   362.6µ        383.6µ       +5.81%

                                                        │  before.log  │              after.log              │
                                                        │  samples/op  │ samples/op  vs base                 │
_store_SelectSample/count_over_time({foo="bar"}[5m])-16   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/rate({foo="bar"}[5m])-16              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/bytes_rate({foo="bar"}[5m])-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/bytes_over_time({foo="bar"}[5m])-16   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                                              ²               +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                                        │  before.log  │              after.log              │
                                                        │     B/op     │     B/op      vs base               │
_store_SelectSample/count_over_time({foo="bar"}[5m])-16   385.3Ki ± 0%   386.8Ki ± 0%  +0.38% (p=0.043 n=10)
_store_SelectSample/rate({foo="bar"}[5m])-16              384.2Ki ± 1%   385.7Ki ± 0%       ~ (p=0.190 n=10)
_store_SelectSample/bytes_rate({foo="bar"}[5m])-16        386.4Ki ± 1%   386.4Ki ± 0%       ~ (p=0.739 n=10)
_store_SelectSample/bytes_over_time({foo="bar"}[5m])-16   385.2Ki ± 0%   386.0Ki ± 0%       ~ (p=0.165 n=10)
geomean                                                   385.3Ki        386.2Ki       +0.25%

                                                        │ before.log  │              after.log               │
                                                        │  allocs/op  │  allocs/op   vs base                 │
_store_SelectSample/count_over_time({foo="bar"}[5m])-16   1.038k ± 0%   1.038k ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/rate({foo="bar"}[5m])-16              1.038k ± 0%   1.038k ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/bytes_rate({foo="bar"}[5m])-16        1.038k ± 0%   1.038k ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/bytes_over_time({foo="bar"}[5m])-16   1.038k ± 0%   1.038k ± 0%       ~ (p=1.000 n=10) ¹
geomean                                                   1.038k        1.038k       +0.00%
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/bloom/v1
                           │ before.log  │             after.log              │
                           │   sec/op    │   sec/op     vs base               │
PopulateSeriesWithBloom-16   1.944m ± 2%   1.987m ± 5%       ~ (p=0.218 n=10)
MapClear-16                  22.32m ± 1%   24.03m ± 5%  +7.66% (p=0.002 n=10)
NewMap-16                    25.99m ± 1%   27.09m ± 3%  +4.23% (p=0.000 n=10)
BlockQuerying/fused-16       216.9m ± 4%   227.6m ± 4%  +4.95% (p=0.005 n=10)
geomean                      22.24m        23.29m       +4.74%

                           │  before.log  │              after.log              │
                           │     B/op     │     B/op      vs base               │
PopulateSeriesWithBloom-16   10.03Mi ± 0%   10.03Mi ± 0%  +0.00% (p=0.003 n=10)
MapClear-16                  3.621Mi ± 0%   3.646Mi ± 0%  +0.69% (p=0.001 n=10)
NewMap-16                    13.66Mi ± 0%   13.67Mi ± 0%       ~ (p=0.052 n=10)
BlockQuerying/fused-16       42.01Mi ± 1%   41.95Mi ± 1%       ~ (p=0.631 n=10)
geomean                      12.02Mi        12.03Mi       +0.16%

                           │ before.log  │              after.log               │
                           │  allocs/op  │  allocs/op   vs base                 │
PopulateSeriesWithBloom-16    662.0 ± 0%    662.0 ± 0%       ~ (p=1.000 n=10) ¹
MapClear-16                  449.5k ± 0%   449.5k ± 0%  +0.00% (p=0.001 n=10)
NewMap-16                    450.0k ± 0%   450.0k ± 0%       ~ (p=0.061 n=10)
BlockQuerying/fused-16       470.4k ± 0%   470.4k ± 0%       ~ (p=1.000 n=10)
geomean                      89.09k        89.09k       +0.00%
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/bloom/v1/filter
                              │ before.log  │             after.log              │
                              │   sec/op    │   sec/op     vs base               │
HashKernel-16                   8.006n ± 6%   7.687n ± 4%       ~ (p=0.075 n=10)
BucketsIncrement-16             17.11n ± 6%   17.07n ± 3%       ~ (p=0.684 n=10)
BucketsSet-16                   10.17n ± 8%   10.17n ± 1%       ~ (p=0.361 n=10)
BucketsGet-16                   7.216n ± 7%   7.391n ± 4%       ~ (p=0.436 n=10)
PartitionedBloomAdd-16          37.05n ± 6%   37.54n ± 5%       ~ (p=0.247 n=10)
PartitionedBloomTest-16         13.47n ± 7%   13.54n ± 7%       ~ (p=0.541 n=10)
PartitionedBloomTestAndAdd-16   48.47n ± 4%   47.13n ± 7%       ~ (p=0.579 n=10)
PartitionedFillRatio-16         14.87µ ± 7%   14.72µ ± 5%       ~ (p=0.631 n=10)
ScalableBloomAdd-16             75.63n ± 5%   76.71n ± 5%       ~ (p=0.739 n=10)
ScalableBloomTest-16            16.18n ± 5%   15.91n ± 5%       ~ (p=0.425 n=10)
ScalableBloomTestAndAdd-16      165.7n ± 6%   173.9n ± 6%       ~ (p=0.165 n=10)
Read-16                         214.1n ± 0%   214.0n ± 0%       ~ (p=0.588 n=10)
geomean                         48.19n        48.22n       +0.05%

                              │   before.log   │              after.log               │
                              │      B/op      │    B/op      vs base                 │
HashKernel-16                   0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
BucketsIncrement-16             0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
BucketsSet-16                   0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
BucketsGet-16                   0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
PartitionedBloomAdd-16          0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
PartitionedBloomTest-16         0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
PartitionedBloomTestAndAdd-16   0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
PartitionedFillRatio-16         0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
ScalableBloomAdd-16             1.000 ±   0%     1.000 ±  0%       ~ (p=1.000 n=10) ¹
ScalableBloomTest-16            0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
ScalableBloomTestAndAdd-16      1.000 ± 100%     2.000 ± 50%       ~ (p=0.370 n=10)
Read-16                         15.00 ±   0%     15.00 ±  7%       ~ (p=1.000 n=10)
geomean                                      ²                +5.95%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                              │  before.log  │              after.log              │
                              │  allocs/op   │ allocs/op   vs base                 │
HashKernel-16                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
BucketsIncrement-16             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
BucketsSet-16                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
BucketsGet-16                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
PartitionedBloomAdd-16          0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
PartitionedBloomTest-16         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
PartitionedBloomTestAndAdd-16   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
PartitionedFillRatio-16         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
ScalableBloomAdd-16             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
ScalableBloomTest-16            0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
ScalableBloomTestAndAdd-16      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Read-16                         1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                    ²               +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/grafana/loki/v3/pkg/storage/chunk
                             │  before.log  │              after.log               │
                             │    sec/op    │    sec/op     vs base                │
Encode-16                      31.55µ ± 17%   35.41µ ± 14%  +12.23% (p=0.035 n=10)
Decode1-16                     34.61µ ±  5%   42.28µ ±  3%  +22.15% (p=0.000 n=10)
Decode100-16                   537.7µ ±  5%   551.9µ ±  1%        ~ (p=0.089 n=10)
Decode10000-16                 52.40m ±  1%   52.28m ±  1%        ~ (p=0.529 n=10)
ParseNewerExternalKey-16       377.4n ±  8%   399.9n ±  2%   +5.98% (p=0.000 n=10)
ParseNewExternalKey-16         378.2n ±  5%   383.2n ±  3%        ~ (p=0.225 n=10)
RootParseNewExternalKey-16     352.9n ±  7%   343.1n ±  7%   -2.76% (p=0.042 n=10)
RootParseNewerExternalKey-16   346.3n ±  2%   347.7n ±  6%        ~ (p=0.565 n=10)
geomean                        12.34µ         12.95µ         +4.95%

                             │   before.log   │               after.log                │
                             │      B/op      │     B/op      vs base                  │
Encode-16                      148.0Ki ± 0%     148.1Ki ± 0%   +0.09% (p=0.023 n=10)
Decode1-16                     147.1Ki ± 0%     147.6Ki ± 0%   +0.37% (p=0.000 n=10)
Decode100-16                   438.7Ki ± 0%     492.6Ki ± 0%  +12.29% (p=0.000 n=10)
Decode10000-16                 28.90Mi ± 0%     34.17Mi ± 0%  +18.21% (p=0.000 n=10)
ParseNewerExternalKey-16         0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=10) ¹
ParseNewExternalKey-16           0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=10) ¹
RootParseNewExternalKey-16       0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=10) ¹
RootParseNewerExternalKey-16     0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=10) ¹
geomean                                     ²                  +3.66%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                             │  before.log   │              after.log               │
                             │   allocs/op   │  allocs/op   vs base                 │
Encode-16                       27.00 ± 0%      27.00 ± 0%       ~ (p=1.000 n=10) ¹
Decode1-16                      53.00 ± 0%      53.00 ± 0%       ~ (p=1.000 n=10) ¹
Decode100-16                   5.003k ± 0%     5.003k ± 0%       ~ (p=1.000 n=10) ¹
Decode10000-16                 500.0k ± 0%     500.0k ± 0%  +0.00% (p=0.000 n=10)
ParseNewerExternalKey-16        0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseNewExternalKey-16          0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
RootParseNewExternalKey-16      0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
RootParseNewerExternalKey-16    0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                    ²                +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/grafana/loki/v3/pkg/storage/chunk/client/local
          │ before.log  │           after.log           │
          │   sec/op    │   sec/op     vs base          │
_Query-16   1.089µ ± 1%   1.086µ ± 1%  ~ (p=0.540 n=10)

          │ before.log │           after.log            │
          │    B/op    │    B/op     vs base            │
_Query-16   656.0 ± 0%   656.0 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

          │ before.log │           after.log            │
          │ allocs/op  │ allocs/op   vs base            │
_Query-16   10.00 ± 0%   10.00 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/chunk/client/util
                     │ before.log  │           after.log           │
                     │   sec/op    │   sec/op     vs base          │
GetParallelChunks-16   1.109m ± 2%   1.122m ± 2%  ~ (p=0.190 n=10)

                     │  before.log  │           after.log            │
                     │     B/op     │     B/op      vs base          │
GetParallelChunks-16   131.5Ki ± 3%   131.9Ki ± 2%  ~ (p=0.971 n=10)

                     │ before.log │          after.log           │
                     │ allocs/op  │ allocs/op   vs base          │
GetParallelChunks-16   163.0 ± 1%   162.0 ± 0%  ~ (p=0.057 n=10)

pkg: github.com/grafana/loki/v3/pkg/storage/chunk/fetcher
         │ before.log  │           after.log           │
         │   sec/op    │   sec/op     vs base          │
Fetch-16   364.0µ ± 4%   365.1µ ± 6%  ~ (p=0.971 n=10)

         │  before.log  │           after.log            │
         │     B/op     │     B/op      vs base          │
Fetch-16   285.1Ki ± 1%   286.2Ki ± 1%  ~ (p=0.579 n=10)

         │ before.log  │           after.log           │
         │  allocs/op  │  allocs/op   vs base          │
Fetch-16   4.212k ± 2%   4.222k ± 1%  ~ (p=0.971 n=10)

pkg: github.com/grafana/loki/v3/pkg/storage/config
               │ before.log  │           after.log           │
               │   sec/op    │   sec/op     vs base          │
ExternalKey-16   423.9n ± 1%   422.2n ± 1%  ~ (p=0.101 n=10)

               │ before.log │           after.log            │
               │    B/op    │    B/op     vs base            │
ExternalKey-16   112.0 ± 0%   112.0 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

               │ before.log │           after.log            │
               │ allocs/op  │ allocs/op   vs base            │
ExternalKey-16   6.000 ± 0%   6.000 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/stores/series
                                  │ before.log  │              after.log              │
                                  │   sec/op    │   sec/op     vs base                │
ParseIndexEntries500-16             66.36µ ± 0%   68.81µ ± 0%   +3.69% (p=0.000 n=10)
ParseIndexEntries2500-16            382.7µ ± 0%   396.6µ ± 0%   +3.64% (p=0.000 n=10)
ParseIndexEntries10000-16           1.643m ± 0%   1.703m ± 0%   +3.67% (p=0.000 n=10)
ParseIndexEntries50000-16           9.069m ± 1%   9.383m ± 0%   +3.45% (p=0.000 n=10)
ParseIndexEntriesRegexSet500-16     35.65µ ± 0%   43.18µ ± 3%  +21.10% (p=0.000 n=10)
ParseIndexEntriesRegexSet2500-16    173.0µ ± 0%   212.3µ ± 0%  +22.66% (p=0.000 n=10)
ParseIndexEntriesRegexSet10000-16   694.8µ ± 0%   855.1µ ± 0%  +23.07% (p=0.000 n=10)
ParseIndexEntriesRegexSet50000-16   3.548m ± 2%   4.349m ± 1%  +22.57% (p=0.000 n=10)
IndexCaching-16                     38.58µ ± 2%   38.86µ ± 2%        ~ (p=0.280 n=10)
geomean                             392.7µ        436.7µ       +11.21%

                                  │  before.log  │               after.log               │
                                  │     B/op     │     B/op      vs base                 │
ParseIndexEntries500-16             16.04Ki ± 0%   16.04Ki ± 0%       ~ (p=0.211 n=10)
ParseIndexEntries2500-16            80.05Ki ± 0%   80.05Ki ± 0%       ~ (p=0.582 n=10)
ParseIndexEntries10000-16           320.1Ki ± 0%   320.1Ki ± 0%       ~ (p=0.243 n=10)
ParseIndexEntries50000-16           1.532Mi ± 0%   1.532Mi ± 0%  +0.00% (p=0.002 n=10)
ParseIndexEntriesRegexSet500-16     8.588Ki ± 0%   8.588Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet2500-16    40.63Ki ± 0%   40.63Ki ± 0%       ~ (p=1.000 n=10)
ParseIndexEntriesRegexSet10000-16   160.7Ki ± 0%   160.7Ki ± 0%       ~ (p=0.296 n=10)
ParseIndexEntriesRegexSet50000-16   784.7Ki ± 0%   784.7Ki ± 0%       ~ (p=0.588 n=10)
IndexCaching-16                     19.66Ki ± 0%   19.66Ki ± 0%       ~ (p=0.582 n=10)
geomean                             93.71Ki        93.71Ki       +0.00%
¹ all samples are equal

                                  │ before.log │              after.log              │
                                  │ allocs/op  │ allocs/op   vs base                 │
ParseIndexEntries500-16             3.000 ± 0%   3.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntries2500-16            3.000 ± 0%   3.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntries10000-16           3.000 ± 0%   3.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntries50000-16           3.000 ± 0%   3.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet500-16     21.00 ± 0%   21.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet2500-16    21.00 ± 0%   21.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet10000-16   21.00 ± 0%   21.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet50000-16   21.00 ± 0%   21.00 ± 0%       ~ (p=1.000 n=10) ¹
IndexCaching-16                     278.0 ± 0%   278.0 ± 0%       ~ (p=1.000 n=10) ¹
geomean                             11.78        11.78       +0.00%
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/stores/series/index
                      │ before.log  │              after.log              │
                      │   sec/op    │    sec/op     vs base               │
EncodeLabelsJson-16     992.1n ± 1%   1024.5n ± 1%  +3.27% (p=0.000 n=10)
EncodeLabelsString-16   3.479µ ± 0%    3.497µ ± 0%  +0.53% (p=0.000 n=10)
geomean                 1.858µ         1.893µ       +1.89%

                      │  before.log  │              after.log               │
                      │     B/op     │     B/op      vs base                │
EncodeLabelsJson-16       560.0 ± 0%     760.0 ± 0%  +35.71% (p=0.000 n=10)
EncodeLabelsString-16   1.039Ki ± 0%   1.039Ki ± 0%        ~ (p=0.211 n=10)
geomean                   771.9          899.2       +16.50%

                      │ before.log │              after.log              │
                      │ allocs/op  │ allocs/op   vs base                 │
EncodeLabelsJson-16     18.00 ± 0%   18.00 ± 0%       ~ (p=1.000 n=10) ¹
EncodeLabelsString-16   9.000 ± 0%   9.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                 12.73        12.73       +0.00%
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/stores/shipper/bloomshipper
                                      │ before.log  │             after.log              │
                                      │   sec/op    │   sec/op     vs base               │
_BlocksCacheOld-16                      44.77µ ± 4%   45.27µ ± 1%  +1.11% (p=0.022 n=10)
_BlocksCacheNew-16                      73.82µ ± 7%   76.97µ ± 7%       ~ (p=0.393 n=10)
_Fetcher_processMetasCacheResponse-16   2.741µ ± 3%   2.748µ ± 7%       ~ (p=0.853 n=10)
geomean                                 20.85µ        21.24µ       +1.87%

                                      │  before.log  │              after.log              │
                                      │     B/op     │     B/op      vs base               │
_BlocksCacheOld-16                        33.00 ± 9%     33.00 ± 3%       ~ (p=0.447 n=10)
_BlocksCacheNew-16                      1.030Ki ± 0%   1.032Ki ± 0%       ~ (p=0.405 n=10)
_Fetcher_processMetasCacheResponse-16     871.5 ± 1%     872.0 ± 1%       ~ (p=0.444 n=10)
geomean                                   311.9          312.2       +0.08%

                                      │  before.log   │              after.log               │
                                      │   allocs/op   │  allocs/op   vs base                 │
_BlocksCacheOld-16                       0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
_BlocksCacheNew-16                      1.000k ± 0%     1.000k ± 0%       ~ (p=1.000 n=10) ¹
_Fetcher_processMetasCacheResponse-16    15.00 ± 0%      15.00 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                             ²                +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/grafana/loki/v3/pkg/storage/stores/shipper/indexshipper/tsdb
                          │ before.log  │              after.log              │
                          │   sec/op    │   sec/op     vs base                │
TenantHeads/10-16           141.3µ ± 2%   169.0µ ± 3%  +19.56% (p=0.000 n=10)
TenantHeads/100-16          1.207m ± 2%   1.523m ± 1%  +26.21% (p=0.000 n=10)
TenantHeads/1000-16         11.82m ± 2%   14.15m ± 1%  +19.74% (p=0.000 n=10)
IndexClient_Stats-16        22.96µ ± 1%   23.09µ ± 1%   +0.57% (p=0.009 n=10)
TSDBIndex_GetChunkRefs-16   2.929m ± 3%   3.008m ± 5%        ~ (p=0.315 n=10)
TSDBIndex_Volume-16         456.6µ ± 0%   549.9µ ± 0%  +20.44% (p=0.000 n=10)
geomean                     629.0µ        719.8µ       +14.45%

                          │  before.log  │               after.log                │
                          │     B/op     │     B/op       vs base                 │
TenantHeads/10-16           550.0Ki ± 0%    617.9Ki ± 0%   +12.34% (p=0.000 n=10)
TenantHeads/100-16          5.293Mi ± 0%    5.934Mi ± 0%   +12.11% (p=0.000 n=10)
TenantHeads/1000-16         55.92Mi ± 0%    63.08Mi ± 0%   +12.81% (p=0.000 n=10)
IndexClient_Stats-16        2.817Ki ± 3%    3.454Ki ± 4%   +22.60% (p=0.000 n=10)
TSDBIndex_GetChunkRefs-16   6.100Mi ± 0%    6.100Mi ± 0%         ~ (p=0.436 n=10)
TSDBIndex_Volume-16         51.70Ki ± 0%   114.17Ki ± 0%  +120.84% (p=0.000 n=10)
geomean                     733.1Ki         917.7Ki        +25.18%

                          │ before.log  │              after.log               │
                          │  allocs/op  │  allocs/op   vs base                 │
TenantHeads/10-16           2.145k ± 0%   3.146k ± 0%   +46.67% (p=0.000 n=10)
TenantHeads/100-16          21.44k ± 0%   31.45k ± 0%   +46.67% (p=0.000 n=10)
TenantHeads/1000-16         214.6k ± 0%   314.7k ± 0%   +46.64% (p=0.000 n=10)
IndexClient_Stats-16         57.00 ± 0%    59.00 ± 0%    +3.51% (p=0.000 n=10)
TSDBIndex_GetChunkRefs-16    43.00 ± 2%    44.00 ± 0%    +2.33% (p=0.001 n=10)
TSDBIndex_Volume-16         1.067k ± 0%   3.066k ± 0%  +187.35% (p=0.000 n=10)
geomean                     1.719k        2.506k        +45.79%

pkg: github.com/grafana/loki/v3/pkg/storage/stores/shipper/indexshipper/tsdb/index
                                      │  before.log   │               after.log                │
                                      │    sec/op     │     sec/op      vs base                │
ChunkStats/version_2/2_chunks-16        160.5n ±   0%   160.5n ±    0%       ~ (p=0.490 n=10)
ChunkStats/version_3/2_chunks-16        60.84n ±   6%   59.64n ±    2%       ~ (p=0.424 n=10)
ChunkStats/version_2/4_chunks-16        185.0n ±   1%   192.7n ±    0%  +4.16% (p=0.000 n=10)
ChunkStats/version_3/4_chunks-16        77.53n ±   8%   79.08n ±    5%       ~ (p=0.912 n=10)
ChunkStats/version_2/10_chunks-16       281.9n ±   0%   290.9n ±    0%  +3.17% (p=0.000 n=10)
ChunkStats/version_3/10_chunks-16       178.7n ±   6%   171.1n ±    5%       ~ (p=0.190 n=10)
ChunkStats/version_2/100_chunks-16      1.494µ ±   0%   1.536µ ±    4%  +2.81% (p=0.034 n=10)
ChunkStats/version_3/100_chunks-16      926.8n ±   0%   958.6n ±    1%  +3.44% (p=0.000 n=10)
ChunkStats/version_2/1000_chunks-16     13.21µ ±   2%   13.65µ ±    7%       ~ (p=0.353 n=10)
ChunkStats/version_3/1000_chunks-16     1.571µ ±   0%   1.584µ ±    1%  +0.86% (p=0.001 n=10)
ChunkStats/version_2/10000_chunks-16    159.0µ ±   1%   160.1µ ±    1%       ~ (p=0.165 n=10)
ChunkStats/version_3/10000_chunks-16    8.508µ ±   0%   8.513µ ±    1%       ~ (p=0.288 n=10)
ChunkStats/version_2/100000_chunks-16   1.728m ±   3%   1.778m ±    1%  +2.88% (p=0.003 n=10)
ChunkStats/version_3/100000_chunks-16   112.2µ ±   2%   114.5µ ±    5%       ~ (p=0.247 n=10)
ReadChunks/version_2/2_chunks-16        165.2n ±  48%   160.4n ±   47%       ~ (p=1.000 n=10)
ReadChunks/version_3/2_chunks-16        57.57n ± 397%   64.45n ±  613%       ~ (p=0.143 n=10)
ReadChunks/version_2/4_chunks-16        146.2n ± 244%   139.7n ±  182%       ~ (p=0.684 n=10)
ReadChunks/version_3/4_chunks-16        82.53n ± 832%   77.33n ± 1391%       ~ (p=0.445 n=7+6)
geomean                                 1.106µ          1.116µ          +0.89%

                                      │   before.log   │               after.log                │
                                      │      B/op      │     B/op      vs base                  │
ChunkStats/version_2/2_chunks-16          24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/2_chunks-16          0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/4_chunks-16          24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/4_chunks-16          0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/10_chunks-16         24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/10_chunks-16         0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/100_chunks-16        24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/100_chunks-16        48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/1000_chunks-16       24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)
ChunkStats/version_3/1000_chunks-16       48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/10000_chunks-16    120.2Ki ± 0%     120.2Ki ± 0%       ~ (p=0.712 n=10)
ChunkStats/version_3/10000_chunks-16      53.00 ± 2%       53.00 ± 0%       ~ (p=0.303 n=10)
ChunkStats/version_2/100000_chunks-16   3.065Mi ± 0%     3.066Mi ± 0%  +0.02% (p=0.001 n=10)
ChunkStats/version_3/100000_chunks-16   296.8Ki ± 0%     296.8Ki ± 0%       ~ (p=0.985 n=10)
ReadChunks/version_2/2_chunks-16          191.0 ±  ?       189.5 ±  ?       ~ (p=0.783 n=10)
ReadChunks/version_3/2_chunks-16          0.000 ±  ?       0.000 ±  ?       ~ (p=0.811 n=10)
ReadChunks/version_2/4_chunks-16          380.5 ±  ?       404.0 ±  ?       ~ (p=0.970 n=10)
ReadChunks/version_3/4_chunks-16          0.000 ±  ?       0.000 ±  ?       ~ (p=1.000 n=7+6)
geomean                                              ²                 +0.29%                 ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                      │  before.log  │              after.log               │
                                      │  allocs/op   │ allocs/op   vs base                  │
ChunkStats/version_2/2_chunks-16        1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/2_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/4_chunks-16        1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/4_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/10_chunks-16       1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/10_chunks-16       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/100_chunks-16      1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/100_chunks-16      2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/1000_chunks-16     1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/1000_chunks-16     2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/10000_chunks-16    3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/10000_chunks-16    2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/100000_chunks-16   13.00 ± 0%     13.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/100000_chunks-16   3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10)  ¹
ReadChunks/version_2/2_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ReadChunks/version_3/2_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ReadChunks/version_2/4_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ReadChunks/version_3/4_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=7+6) ¹
geomean                                            ²               +0.00%                 ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/grafana/loki/v3/pkg/storage/stores/shipper/indexshipper/util
                       │ before.log  │             after.log              │
                       │   sec/op    │   sec/op     vs base               │
_DedupeCallback-16       107.0n ± 1%   107.1n ± 0%       ~ (p=0.338 n=10)
_MultiQueries/50-16      42.44µ ± 0%   43.90µ ± 1%  +3.45% (p=0.000 n=10)
_MultiQueries/100-16     85.10µ ± 0%   87.61µ ± 1%  +2.95% (p=0.000 n=10)
_MultiQueries/1000-16    1.414m ± 3%   1.401m ± 3%       ~ (p=0.971 n=10)
_MultiQueries/10000-16   14.20m ± 8%   15.18m ± 4%  +6.88% (p=0.002 n=10)
_MultiQueries/50000-16   77.12m ± 4%   77.89m ± 4%       ~ (p=0.912 n=10)
geomean                  290.3µ        296.7µ       +2.20%

                       │  before.log  │               after.log               │
                       │     B/op     │     B/op      vs base                 │
_DedupeCallback-16         32.00 ± 0%     32.00 ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/50-16      30.06Ki ± 0%   30.06Ki ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/100-16     59.81Ki ± 0%   59.81Ki ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/1000-16    804.5Ki ± 0%   804.5Ki ± 0%       ~ (p=0.404 n=10)
_MultiQueries/10000-16   7.742Mi ± 0%   7.742Mi ± 0%       ~ (p=0.616 n=10)
_MultiQueries/50000-16   38.29Mi ± 0%   38.29Mi ± 0%  +0.00% (p=0.041 n=10)
geomean                  155.3Ki        155.3Ki       -0.00%
¹ all samples are equal

                       │ before.log  │              after.log               │
                       │  allocs/op  │  allocs/op   vs base                 │
_DedupeCallback-16        1.000 ± 0%    1.000 ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/50-16       507.0 ± 0%    507.0 ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/100-16     1.007k ± 0%   1.007k ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/1000-16    14.04k ± 0%   14.04k ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/10000-16   140.1k ± 0%   140.1k ± 0%       ~ (p=0.087 n=10)
_MultiQueries/50000-16   700.2k ± 0%   700.2k ± 0%       ~ (p=0.094 n=10)
geomean                  2.982k        2.982k       +0.00%
¹ all samples are equal

I've noted the once which show a slow down in the description.

Comment on lines +38 to +43
ls.Range(func(l labels.Label) {
if l.Name == TenantLabel {
ls = append(ls[:i], ls[i+1:]...)
break
return
}
}
return ls
b.Add(l.Name, l.Value)
})
Copy link
Contributor

Choose a reason for hiding this comment

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

Have you thought about encapsulating this functionality into the ScratchBuilder by adding a Remove(name string) function?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That's a very good point!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ScratchBuilder is owned by Promtheus. I'm trying the "normal" builder.

@@ -45,3 +47,20 @@ func (p *PoolChunkRefs) Put(xs []ChunkRef) {
//nolint:staticcheck
p.pool.Put(xs)
}

type PoolLabelsBuilder struct {
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
type PoolLabelsBuilder struct {
type LabelsBuilkderPool struct {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

That conflicts with the variable above.

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