@@ -23,6 +23,7 @@ import (
23
23
"github.com/signalfx/golib/v3/trace"
24
24
"github.com/signalfx/signalfx-agent/pkg/core/dpfilters"
25
25
"github.com/signalfx/signalfx-agent/pkg/monitors/types"
26
+ "github.com/signalfx/signalfx-agent/pkg/utils"
26
27
"go.opentelemetry.io/collector/consumer"
27
28
"go.opentelemetry.io/collector/obsreport"
28
29
"go.uber.org/zap"
@@ -34,20 +35,22 @@ const internalTransport = "internal"
34
35
// It is what provides metrics to the next MetricsConsumer (to be implemented later). At this stage it is only
35
36
// a logging instance.
36
37
type Output struct {
37
- receiverName string
38
- nextConsumer consumer.MetricsConsumer
39
- logger * zap.Logger
40
- converter Converter
38
+ receiverName string
39
+ nextConsumer consumer.MetricsConsumer
40
+ logger * zap.Logger
41
+ converter Converter
42
+ extraDimensions map [string ]string
41
43
}
42
44
43
45
var _ types.FilteringOutput = (* Output )(nil )
44
46
45
47
func NewOutput (config Config , nextConsumer consumer.MetricsConsumer , logger * zap.Logger ) * Output {
46
48
return & Output {
47
- receiverName : config .Name (),
48
- nextConsumer : nextConsumer ,
49
- logger : logger ,
50
- converter : Converter {logger : logger },
49
+ receiverName : config .Name (),
50
+ nextConsumer : nextConsumer ,
51
+ logger : logger ,
52
+ converter : Converter {logger : logger },
53
+ extraDimensions : map [string ]string {},
51
54
}
52
55
}
53
56
@@ -70,15 +73,23 @@ func (output *Output) HasAnyExtraMetrics() bool {
70
73
return false
71
74
}
72
75
76
+ // Some monitors will clone their Output to provide to child monitors with their own extraDimensions
73
77
func (output * Output ) Copy () types.Output {
74
- output .logger .Debug ("Copy has been called." )
75
- return output
78
+ output .logger .Debug ("Copying Output" , zap .Any ("output" , output ))
79
+ cp := * output
80
+ cp .extraDimensions = utils .CloneStringMap (output .extraDimensions )
81
+ return & cp
76
82
}
77
83
78
84
func (output * Output ) SendDatapoints (datapoints ... * datapoint.Datapoint ) {
79
85
ctx := obsreport .ReceiverContext (context .Background (), output .receiverName , internalTransport )
80
86
ctx = obsreport .StartMetricsReceiveOp (ctx , typeStr , internalTransport )
81
87
88
+ for _ , dp := range datapoints {
89
+ // Output's extraDimensions take priority over datapoint's
90
+ dp .Dimensions = utils .MergeStringMaps (dp .Dimensions , output .extraDimensions )
91
+ }
92
+
82
93
metrics , numDropped := output .converter .toMetrics (datapoints , time .Now ())
83
94
if numDropped > 0 {
84
95
output .logger .Debug ("SendDatapoints has dropped points" , zap .Int ("numDropped" , numDropped ))
@@ -98,15 +109,17 @@ func (output *Output) SendSpans(spans ...*trace.Span) {
98
109
}
99
110
100
111
func (output * Output ) SendDimensionUpdate (dimension * types.Dimension ) {
101
- output .logger .Debug ("SendDimensionUpdate has been called." , zap .Any ("dimension" , dimension ))
112
+ output .logger .Debug ("SendDimensionUpdate has been called." , zap .Any ("dimension" , dimension . String () ))
102
113
}
103
114
104
115
func (output * Output ) AddExtraDimension (key , value string ) {
105
- output .logger .Debug ("AddExtraDimension has been called." , zap .String ("key" , key ), zap .String ("value" , value ))
116
+ output .logger .Debug ("Adding extra dimension" , zap .String ("key" , key ), zap .String ("value" , value ))
117
+ output .extraDimensions [key ] = value
106
118
}
107
119
108
120
func (output * Output ) RemoveExtraDimension (key string ) {
109
- output .logger .Debug ("RemoveExtraDimension has been called." , zap .String ("key" , key ))
121
+ output .logger .Debug ("Removing extra dimension" , zap .String ("key" , key ))
122
+ delete (output .extraDimensions , key )
110
123
}
111
124
112
125
func (output * Output ) AddExtraSpanTag (key , value string ) {
0 commit comments