Skip to content

Commit 6f674f8

Browse files
committed
feat(backend): refactor
1 parent 9866134 commit 6f674f8

6 files changed

Lines changed: 182 additions & 30 deletions

File tree

backend/modules/observability/domain/component/config/config.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ type MetricQueryConfig struct {
118118
OfflineCriticalPoint int `mapstructure:"offline_critical_point" json:"offline_critical_point"`
119119
}
120120

121+
type MetricOfflineCalculateConfig struct {
122+
SkipSpaceIds []string `mapstructure:"skip_space_ids" json:"skip_space_ids"`
123+
}
124+
121125
//go:generate mockgen -destination=mocks/config.go -package=mocks . ITraceConfig
122126
type ITraceConfig interface {
123127
GetSystemViews(ctx context.Context) ([]*SystemView, error)
@@ -138,6 +142,7 @@ type ITraceConfig interface {
138142
GetSpanWithAnnotationMqProducerCfg(ctx context.Context) (*MqProducerCfg, error)
139143
GetMetricPlatformTenants(ctx context.Context) (*PlatformTenantsCfg, error)
140144
GetMetricQueryConfig(ctx context.Context) *MetricQueryConfig
145+
GetMetricOfflineCalculateConfig(ctx context.Context) MetricOfflineCalculateConfig
141146

142147
conf.IConfigLoader
143148
}

backend/modules/observability/domain/component/config/mocks/config.go

Lines changed: 44 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/modules/observability/domain/metric/service/metric.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,25 @@ func (m *MetricsService) buildOnlineMetricQuery(ctx context.Context, req *QueryM
442442
return nil
443443
})
444444
mBuilder.mRepoReq.Source = repo.MetricSourceOffline
445+
// add more filter
446+
cfg := m.traceConfig.GetMetricOfflineCalculateConfig(ctx)
447+
if len(cfg.SkipSpaceIds) > 0 {
448+
param.Filters = &loop_span.FilterFields{
449+
QueryAndOr: ptr.Of(loop_span.QueryAndOrEnumAnd),
450+
FilterFields: []*loop_span.FilterField{
451+
{
452+
FieldName: loop_span.SpanFieldSpaceId,
453+
FieldType: loop_span.FieldTypeString,
454+
Values: cfg.SkipSpaceIds,
455+
QueryType: ptr.Of(loop_span.QueryTypeEnumNotIn),
456+
},
457+
{
458+
QueryAndOr: ptr.Of(loop_span.QueryAndOrEnumAnd),
459+
SubFilter: param.Filters,
460+
},
461+
},
462+
}
463+
}
445464
}
446465
return mBuilder, nil
447466
}

backend/modules/observability/domain/metric/service/metric_test.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,3 +642,106 @@ func TestGetMetricGroupBy(t *testing.T) {
642642
assert.Contains(t, err.Error(), "groupby dimension has no alias")
643643
})
644644
}
645+
646+
func TestQueryMetrics_GroupBySpaceID_SkipSpaceIds(t *testing.T) {
647+
t.Parallel()
648+
ctrl := gomock.NewController(t)
649+
defer ctrl.Finish()
650+
651+
repoMock := repomocks.NewMockIMetricRepo(ctrl)
652+
tenantMock := tenantmocks.NewMockITenantProvider(ctrl)
653+
builderMock := traceServicemocks.NewMockTraceFilterProcessorBuilder(ctrl)
654+
filterMock := spanfiltermocks.NewMockFilter(ctrl)
655+
traceConfigMock := configmocks.NewMockITraceConfig(ctrl)
656+
657+
// Setup mocks
658+
tenantMock.EXPECT().GetMetricTenantsByPlatformType(gomock.Any(), gomock.Any()).Return([]string{"tenant-1"}, nil)
659+
builderMock.EXPECT().BuildPlatformRelatedFilter(gomock.Any(), gomock.Any()).Return(filterMock, nil)
660+
661+
// BuildBasicSpanFilter returns filter with SpaceId=0
662+
filterMock.EXPECT().BuildBasicSpanFilter(gomock.Any(), gomock.Any()).DoAndReturn(
663+
func(_ context.Context, env *spanfilter.SpanEnv) ([]*loop_span.FilterField, bool, error) {
664+
return []*loop_span.FilterField{
665+
{
666+
FieldName: loop_span.SpanFieldSpaceId,
667+
Values: []string{"0"},
668+
},
669+
}, true, nil
670+
},
671+
)
672+
673+
// TraceConfig returns SkipSpaceIds
674+
traceConfigMock.EXPECT().GetMetricOfflineCalculateConfig(gomock.Any()).Return(config.MetricOfflineCalculateConfig{
675+
SkipSpaceIds: []string{"space_skip_1", "space_skip_2"},
676+
})
677+
traceConfigMock.EXPECT().GetMetricQueryConfig(gomock.Any()).Return(&config.MetricQueryConfig{
678+
SupportOffline: false,
679+
}).AnyTimes()
680+
681+
requestFilter := &loop_span.FilterFields{
682+
FilterFields: []*loop_span.FilterField{
683+
{FieldName: "some_req_field", Values: []string{"val"}},
684+
},
685+
}
686+
687+
// Assert that filters are modified
688+
repoMock.EXPECT().GetMetrics(gomock.Any(), gomock.Any()).DoAndReturn(
689+
func(_ context.Context, param *repo.GetMetricsParam) (*repo.GetMetricsResult, error) {
690+
assert.NotNil(t, param.Filters)
691+
assert.Equal(t, loop_span.QueryAndOrEnumAnd, *param.Filters.QueryAndOr)
692+
// Should have 2 fields: space_id not in, and requestFilter
693+
assert.Len(t, param.Filters.FilterFields, 2)
694+
695+
// Check first field: space_id not in skip_ids
696+
f1 := param.Filters.FilterFields[0]
697+
assert.Equal(t, loop_span.SpanFieldSpaceId, f1.FieldName)
698+
assert.NotNil(t, f1.QueryType)
699+
assert.Equal(t, loop_span.QueryTypeEnumNotIn, *f1.QueryType)
700+
assert.ElementsMatch(t, []string{"space_skip_1", "space_skip_2"}, f1.Values)
701+
702+
// Check second field: requestFilter
703+
f2 := param.Filters.FilterFields[1]
704+
assert.Equal(t, loop_span.QueryAndOrEnumAnd, *f2.QueryAndOr)
705+
assert.Equal(t, requestFilter, f2.SubFilter)
706+
707+
return &repo.GetMetricsResult{
708+
Data: []map[string]any{},
709+
}, nil
710+
},
711+
)
712+
713+
metricDef := &testMetricDefinition{
714+
name: "metric_a",
715+
metricType: entity.MetricTypeTimeSeries,
716+
where: []*loop_span.FilterField{},
717+
}
718+
pMetrics := &entity.PlatformMetrics{
719+
MetricGroups: map[string]*entity.MetricGroup{
720+
"test_group": {
721+
MetricDefinitions: []entity.IMetricDefinition{metricDef},
722+
},
723+
},
724+
DrillDownObjects: map[string]*loop_span.FilterField{},
725+
PlatformMetricDefs: map[loop_span.PlatformType]*entity.PlatformMetricDef{
726+
loop_span.PlatformType("loop"): {
727+
MetricGroups: []string{"test_group"},
728+
},
729+
},
730+
}
731+
732+
svc, err := NewMetricsService(repoMock, nil, tenantMock, builderMock, traceConfigMock, pMetrics)
733+
assert.NoError(t, err)
734+
735+
_, err = svc.QueryMetrics(context.Background(), &QueryMetricsReq{
736+
PlatformType: loop_span.PlatformType("loop"),
737+
WorkspaceID: 1,
738+
MetricsNames: []string{"metric_a"},
739+
Granularity: entity.MetricGranularity1Hour,
740+
StartTime: 0,
741+
EndTime: 0,
742+
GroupBySpaceID: true,
743+
FilterFields: requestFilter,
744+
})
745+
assert.NoError(t, err)
746+
}
747+

backend/modules/observability/domain/metric/service/offline_metric_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,7 @@ func TestMetricsService_TraverseMetrics(t *testing.T) {
11051105
traceCfgMock.EXPECT().GetMetricQueryConfig(gomock.Any()).Return(&config.MetricQueryConfig{
11061106
SupportOffline: false,
11071107
}).AnyTimes()
1108+
traceCfgMock.EXPECT().GetMetricOfflineCalculateConfig(gomock.Any()).Return(config.MetricOfflineCalculateConfig{}).AnyTimes()
11081109

11091110
// 配置 filter 与租户
11101111
tenantMock.EXPECT().GetMetricTenantsByPlatformType(gomock.Any(), gomock.Any()).Return([]string{"tenant-1"}, nil)

backend/modules/observability/infra/config/trace.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const (
3030
consumerListeningCfgKey = "consumer_listening"
3131
metricPlatformTenantCfgKey = "metric_platform_tenants"
3232
metricQueryConfigKey = "metric_query_config"
33+
metricOfflineCalculateCfgKey = "metric_offline_calculate_config"
3334
)
3435

3536
type TraceConfigCenter struct {
@@ -210,6 +211,15 @@ func (t *TraceConfigCenter) GetMetricQueryConfig(ctx context.Context) *config.Me
210211
return cfg
211212
}
212213

214+
func (t *TraceConfigCenter) GetMetricOfflineCalculateConfig(ctx context.Context) config.MetricOfflineCalculateConfig {
215+
cfg := new(config.MetricOfflineCalculateConfig)
216+
if err := t.UnmarshalKey(ctx, metricOfflineCalculateCfgKey, cfg); err != nil {
217+
logs.CtxWarn(ctx, "fail to get metric query cfg, %v", err)
218+
return config.MetricOfflineCalculateConfig{}
219+
}
220+
return *cfg
221+
}
222+
213223
func NewTraceConfigCenter(confP conf.IConfigLoader) config.ITraceConfig {
214224
ret := &TraceConfigCenter{
215225
IConfigLoader: confP,

0 commit comments

Comments
 (0)