|
25 | 25 | import com.arpnetworking.tsdcore.model.AggregatedData;
|
26 | 26 | import com.arpnetworking.tsdcore.model.PeriodicData;
|
27 | 27 | import com.fasterxml.jackson.annotation.JacksonInject;
|
| 28 | +import com.google.common.collect.ImmutableMap; |
| 29 | +import com.google.common.collect.ImmutableSet; |
28 | 30 | import com.google.common.collect.Maps;
|
29 | 31 | import com.google.common.collect.Sets;
|
30 | 32 | import net.sf.oval.constraint.Min;
|
31 | 33 | import net.sf.oval.constraint.NotNull;
|
| 34 | +import org.joda.time.Period; |
32 | 35 |
|
33 | 36 | import java.util.Collections;
|
34 | 37 | import java.util.Map;
|
|
40 | 43 | import java.util.concurrent.atomic.AtomicLong;
|
41 | 44 | import java.util.concurrent.atomic.AtomicReference;
|
42 | 45 | import java.util.concurrent.atomic.LongAccumulator;
|
| 46 | +import javax.annotation.Nullable; |
43 | 47 |
|
44 | 48 | /**
|
45 | 49 | * Aggregates and periodically logs metrics about the aggregated data being
|
@@ -83,8 +87,8 @@ public void recordAggregateData(final PeriodicData periodicData) {
|
83 | 87 | .append(periodicData.getDimensions().getHost()).append(".")
|
84 | 88 | .append(periodicData.getDimensions().getService()).append(".")
|
85 | 89 | .append(metricName).append(".")
|
86 |
| - .append(datum.getStatistic()).append(".") |
87 |
| - .append(periodicData.getPeriod()) |
| 90 | + .append(datum.getStatistic().getName()).append(".") |
| 91 | + .append(getPeriodAsString(periodicData.getPeriod())) |
88 | 92 | .toString();
|
89 | 93 |
|
90 | 94 | final String serviceMetric = new StringBuilder()
|
@@ -165,6 +169,17 @@ private Set<String> createConcurrentSet(final Set<String> existingSet) {
|
165 | 169 | return Collections.newSetFromMap(new ConcurrentHashMap<>(initialCapacity));
|
166 | 170 | }
|
167 | 171 |
|
| 172 | + private static String getPeriodAsString(final Period period) { |
| 173 | + // TODO(ville): This is the only use of period serialization in MAD (weird, eh?) |
| 174 | + // However, we should consider generalizing and moving this to commons. |
| 175 | + |
| 176 | + final @Nullable String periodAsString = CACHED_PERIOD_STRINGS.get(period); |
| 177 | + if (periodAsString == null) { |
| 178 | + return period.toString(); |
| 179 | + } |
| 180 | + return periodAsString; |
| 181 | + } |
| 182 | + |
168 | 183 | // NOTE: Package private for testing
|
169 | 184 | /* package private */ PeriodicStatisticsSink(final Builder builder, final ScheduledExecutorService executor) {
|
170 | 185 | super(builder);
|
@@ -212,6 +227,27 @@ private PeriodicStatisticsSink(final Builder builder) {
|
212 | 227 |
|
213 | 228 | private static final Logger LOGGER = LoggerFactory.getLogger(PeriodicStatisticsSink.class);
|
214 | 229 | private static final int EXECUTOR_TIMEOUT_IN_SECONDS = 30;
|
| 230 | + private static final ImmutableMap<Period, String> CACHED_PERIOD_STRINGS; |
| 231 | + |
| 232 | + static { |
| 233 | + final ImmutableSet<Period> periods = ImmutableSet.<Period>builder() |
| 234 | + .add(Period.seconds(1)) |
| 235 | + .add(Period.minutes(1)) |
| 236 | + .add(Period.minutes(2)) |
| 237 | + .add(Period.minutes(5)) |
| 238 | + .add(Period.minutes(10)) |
| 239 | + .add(Period.minutes(15)) |
| 240 | + .add(Period.hours(1)) |
| 241 | + .add(Period.days(1)) |
| 242 | + .add(Period.months(1)) |
| 243 | + .add(Period.years(1)) |
| 244 | + .build(); |
| 245 | + final ImmutableMap.Builder<Period, String> builder = ImmutableMap.builder(); |
| 246 | + for (final Period period : periods) { |
| 247 | + builder.put(period, period.toString()); |
| 248 | + } |
| 249 | + CACHED_PERIOD_STRINGS = builder.build(); |
| 250 | + } |
215 | 251 |
|
216 | 252 | private final class MetricsLogger implements Runnable {
|
217 | 253 |
|
|
0 commit comments