Skip to content

Commit da77794

Browse files
authored
Merge pull request #14 from ArpNetworking/accept_dimensions
pass through dimensions
2 parents 4460334 + e40b768 commit da77794

File tree

1 file changed

+66
-11
lines changed

1 file changed

+66
-11
lines changed

src/main/java/com/arpnetworking/clusteraggregator/client/AggClientConnection.java

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import com.arpnetworking.tsdcore.model.FQDSN;
3333
import com.arpnetworking.tsdcore.model.PeriodicData;
3434
import com.arpnetworking.tsdcore.statistics.Statistic;
35-
import com.arpnetworking.tsdcore.statistics.StatisticFactory;
3635
import com.google.common.base.Optional;
3736
import com.google.common.collect.ImmutableList;
3837
import com.google.common.collect.ImmutableMap;
@@ -42,6 +41,7 @@
4241
import java.net.InetAddress;
4342
import java.net.InetSocketAddress;
4443
import java.net.UnknownHostException;
44+
import java.time.Duration;
4545
import java.util.Collections;
4646
import java.util.Map;
4747
import java.util.regex.Pattern;
@@ -161,8 +161,10 @@ private void processMessages() {
161161
.log();
162162
getContext().parent().tell(setRecord, getSelf());
163163
if (setRecord.getStatisticsCount() > 0) {
164-
final PeriodicData periodicData = buildPeriodicData(setRecord);
165-
getContext().parent().tell(periodicData, self());
164+
final Optional<PeriodicData> periodicData = buildPeriodicData(setRecord);
165+
if (periodicData.isPresent()) {
166+
getContext().parent().tell(periodicData.get(), self());
167+
}
166168
}
167169
} else if (gm instanceof Messages.HeartbeatRecord) {
168170
LOGGER.debug()
@@ -182,7 +184,7 @@ private void processMessages() {
182184
if (!messageOptional.isPresent() && current.length() > 4) {
183185
LOGGER.debug()
184186
.setMessage("buffer did not deserialize completely")
185-
.addData("remainingBytes", (Integer) current.length())
187+
.addData("remainingBytes", current.length())
186188
.addContext("actor", self())
187189
.log();
188190
}
@@ -191,9 +193,57 @@ private void processMessages() {
191193
_buffer = current;
192194
}
193195

194-
private PeriodicData buildPeriodicData(final Messages.StatisticSetRecord setRecord) {
196+
private Optional<PeriodicData> buildPeriodicData(final Messages.StatisticSetRecord setRecord) {
195197
final CombinedMetricData combinedMetricData = CombinedMetricData.Builder.fromStatisticSetRecord(setRecord).build();
196198
final ImmutableList.Builder<AggregatedData> builder = ImmutableList.builder();
199+
final ImmutableMap.Builder<String, String> dimensionBuilder = ImmutableMap.builder();
200+
201+
Optional<String> host = Optional.absent();
202+
Optional<String> service = Optional.absent();
203+
Optional<String> cluster = Optional.absent();
204+
for (final Messages.DimensionEntry dimensionEntry : setRecord.getDimensionsList()) {
205+
if (HOST_KEY.equals(dimensionEntry.getKey())) {
206+
host = Optional.fromNullable(dimensionEntry.getValue());
207+
} else if (SERVICE_KEY.equals(dimensionEntry.getKey())) {
208+
service = Optional.fromNullable(dimensionEntry.getValue());
209+
} else if (CLUSTER_KEY.equals(dimensionEntry.getKey())) {
210+
cluster = Optional.fromNullable(dimensionEntry.getValue());
211+
} else {
212+
dimensionBuilder.put(dimensionEntry.getKey(), dimensionEntry.getValue());
213+
}
214+
}
215+
216+
if (!service.isPresent()) {
217+
service = Optional.fromNullable(setRecord.getService());
218+
}
219+
220+
if (!cluster.isPresent()) {
221+
cluster = Optional.fromNullable(setRecord.getCluster());
222+
if (!cluster.isPresent()) {
223+
cluster = _clusterName;
224+
}
225+
}
226+
227+
if (!host.isPresent()) {
228+
host = _hostName;
229+
}
230+
231+
dimensionBuilder.put(HOST_KEY, host.or(""));
232+
dimensionBuilder.put(SERVICE_KEY, service.or(""));
233+
dimensionBuilder.put(CLUSTER_KEY, cluster.or(""));
234+
235+
if (!(host.isPresent() && service.isPresent() && cluster.isPresent())) {
236+
INCOMPLETE_RECORD_LOGGER.warn()
237+
.setMessage("Cannot process StatisticSet record, missing required fields.")
238+
.addData("host", host)
239+
.addData("service", service)
240+
.addData("cluster", cluster)
241+
.log();
242+
return Optional.absent();
243+
}
244+
245+
final ImmutableMap<String, String> dimensions = dimensionBuilder.build();
246+
197247
for (final Map.Entry<Statistic, CombinedMetricData.StatisticValue> record
198248
: combinedMetricData.getCalculatedValues().entrySet()) {
199249
final AggregatedData aggregatedData = new AggregatedData.Builder()
@@ -203,7 +253,7 @@ private PeriodicData buildPeriodicData(final Messages.StatisticSetRecord setReco
203253
.setService(setRecord.getService())
204254
.setStatistic(record.getKey())
205255
.build())
206-
.setHost(_hostName.or(""))
256+
.setHost(host.get())
207257
.setIsSpecified(record.getValue().getUserSpecified())
208258
.setPeriod(combinedMetricData.getPeriod())
209259
.setPopulationSize(1L)
@@ -214,24 +264,29 @@ private PeriodicData buildPeriodicData(final Messages.StatisticSetRecord setReco
214264
.build();
215265
builder.add(aggregatedData);
216266
}
217-
return new PeriodicData.Builder()
267+
return Optional.of(new PeriodicData.Builder()
218268
.setData(builder.build())
219269
.setConditions(ImmutableList.of())
220-
.setDimensions(ImmutableMap.of("host", _hostName.or("")))
270+
.setDimensions(dimensions)
221271
.setPeriod(combinedMetricData.getPeriod())
222272
.setStart(combinedMetricData.getPeriodStart())
223-
.build();
273+
.build());
224274
}
225275

226276
private Optional<String> _hostName = Optional.absent();
227277
private Optional<String> _clusterName = Optional.absent();
228278
private ByteString _buffer = ByteString.empty();
229279
private final ActorRef _connection;
230280
private final InetSocketAddress _remoteAddress;
231-
private final StatisticFactory _statisticFactory = new StatisticFactory();
232281
private static final Logger LOGGER = LoggerFactory.getLogger(AggClientConnection.class);
233-
282+
private static final Logger INCOMPLETE_RECORD_LOGGER = LoggerFactory.getRateLimitLogger(
283+
AggClientConnection.class,
284+
Duration.ofSeconds(30));
234285
private static final boolean IS_ENABLED;
286+
private static final String HOST_KEY = "host";
287+
private static final String SERVICE_KEY = "service";
288+
private static final String CLUSTER_KEY = "cluster";
289+
235290

236291
static {
237292
// Determine the local host name

0 commit comments

Comments
 (0)