/
client.go
97 lines (84 loc) · 2.48 KB
/
client.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
// Package client implements an implementation independent storage client
package client
import (
"fmt"
"strings"
"github.com/dgraph-io/badger/v4"
util "github.com/iter8-tools/iter8/base"
"github.com/iter8-tools/iter8/storage"
"github.com/iter8-tools/iter8/storage/badgerdb"
"github.com/iter8-tools/iter8/storage/redis"
)
const (
metricsConfigFileEnv = "METRICS_CONFIG_FILE"
defaultImplementation = "badgerdb"
)
var (
// MetricsClient is storage client
MetricsClient storage.Interface
)
// metricsStorageConfig is configuration of metrics service
type metricsStorageConfig struct {
// Implementation method for metrics service
Implementation *string `json:"implementation,omitempty"`
}
// GetClient creates a metric service client based on configuration
func GetClient() (storage.Interface, error) {
conf := &metricsStorageConfig{}
err := util.ReadConfig(metricsConfigFileEnv, conf, func() {
if conf.Implementation == nil {
conf.Implementation = util.StringPointer(defaultImplementation)
}
})
if err != nil {
return nil, err
}
switch strings.ToLower(*conf.Implementation) {
case "badgerdb":
// badgerConfig defines the configuration of a badgerDB based metrics service
type mConfig struct {
badgerdb.ClientConfig `json:"badgerdb,omitempty"`
}
conf := &mConfig{}
err := util.ReadConfig(metricsConfigFileEnv, conf, func() {
if conf.ClientConfig.Storage == nil {
conf.ClientConfig.Storage = util.StringPointer("50Mi")
}
if conf.ClientConfig.StorageClassName == nil {
conf.ClientConfig.StorageClassName = util.StringPointer("standard")
}
if conf.ClientConfig.Dir == nil {
conf.ClientConfig.Dir = util.StringPointer("/metrics")
}
})
if err != nil {
return nil, err
}
cl, err := badgerdb.GetClient(badger.DefaultOptions(*conf.ClientConfig.Dir), badgerdb.AdditionalOptions{})
if err != nil {
return nil, err
}
return cl, nil
case "redis":
// redisConfig defines the configuration of a redis based metrics service
type mConfig struct {
redis.ClientConfig `json:"redis,omitempty"`
}
conf := &mConfig{}
err := util.ReadConfig(metricsConfigFileEnv, conf, func() {
if conf.ClientConfig.Address == nil {
conf.ClientConfig.Address = util.StringPointer("redis:6379")
}
})
if err != nil {
return nil, err
}
cl, err := redis.GetClient(conf.ClientConfig)
if err != nil {
return nil, err
}
return cl, nil
default:
return nil, fmt.Errorf("no metrics store implementation for %s", *conf.Implementation)
}
}