8000 refine querybuilder factory to register way, to avoid switch case mod… by kitianFresh · Pull Request #239 · gocrane/crane · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

refine querybuilder factory to register way, to avoid switch case mod… #239

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

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
11 changes: 2 additions & 9 deletions pkg/metricnaming/naming.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package metricnaming
import (
"github.com/gocrane/crane/pkg/metricquery"
"github.com/gocrane/crane/pkg/querybuilder"
msbuilder "github.com/gocrane/crane/pkg/querybuilder-providers/metricserver"
prombuilder "github.com/gocrane/crane/pkg/querybuilder-providers/prometheus"
)

// MetricNamer is an interface. it is the bridge between predictor and different data sources and other component.
Expand Down Expand Up @@ -38,13 +36,8 @@ type queryBuilderFactory struct {
}

func (q queryBuilderFactory) Builder(source metricquery.MetricSource) querybuilder.Builder 8000 {
switch source {
case metricquery.MetricServerMetricSource:
return msbuilder.NewMetricServerQueryBuilder(q.metric)
case metricquery.PrometheusMetricSource:
return prombuilder.NewPromQueryBuilder(q.metric)
}
return prombuilder.NewPromQueryBuilder(q.metric)
initFunc := querybuilder.GetBuilderFactory(source)
return initFunc(q.metric)
}

func NewQueryBuilder(metric *metricquery.Metric) querybuilder.QueryBuilder {
Expand Down
4 changes: 4 additions & 0 deletions pkg/querybuilder-providers/metricserver/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,7 @@ func metricServerQuery(query *metricquery.MetricServerQuery) *metricquery.Query
MetricServer: query,
}
}

func init() {
querybuilder.RegisterBuilderFactory(metricquery.MetricServerMetricSource, NewMetricServerQueryBuilder)
}
4 changes: 4 additions & 0 deletions pkg/querybuilder-providers/prometheus/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,3 +154,7 @@ func promQuery(prom *metricquery.PrometheusQuery) *metricquery.Query {
Prometheus: prom,
}
}

func init() {
querybuilder.RegisterBuilderFactory(metricquery.PrometheusMetricSource, NewPromQueryBuilder)
}
21 changes: 21 additions & 0 deletions pkg/querybuilder/query.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package querybuilder

import (
"sync"

"github.com/gocrane/crane/pkg/metricquery"
)

Expand All @@ -13,3 +15,22 @@ type Builder interface {
type QueryBuilder interface {
Builder(source metricquery.MetricSource) Builder
}

var (
factoryLock sync.Mutex
builderFactory = make(map[metricquery.MetricSource]BuilderFactoryFunc)
)

type BuilderFactoryFunc func(metric *metricquery.Metric) Builder

func RegisterBuilderFactory(metricSource metricquery.MetricSource, initFunc BuilderFactoryFunc) {
Copy link
Member

Choose a reason for hiding this comment

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

Do we need lock here?

factoryLock.Lock()
defer factoryLock.Unlock()
builderFactory[metricSource] = initFunc
}

func GetBuilderFactory(metricSource metricquery.MetricSource) BuilderFactoryFunc {
factoryLock.Lock()
defer factoryLock.Unlock()
return builderFactory[metricSource]
}
0