-
Notifications
You must be signed in to change notification settings - Fork 810
/
metricproviders.go
134 lines (123 loc) · 4.46 KB
/
metricproviders.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package metricproviders
import (
"fmt"
"github.com/argoproj/argo-rollouts/metric"
"github.com/argoproj/argo-rollouts/metricproviders/influxdb"
"github.com/argoproj/argo-rollouts/metricproviders/skywalking"
"github.com/argoproj/argo-rollouts/metricproviders/cloudwatch"
"github.com/argoproj/argo-rollouts/metricproviders/datadog"
"github.com/argoproj/argo-rollouts/metricproviders/graphite"
"github.com/argoproj/argo-rollouts/metricproviders/kayenta"
"github.com/argoproj/argo-rollouts/metricproviders/newrelic"
"github.com/argoproj/argo-rollouts/metricproviders/plugin"
"github.com/argoproj/argo-rollouts/metricproviders/wavefront"
"github.com/argoproj/argo-rollouts/metricproviders/webmetric"
log "github.com/sirupsen/logrus"
"k8s.io/client-go/kubernetes"
batchlisters "k8s.io/client-go/listers/batch/v1"
"github.com/argoproj/argo-rollouts/metricproviders/job"
"github.com/argoproj/argo-rollouts/metricproviders/prometheus"
"github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1"
)
type ProviderFactory struct {
KubeClient kubernetes.Interface
JobLister batchlisters.JobLister
}
type ProviderFactoryFunc func(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error)
// NewProvider creates the correct provider based on the provider type of the Metric
func (f *ProviderFactory) NewProvider(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) {
switch provider := Type(metric); provider {
case prometheus.ProviderType:
api, err := prometheus.NewPrometheusAPI(metric)
if err != nil {
return nil, err
}
return prometheus.NewPrometheusProvider(api, logCtx, metric)
case job.ProviderType:
return job.NewJobProvider(logCtx, f.KubeClient, f.JobLister), nil
case kayenta.ProviderType:
c := kayenta.NewHttpClient()
return kayenta.NewKayentaProvider(logCtx, c), nil
case webmetric.ProviderType:
c := webmetric.NewWebMetricHttpClient(metric)
p, err := webmetric.NewWebMetricJsonParser(metric)
if err != nil {
return nil, err
}
return webmetric.NewWebMetricProvider(logCtx, c, p), nil
case datadog.ProviderType:
return datadog.NewDatadogProvider(logCtx, f.KubeClient)
case wavefront.ProviderType:
client, err := wavefront.NewWavefrontAPI(metric, f.KubeClient)
if err != nil {
return nil, err
}
return wavefront.NewWavefrontProvider(client, logCtx), nil
case newrelic.ProviderType:
client, err := newrelic.NewNewRelicAPIClient(metric, f.KubeClient)
if err != nil {
return nil, err
}
return newrelic.NewNewRelicProvider(client, logCtx), nil
case graphite.ProviderType:
client, err := graphite.NewAPIClient(metric, logCtx)
if err != nil {
return nil, err
}
return graphite.NewGraphiteProvider(client, logCtx), nil
case cloudwatch.ProviderType:
client, err := cloudwatch.NewCloudWatchAPIClient(metric)
if err != nil {
return nil, err
}
return cloudwatch.NewCloudWatchProvider(client, logCtx), nil
case influxdb.ProviderType:
client, err := influxdb.NewInfluxdbAPI(metric, f.KubeClient)
if err != nil {
return nil, err
}
return influxdb.NewInfluxdbProvider(client, logCtx), nil
case skywalking.ProviderType:
client, err := skywalking.NewSkyWalkingClient(metric, f.KubeClient)
if err != nil {
return nil, err
}
return skywalking.NewSkyWalkingProvider(client, logCtx), nil
case plugin.ProviderType:
plugin, err := plugin.NewRpcPlugin(metric)
if err != nil {
return nil, fmt.Errorf("failed to create plugin: %v", err)
}
return plugin, nil
default:
return nil, fmt.Errorf("no valid provider in metric '%s'", metric.Name)
}
}
func Type(metric v1alpha1.Metric) string {
if metric.Provider.Prometheus != nil {
return prometheus.ProviderType
} else if metric.Provider.Job != nil {
return job.ProviderType
} else if metric.Provider.Kayenta != nil {
return kayenta.ProviderType
} else if metric.Provider.Web != nil {
return webmetric.ProviderType
} else if metric.Provider.Datadog != nil {
return datadog.ProviderType
} else if metric.Provider.Wavefront != nil {
return wavefront.ProviderType
} else if metric.Provider.NewRelic != nil {
return newrelic.ProviderType
} else if metric.Provider.CloudWatch != nil {
return cloudwatch.ProviderType
} else if metric.Provider.Graphite != nil {
return graphite.ProviderType
} else if metric.Provider.Influxdb != nil {
return influxdb.ProviderType
} else if metric.Provider.SkyWalking != nil {
return skywalking.ProviderType
} else if metric.Provider.Plugin != nil {
return plugin.ProviderType
}
return "Unknown Provider"
}