/
exporters.go
78 lines (67 loc) · 2.5 KB
/
exporters.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
package metrics
import (
"github.com/launchdarkly/ld-relay/v7/config"
"github.com/launchdarkly/go-sdk-common/v3/ldlog"
)
// exporterType represents one of the kinds of OpenCensus exporters that we support.
type exporterType interface {
// Returns the human-readable name, like "Datadog".
getName() string
// Checks the MetricsConfig and *if* this type of exporter is enabled in it, constructs an
// implementation of the exporter interface containing the relevant configuration (but does not
// register it yet). If this type of exporter is not enabled, returns (nil, nil).
createExporterIfEnabled(config.MetricsConfig, ldlog.Loggers) (exporter, error)
}
type exporter interface {
// Attempts to register this exporter with OpenCensus.
register() error
// Attempts to unregister this exporter with OpenCensus and release any other resources it uses.
close() error
}
type exportersSet map[exporterType]exporter
func allExporterTypes() []exporterType {
return []exporterType{datadogExporterType, prometheusExporterType, stackdriverExporterType}
}
// Attempts to create and register all of the types of exporters in exporterTypes that are actually
// enabled in the configuration. An error in any of them causes the whole operation to fail and
// unregisters any that have already been registered.
func registerExporters(
exporterTypes []exporterType,
c config.MetricsConfig,
loggers ldlog.Loggers,
) (exportersSet, error) {
registered := make(exportersSet)
for _, t := range exporterTypes {
exporter, err := t.createExporterIfEnabled(c, loggers)
if err != nil {
loggers.Errorf("Error creating %s metrics exporter: %s", t.getName(), err)
closeExporters(registered, loggers)
return nil, err
}
if exporter != nil {
err := exporter.register()
if err != nil {
loggers.Errorf("Error registering %s metrics exporter: %s", t.getName(), err)
closeExporters(registered, loggers)
return nil, err
}
loggers.Infof("Successfully registered %s metrics exporter", t.getName())
registered[t] = exporter
}
}
return registered, nil
}
// Attempts to unregister and close a set of exporters. Errors are logged but do not stop the operation.
func closeExporters(exporters exportersSet, loggers ldlog.Loggers) {
for t, e := range exporters {
if err := e.close(); err != nil {
loggers.Errorf("Error closing %s metrics exporter: %s", t.getName(), err)
}
}
}
func getPrefix(configuredPrefix string) string {
if configuredPrefix != "" {
return configuredPrefix
}
return defaultMetricsPrefix
}