package com.signalfx.metrics.connection; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.tuple.Pair; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.signalfx.metrics.SignalFxMetricsException; import com.signalfx.metrics.protobuf.SignalFxProtocolBuffers; import com.signalfx.metrics.protobuf.SignalFxProtocolBuffers.Dimension; /** * Factory that just stores results to later be tested. * * @author jack */ public class StoredDataPointReceiver implements DataPointReceiver { public final List<SignalFxProtocolBuffers.DataPointOrBuilder> addDataPoints; private final Map<Pair<String, String>, List<SignalFxProtocolBuffers.Datum>> pointsFor; public final Map<String, SignalFxProtocolBuffers.MetricType> registeredMetrics; public boolean throwOnAdd = false; public StoredDataPointReceiver() { addDataPoints = Collections .synchronizedList(new ArrayList<SignalFxProtocolBuffers.DataPointOrBuilder>()); registeredMetrics = Collections.synchronizedMap(new HashMap<String, SignalFxProtocolBuffers.MetricType>()); pointsFor = Maps.newHashMap(); } @Override public void addDataPoints(String auth, List<SignalFxProtocolBuffers.DataPoint> dataPoints) throws SignalFxMetricsException { if (throwOnAdd) { throw new SignalFxMetricsException("Flag set to true"); } addDataPoints.addAll(dataPoints); for (SignalFxProtocolBuffers.DataPoint dp: dataPoints) { String source = dp.getSource(); if ("".equals(source)) { source = findSfSourceDim(dp.getDimensionsList()); } Pair<String, String> key = Pair.of(source, dp.getMetric()); if (pointsFor.containsKey(key)) { pointsFor.get(key).add(dp.getValue()); } else { pointsFor.put(key, Lists.newArrayList(dp.getValue())); } } } private String findSfSourceDim(List<Dimension> dimensionsList) { for (Dimension dim: dimensionsList) { if ("sf_source".equals(dim.getKey())) { return dim.getValue(); } } return ""; } @Override public void backfillDataPoints(String auth, String source, String metric, List<SignalFxProtocolBuffers.Datum> datumPoints) throws SignalFxMetricsException {} @Override public Map<String, Boolean> registerMetrics(String auth, Map<String, SignalFxProtocolBuffers.MetricType> metricTypes) throws SignalFxMetricsException { registeredMetrics.putAll(metricTypes); Map<String, Boolean> ret = new HashMap<String, Boolean>(); for (Map.Entry<String, SignalFxProtocolBuffers.MetricType> i: metricTypes.entrySet()) { ret.put(i.getKey(), true); } return ret; } public List<SignalFxProtocolBuffers.Datum> valuesFor(String source, String metric) { Pair<String, String> key = Pair.of(source, metric); List<SignalFxProtocolBuffers.Datum> ret = pointsFor.get(key); if (ret == null) { return Collections.emptyList(); } else { return Collections.unmodifiableList(ret); } } public SignalFxProtocolBuffers.Datum lastValueFor(String source, String metric) { List<SignalFxProtocolBuffers.Datum> vals = valuesFor(source, metric); if (vals.isEmpty()) { throw new RuntimeException("No value for source/metric"); } else { return vals.get(vals.size() - 1); } } public boolean clearValues(String source, String metric) { Pair<String, String> key = Pair.of(source, metric); return pointsFor.remove(key) != null; } }