Skip to content
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

Add /status/overrides/{tenant} endpoint #3244

Merged
merged 7 commits into from
Jan 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
* [ENHANCEMENT] Added a `parquet-page` cache role for page level caching. [#3196](https://github.com/grafana/tempo/pull/3196) (@joe-elliott)
* [ENHANCEMENT] Update opentelemetry-collector-contrib dependency to the latest version, v0.89.0 [#3148](https://github.com/grafana/tempo/pull/3148) (@gebn)
* [ENHANCEMENT] Update memcached default image in jsonnet for multiple CVE [#3310](https://github.com/grafana/tempo/pull/3310) (@zalegrala)
* [ENHANCEMENT] Add /status/overrides/{tenant} endpoint [#3244](https://github.com/grafana/tempo/pull/3244) (@kvrhdn)
* [BUGFIX] Prevent building parquet iterators that would loop forever. [#3159](https://github.com/grafana/tempo/pull/3159) (@mapno)
* [BUGFIX] Sanitize name in mapped dimensions in span-metrics processor [#3171](https://github.com/grafana/tempo/pull/3171) (@mapno)
* [BUGFIX] Fixed an issue where cached footers were requested then ignored. [#3196](https://github.com/grafana/tempo/pull/3196) (@joe-elliott)
Expand Down
8 changes: 4 additions & 4 deletions cmd/tempo-cli/cmd-migrate-overrides-config.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import (
"os"

"github.com/grafana/dskit/services"

"github.com/grafana/tempo/modules/overrides"
"github.com/prometheus/client_golang/prometheus"
"gopkg.in/yaml.v2"

"github.com/grafana/tempo/cmd/tempo/app"
"gopkg.in/yaml.v2"
"github.com/grafana/tempo/modules/overrides"
)

type migrateOverridesConfigCmd struct {
Expand All @@ -39,7 +39,7 @@ func (cmd *migrateOverridesConfigCmd) Run(*globalOptions) error {
return fmt.Errorf("failed to parse configFile %s: %w", cmd.ConfigFile, err)
}

o, err := overrides.NewOverrides(cfg.Overrides)
o, err := overrides.NewOverrides(cfg.Overrides, prometheus.DefaultRegisterer)
if err != nil {
return fmt.Errorf("failed to load overrides module: %w", err)
}
Expand Down
22 changes: 22 additions & 0 deletions cmd/tempo/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ func (t *App) Run() error {
t.Server.HTTP().Path("/ready").Handler(t.readyHandler(sm))
t.Server.HTTP().Path("/status").Handler(t.statusHandler()).Methods("GET")
t.Server.HTTP().Path("/status/{endpoint}").Handler(t.statusHandler()).Methods("GET")
t.Server.HTTP().Path("/status/overrides/{tenant}").Handler(t.tenantOverridesHandler()).Methods("GET")
grpc_health_v1.RegisterHealthServer(t.Server.GRPC(), grpcutil.NewHealthCheck(sm))

// Let's listen for events from this manager, and log them.
Expand Down Expand Up @@ -372,6 +373,8 @@ func (t *App) statusHandler() http.HandlerFunc {

switch endpoint {
case "runtime_config":
fallthrough
case "overrides":
err := t.writeRuntimeConfig(&msg, r)
if err != nil {
errs = append(errs, err)
Expand Down Expand Up @@ -520,6 +523,25 @@ func (t *App) writeStatusEndpoints(w io.Writer) error {
return nil
}

func (t *App) tenantOverridesHandler() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)

tenant, ok := vars["tenant"]
if !ok {
http.Error(w, "must specify tenant ID", http.StatusBadRequest)
return
}

err := t.Overrides.WriteTenantOverrides(w, r, tenant)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
level.Error(log.Logger).Log("msg", "error writing response", "endpoint", r.URL.String(), "err", err)
return
}
}
}

func (t *App) buildinfoHandler() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
Expand Down
2 changes: 1 addition & 1 deletion cmd/tempo/app/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ func (t *App) initReadRing(cfg ring.Config, name, key string) (*ring.Ring, error
}

func (t *App) initOverrides() (services.Service, error) {
o, err := overrides.NewOverrides(t.cfg.Overrides)
o, err := overrides.NewOverrides(t.cfg.Overrides, prometheus.DefaultRegisterer)
if err != nil {
return nil, fmt.Errorf("failed to create overrides: %w", err)
}
Expand Down
10 changes: 9 additions & 1 deletion docs/sources/tempo/api_docs/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,14 @@ Displays the override configuration.
Query parameter:
- `mode = (diff)`: Show the difference between defaults and overrides.

Alias: `/status/overrides`

```
GET /status/overrides/{tenant}
```

Displays the override configuration for the specified tenant.

```
GET /status/usage-stats
```
Expand Down Expand Up @@ -634,4 +642,4 @@ message SearchMetrics {
uint32 totalJobs = 5;
uint64 totalBlockBytes = 6;
}
```
```
9 changes: 5 additions & 4 deletions modules/compactor/compactor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"math"
"testing"

"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

Expand All @@ -23,7 +24,7 @@ func TestCombineLimitsNotHit(t *testing.T) {
MaxBytesPerTrace: math.MaxInt,
},
},
})
}, prometheus.DefaultRegisterer)
require.NoError(t, err)

c := &Compactor{
Expand Down Expand Up @@ -57,7 +58,7 @@ func TestCombineLimitsHit(t *testing.T) {
MaxBytesPerTrace: 1,
},
},
})
}, prometheus.DefaultRegisterer)
require.NoError(t, err)

c := &Compactor{
Expand Down Expand Up @@ -91,7 +92,7 @@ func TestCombineDoesntEnforceZero(t *testing.T) {
MaxBytesPerTrace: math.MaxInt,
},
},
})
}, prometheus.DefaultRegisterer)
require.NoError(t, err)

c := &Compactor{
Expand Down Expand Up @@ -146,7 +147,7 @@ func TestDedicatedColumns(t *testing.T) {
},
},
},
})
}, prometheus.DefaultRegisterer)
require.NoError(t, err)

c := &Compactor{overrides: o}
Expand Down
2 changes: 1 addition & 1 deletion modules/distributor/distributor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1393,7 +1393,7 @@ func prepare(t *testing.T, limits overrides.Config, logger kitlog.Logger) *Distr
)
flagext.DefaultValues(&clientConfig)

overrides, err := overrides.NewOverrides(limits)
overrides, err := overrides.NewOverrides(limits, prometheus.DefaultRegisterer)
require.NoError(t, err)

// Mock the ingesters ring
Expand Down
5 changes: 3 additions & 2 deletions modules/distributor/forwarder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"time"

"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

Expand All @@ -30,7 +31,7 @@ func TestForwarder(t *testing.T) {
keys, rebatchedTraces, err := requestsByTraceID([]*v1.ResourceSpans{b}, tenantID, 10)
require.NoError(t, err)

o, err := overrides.NewOverrides(oCfg)
o, err := overrides.NewOverrides(oCfg, prometheus.DefaultRegisterer)
require.NoError(t, err)

wg := sync.WaitGroup{}
Expand Down Expand Up @@ -71,7 +72,7 @@ func TestForwarder_shutdown(t *testing.T) {
keys, rebatchedTraces, err := requestsByTraceID([]*v1.ResourceSpans{b}, tenantID, 10)
require.NoError(t, err)

o, err := overrides.NewOverrides(oCfg)
o, err := overrides.NewOverrides(oCfg, prometheus.DefaultRegisterer)
require.NoError(t, err)

signalCh := make(chan struct{})
Expand Down
3 changes: 2 additions & 1 deletion modules/distributor/ingestion_rate_strategy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"testing"

"github.com/grafana/dskit/limiter"
"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -57,7 +58,7 @@ func TestIngestionRateStrategy(t *testing.T) {
// Init limits overrides
o, err := overrides.NewOverrides(overrides.Config{
Defaults: testData.limits,
})
}, prometheus.DefaultRegisterer)
require.NoError(t, err)

// Instance the strategy
Expand Down
10 changes: 6 additions & 4 deletions modules/frontend/search_streaming_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ import (
"github.com/golang/protobuf/jsonpb" //nolint:all //deprecated
"github.com/google/uuid"
"github.com/grafana/dskit/user"
"github.com/grafana/tempo/modules/overrides"
"github.com/grafana/tempo/pkg/tempopb"
"github.com/grafana/tempo/tempodb/backend"
"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/require"
"go.uber.org/atomic"
"google.golang.org/grpc/metadata"

"github.com/grafana/tempo/modules/overrides"
"github.com/grafana/tempo/pkg/tempopb"
"github.com/grafana/tempo/tempodb/backend"
)

type mockStreamingServer struct {
Expand Down Expand Up @@ -209,7 +211,7 @@ func TestStreamingSearchHandlerFailsDueToError(t *testing.T) {
func testHandler(t *testing.T, next http.RoundTripper) streamingSearchHandler {
t.Helper()

o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(t, err)

handler := newSearchStreamingGRPCHandler(Config{
Expand Down
19 changes: 10 additions & 9 deletions modules/frontend/searchsharding_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/golang/protobuf/jsonpb" //nolint:all deprecated
"github.com/google/uuid"
"github.com/grafana/dskit/user"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/model"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -702,7 +703,7 @@ func TestSearchSharderRoundTrip(t *testing.T) {
}, nil
})

o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(t, err)

sharder := newSearchSharder(&mockReader{
Expand Down Expand Up @@ -765,7 +766,7 @@ func TestTotalJobsIncludesIngester(t *testing.T) {
}, nil
})

o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(t, err)

now := time.Now().Add(-10 * time.Minute).Unix()
Expand Down Expand Up @@ -812,7 +813,7 @@ func TestSearchSharderRoundTripBadRequest(t *testing.T) {
return nil, nil
})

o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(t, err)

sharder := newSearchSharder(&mockReader{}, o, SearchSharderConfig{
Expand Down Expand Up @@ -845,7 +846,7 @@ func TestSearchSharderRoundTripBadRequest(t *testing.T) {
MaxSearchDuration: model.Duration(time.Minute),
},
},
})
}, prometheus.DefaultRegisterer)
require.NoError(t, err)

sharder = newSearchSharder(&mockReader{}, o, SearchSharderConfig{
Expand Down Expand Up @@ -884,7 +885,7 @@ func TestSharderAccessesCache(t *testing.T) {
// setup mock cache
c := cache.NewMockCache()

o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(t, err)

meta := &backend.BlockMeta{
Expand Down Expand Up @@ -1003,7 +1004,7 @@ func TestAdjustLimit(t *testing.T) {

func TestMaxDuration(t *testing.T) {
//
o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(t, err)
sharder := searchSharder{
cfg: SearchSharderConfig{
Expand All @@ -1020,7 +1021,7 @@ func TestMaxDuration(t *testing.T) {
MaxSearchDuration: model.Duration(10 * time.Minute),
},
},
})
}, prometheus.DefaultRegisterer)
require.NoError(t, err)
sharder = searchSharder{
cfg: SearchSharderConfig{
Expand Down Expand Up @@ -1089,7 +1090,7 @@ func TestSubRequestsCancelled(t *testing.T) {
return httptest.NewRecorder().Result(), nil
})

o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(t, err)

sharder := newSearchSharder(&mockReader{
Expand Down Expand Up @@ -1352,7 +1353,7 @@ func benchmarkSearchSharderRoundTrip(b *testing.B, s int32) {
}, nil
})

o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(b, err)

totalMetas := 10000
Expand Down
5 changes: 3 additions & 2 deletions modules/frontend/tracebyidsharding_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/go-kit/log"
"github.com/gogo/protobuf/proto"
"github.com/grafana/dskit/user"
"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/atomic"
Expand Down Expand Up @@ -188,7 +189,7 @@ func TestShardingWareDoRequest(t *testing.T) {
},
}

o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(t, err)

for _, tc := range tests {
Expand Down Expand Up @@ -272,7 +273,7 @@ func TestShardingWareDoRequest(t *testing.T) {
func TestConcurrentShards(t *testing.T) {
concurrency := 2

o, err := overrides.NewOverrides(overrides.Config{})
o, err := overrides.NewOverrides(overrides.Config{}, prometheus.DefaultRegisterer)
require.NoError(t, err)

sharder := newTraceByIDSharder(&TraceByIDConfig{
Expand Down
2 changes: 1 addition & 1 deletion modules/ingester/ingester_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ func defaultIngesterModule(t testing.TB, tmpDir string) *Ingester {

func defaultIngesterWithOverrides(t testing.TB, tmpDir string, o overrides.Config) *Ingester {
ingesterConfig := defaultIngesterTestConfig()
limits, err := overrides.NewOverrides(o)
limits, err := overrides.NewOverrides(o, prometheus.DefaultRegisterer)
require.NoError(t, err, "unexpected error creating overrides")

s, err := storage.NewStore(storage.Config{
Expand Down
Loading