diff --git a/plugin/sampling/strategystore/static/fixtures/5504_strategies.json b/plugin/sampling/strategystore/static/fixtures/5504_strategies.json new file mode 100644 index 000000000000..66f59562a5f0 --- /dev/null +++ b/plugin/sampling/strategystore/static/fixtures/5504_strategies.json @@ -0,0 +1,53 @@ +{ + "default_strategy": { + "type": "probabilistic", + "param": 0.2, + "operation_strategies": [ + { + "operation": "metrics", + "type": "probabilistic", + "param": 0.1 + } + ] + }, + "service_strategies": [ + { + "service": "foobar", + "type": "ratelimiting", + "param": 2 + } + ] +} + +// func Test5504SamplingStrategies(t *testing.T) { +// logger, _ := testutils.NewLogger() +// store, err := NewStrategyStore(Options{StrategiesFile: "fixtures/5504_strategies.json"}, logger) +// require.NoError(t, err) + +// expected := makeResponse(api_v2.SamplingStrategyType_RATE_LIMITING, 2) + +// s, err := store.GetSamplingStrategy(context.Background(), "foobar") +// require.NoError(t, err) +// assert.Equal(t, api_v2.SamplingStrategyType_RATE_LIMITING, s.StrategyType) +// assert.Equal(t, *expected.RateLimitingSampling, *s.RateLimitingSampling) + +// require.NotNil(t, s.OperationSampling) +// os := s.OperationSampling +// assert.EqualValues(t, 0.8, os.DefaultSamplingProbability) +// require.Len(t, os.PerOperationStrategies, 1) + +// expected = makeResponse(api_v2.SamplingStrategyType_PROBABILISTIC, 0.2) + +// d, err := store.GetSamplingStrategy(context.Background(), "default_service") +// require.NoError(t, err) +// assert.Equal(t, api_v2.SamplingStrategyType_PROBABILISTIC, d.StrategyType) +// assert.Equal(t, *expected.ProbabilisticSampling, *d.ProbabilisticSampling) + +// require.NotNil(t, s.OperationSampling) +// os = s.OperationSampling +// assert.EqualValues(t, 0.8, os.DefaultSamplingProbability) +// require.Len(t, os.PerOperationStrategies, 1) + +// assert.Equal(t, "metrics", os.PerOperationStrategies[0].Operation) +// assert.EqualValues(t, 0.1, os.PerOperationStrategies[0].ProbabilisticSampling.SamplingRate) +// } diff --git a/plugin/sampling/strategystore/static/strategy_store.go b/plugin/sampling/strategystore/static/strategy_store.go index cf8544630e95..d7254c531cf8 100644 --- a/plugin/sampling/strategystore/static/strategy_store.go +++ b/plugin/sampling/strategystore/static/strategy_store.go @@ -229,13 +229,16 @@ func (h *strategyStore) parseStrategies(strategies *strategies) { // is not merged with and only used as a fallback). opS := newStore.serviceStrategies[s.Service].OperationSampling if opS == nil { - if newStore.defaultStrategy.OperationSampling == nil || - newStore.serviceStrategies[s.Service].ProbabilisticSampling == nil { + // no default per-operation strategies - just move on + if newStore.defaultStrategy.OperationSampling == nil { continue } - // Service has no per-operation strategies, so just reference the default settings and change default samplingRate. + // Service has no per-operation strategies, so just reference the default settings + // and change default samplingRate to the value defined in service strategy if value is available. newOpS := *newStore.defaultStrategy.OperationSampling - newOpS.DefaultSamplingProbability = newStore.serviceStrategies[s.Service].ProbabilisticSampling.SamplingRate + if newStore.serviceStrategies[s.Service].ProbabilisticSampling != nil { + newOpS.DefaultSamplingProbability = newStore.serviceStrategies[s.Service].ProbabilisticSampling.SamplingRate + } newStore.serviceStrategies[s.Service].OperationSampling = &newOpS continue } diff --git a/plugin/sampling/strategystore/static/strategy_store_test.go b/plugin/sampling/strategystore/static/strategy_store_test.go index 063c28c7b818..3d51a1e810cd 100644 --- a/plugin/sampling/strategystore/static/strategy_store_test.go +++ b/plugin/sampling/strategystore/static/strategy_store_test.go @@ -471,9 +471,12 @@ func TestServiceNoPerOperationStrategies(t *testing.T) { s, err := store.GetSamplingStrategy(context.Background(), "ServiceA") require.NoError(t, err) assert.Equal(t, 1.0, s.OperationSampling.DefaultSamplingProbability) + assert.Len(t, s.OperationSampling.PerOperationStrategies, 1) s, err = store.GetSamplingStrategy(context.Background(), "ServiceB") require.NoError(t, err) + assert.Equal(t, 0.2, s.OperationSampling.DefaultSamplingProbability) + assert.Len(t, s.OperationSampling.PerOperationStrategies, 1) expected := makeResponse(api_v2.SamplingStrategyType_RATE_LIMITING, 3) assert.Equal(t, *expected.RateLimitingSampling, *s.RateLimitingSampling)