29
29
import com .arpnetworking .steno .LogValueMapFactory ;
30
30
import com .arpnetworking .steno .Logger ;
31
31
import com .arpnetworking .steno .LoggerFactory ;
32
+ import com .arpnetworking .tsdcore .model .DefaultKey ;
33
+ import com .arpnetworking .tsdcore .model .Key ;
32
34
import com .arpnetworking .tsdcore .model .MetricType ;
33
35
import com .arpnetworking .tsdcore .model .Quantity ;
34
36
import com .arpnetworking .utility .RegexAndMapReplacer ;
41
43
import net .sf .oval .constraint .NotNull ;
42
44
43
45
import java .util .Collections ;
44
- import java .util .List ;
45
46
import java .util .Map ;
46
47
import java .util .regex .Matcher ;
47
48
import java .util .regex .Pattern ;
@@ -90,9 +91,9 @@ private TransformingSource(final Builder builder) {
90
91
super (builder );
91
92
_source = builder ._source ;
92
93
93
- final ImmutableMap .Builder <Pattern , List <String >> findReplaceBuilder =
94
+ final ImmutableMap .Builder <Pattern , ImmutableList <String >> findReplaceBuilder =
94
95
ImmutableMap .builderWithExpectedSize (builder ._findAndReplace .size ());
95
- for (final Map .Entry <String , ? extends List <String >> entry : builder ._findAndReplace .entrySet ()) {
96
+ for (final ImmutableMap .Entry <String , ? extends ImmutableList <String >> entry : builder ._findAndReplace .entrySet ()) {
96
97
findReplaceBuilder .put (Pattern .compile (entry .getKey ()), ImmutableList .copyOf (entry .getValue ()));
97
98
}
98
99
_findAndReplace = findReplaceBuilder .build ();
@@ -104,7 +105,7 @@ private TransformingSource(final Builder builder) {
104
105
}
105
106
106
107
private final Source _source ;
107
- private final ImmutableMap <Pattern , List <String >> _findAndReplace ;
108
+ private final ImmutableMap <Pattern , ImmutableList <String >> _findAndReplace ;
108
109
private final ImmutableMap <String , DimensionInjection > _inject ;
109
110
private final ImmutableList <String > _remove ;
110
111
@@ -116,7 +117,7 @@ private TransformingSource(final Builder builder) {
116
117
117
118
/* package private */ TransformingObserver (
118
119
final TransformingSource source ,
119
- final Map <Pattern , List <String >> findAndReplace ,
120
+ final ImmutableMap <Pattern , ImmutableList <String >> findAndReplace ,
120
121
final ImmutableMap <String , DimensionInjection > inject ,
121
122
final ImmutableList <String > remove ) {
122
123
_source = source ;
@@ -137,11 +138,11 @@ public void notify(final Observable observable, final Object event) {
137
138
138
139
// Merge the metrics in the record together
139
140
final Record record = (Record ) event ;
140
- final Map <ImmutableMap < String , String > , Map <String , MergingMetric >> mergedMetrics = Maps .newHashMap ();
141
+ final Map <Key , Map <String , MergingMetric >> mergedMetrics = Maps .newHashMap ();
141
142
for (final Map .Entry <String , ? extends Metric > metric : record .getMetrics ().entrySet ()) {
142
143
boolean found = false ;
143
144
final String metricName = metric .getKey ();
144
- for (final Map .Entry <Pattern , List <String >> findAndReplace : _findAndReplace .entrySet ()) {
145
+ for (final Map .Entry <Pattern , ImmutableList <String >> findAndReplace : _findAndReplace .entrySet ()) {
145
146
final Pattern metricPattern = findAndReplace .getKey ();
146
147
final Matcher matcher = metricPattern .matcher (metricName );
147
148
if (matcher .find ()) {
@@ -158,7 +159,7 @@ public void notify(final Observable observable, final Object event) {
158
159
metric .getValue (),
159
160
replacedString ,
160
161
mergedMetrics ,
161
- getModifiedDimensions (record .getDimensions (), Collections .emptyMap (), ImmutableList . of () ));
162
+ getModifiedDimensions (record .getDimensions (), Collections .emptyMap (), consumedDimensions ));
162
163
} else {
163
164
final String newMetricName = replacedString .substring (0 , tagsStart );
164
165
final Map <String , String > parsedTags = TAG_SPLITTER .split (replacedString .substring (tagsStart + 1 ));
@@ -184,7 +185,7 @@ public void notify(final Observable observable, final Object event) {
184
185
185
186
// Raise the merged record event with this source's observers
186
187
// NOTE: Do not leak instances of MergingMetric since it is mutable
187
- for (Map .Entry <ImmutableMap < String , String > , Map <String , MergingMetric >> entry : mergedMetrics .entrySet ()) {
188
+ for (final Map .Entry <Key , Map <String , MergingMetric >> entry : mergedMetrics .entrySet ()) {
188
189
_source .notify (
189
190
ThreadLocalBuilder .build (
190
191
DefaultRecord .Builder .class ,
@@ -198,16 +199,15 @@ public void notify(final Observable observable, final Object event) {
198
199
.setId (record .getId ())
199
200
.setTime (record .getTime ())
200
201
.setAnnotations (record .getAnnotations ())
201
- .setDimensions (entry .getKey ())));
202
+ .setDimensions (entry .getKey (). getParameters () )));
202
203
}
203
204
}
204
205
205
- private ImmutableMap < String , String > getModifiedDimensions (
206
+ private Key getModifiedDimensions (
206
207
final ImmutableMap <String , String > inputDimensions ,
207
208
final Map <String , String > add ,
208
209
final ImmutableList <String > remove ) {
209
- final Map <String , String > finalTags = Maps .newHashMap ();
210
- finalTags .putAll (inputDimensions );
210
+ final Map <String , String > finalTags = Maps .newHashMap (inputDimensions );
211
211
// Remove the dimensions that we consumed in the replacement
212
212
remove .forEach (finalTags ::remove );
213
213
_remove .forEach (finalTags ::remove );
@@ -217,14 +217,17 @@ private ImmutableMap<String, String> getModifiedDimensions(
217
217
inject .isReplaceExisting () || oldValue == null ? inject .getValue () : oldValue ));
218
218
finalTags .putAll (add );
219
219
220
- return ImmutableMap .copyOf (finalTags );
220
+ return new DefaultKey ( ImmutableMap .copyOf (finalTags ) );
221
221
}
222
222
223
- private void merge (final Metric metric , final String key ,
224
- final Map <ImmutableMap <String , String >, Map <String , MergingMetric >> mergedMetrics ,
225
- final ImmutableMap <String , String > dimensions ) {
223
+ private void merge (
224
+ final Metric metric ,
225
+ final String key ,
226
+ final Map <Key , Map <String , MergingMetric >> mergedMetrics ,
227
+ final Key dimensionKey ) {
226
228
227
- final Map <String , MergingMetric > mergedMetricsForDimensions = mergedMetrics .computeIfAbsent (dimensions , k -> Maps .newHashMap ());
229
+ final Map <String , MergingMetric > mergedMetricsForDimensions =
230
+ mergedMetrics .computeIfAbsent (dimensionKey , k -> Maps .newHashMap ());
228
231
final MergingMetric mergedMetric = mergedMetricsForDimensions .get (key );
229
232
if (mergedMetric == null ) {
230
233
// This is the first time this metric is being merged into
@@ -244,7 +247,7 @@ private void merge(final Metric metric, final String key,
244
247
}
245
248
246
249
private final TransformingSource _source ;
247
- private final Map <Pattern , List <String >> _findAndReplace ;
250
+ private final ImmutableMap <Pattern , ImmutableList <String >> _findAndReplace ;
248
251
private final ImmutableMap <String , DimensionInjection > _inject ;
249
252
private final ImmutableList <String > _remove ;
250
253
}
@@ -385,7 +388,7 @@ public Builder setSource(final Source value) {
385
388
* @param value The find and replace expression map.
386
389
* @return This instance of <code>Builder</code>.
387
390
*/
388
- public Builder setFindAndReplace (final ImmutableMap <String , ? extends List <String >> value ) {
391
+ public Builder setFindAndReplace (final ImmutableMap <String , ? extends ImmutableList <String >> value ) {
389
392
_findAndReplace = value ;
390
393
return this ;
391
394
}
@@ -420,7 +423,7 @@ protected Builder self() {
420
423
@ NotNull
421
424
private Source _source ;
422
425
@ NotNull
423
- private ImmutableMap <String , ? extends List <String >> _findAndReplace = ImmutableMap .of ();
426
+ private ImmutableMap <String , ? extends ImmutableList <String >> _findAndReplace = ImmutableMap .of ();
424
427
@ NotNull
425
428
private ImmutableMap <String , DimensionInjection > _inject = ImmutableMap .of ();
426
429
@ NotNull
0 commit comments