Java源码示例:io.opencensus.stats.Measure
示例1
/**
* Returns the value of a metric, or {@code null} if not found.
*/
@Nullable
public Double getMetric(Measure measure) {
for (Map.Entry<Measure, Number> m : metrics.entrySet()) {
if (m.getKey().equals(measure)) {
Number value = m.getValue();
if (value instanceof Double) {
return (Double) value;
} else if (value instanceof Long) {
return (double) (Long) value;
}
throw new AssertionError("Unexpected measure value type: " + value.getClass().getName());
}
}
return null;
}
示例2
@javax.annotation.Nullable
static MetricDescriptor viewToMetricDescriptor(View view) {
if (view.getWindow() instanceof View.AggregationWindow.Interval) {
// Only creates Metric for cumulative stats.
return null;
}
List<LabelKey> labelKeys = new ArrayList<LabelKey>();
for (TagKey tagKey : view.getColumns()) {
// TODO: add description
labelKeys.add(LabelKey.create(tagKey.getName(), ""));
}
Measure measure = view.getMeasure();
Aggregation aggregation = view.getAggregation();
return MetricDescriptor.create(
view.getName().asString(),
view.getDescription(),
getUnit(measure, aggregation),
getType(measure, aggregation),
labelKeys);
}
示例3
@VisibleForTesting
static Type getType(Measure measure, Aggregation aggregation) {
return aggregation.match(
Functions.returnConstant(
measure.match(
TYPE_CUMULATIVE_DOUBLE_FUNCTION, // Sum Double
TYPE_CUMULATIVE_INT64_FUNCTION, // Sum Int64
TYPE_UNRECOGNIZED_FUNCTION)),
TYPE_CUMULATIVE_INT64_FUNCTION, // Count
TYPE_CUMULATIVE_DISTRIBUTION_FUNCTION, // Distribution
Functions.returnConstant(
measure.match(
TYPE_GAUGE_DOUBLE_FUNCTION, // LastValue Double
TYPE_GAUGE_INT64_FUNCTION, // LastValue Long
TYPE_UNRECOGNIZED_FUNCTION)),
AGGREGATION_TYPE_DEFAULT_FUNCTION);
}
示例4
/** Enable stats collection for the given {@link View}. */
synchronized void registerView(View view, Clock clock) {
exportedViews = null;
View existing = registeredViews.get(view.getName());
if (existing != null) {
if (existing.equals(view)) {
// Ignore views that are already registered.
return;
} else {
throw new IllegalArgumentException(
"A different view with the same name is already registered: " + existing);
}
}
Measure measure = view.getMeasure();
Measure registeredMeasure = registeredMeasures.get(measure.getName());
if (registeredMeasure != null && !registeredMeasure.equals(measure)) {
throw new IllegalArgumentException(
"A different measure with the same name is already registered: " + registeredMeasure);
}
registeredViews.put(view.getName(), view);
if (registeredMeasure == null) {
registeredMeasures.put(measure.getName(), measure);
}
Timestamp now = clock.now();
mutableMap.put(view.getMeasure().getName(), MutableViewData.create(view, now));
}
示例5
synchronized void record(TagContext tags, MeasureMapInternal stats, Timestamp timestamp) {
Iterator<Measurement> iterator = stats.iterator();
Map<String, AttachmentValue> attachments = stats.getAttachments();
while (iterator.hasNext()) {
Measurement measurement = iterator.next();
Measure measure = measurement.getMeasure();
if (!measure.equals(registeredMeasures.get(measure.getName()))) {
// unregistered measures will be ignored.
continue;
}
Collection<MutableViewData> viewDataCollection = mutableMap.get(measure.getName());
for (MutableViewData viewData : viewDataCollection) {
viewData.record(
tags, RecordUtils.getDoubleValueFromMeasurement(measurement), timestamp, attachments);
}
}
}
示例6
private void testRecordCumulative(Measure measure, Aggregation aggregation, double... values) {
View view = createCumulativeView(VIEW_NAME, measure, aggregation, Arrays.asList(KEY));
clock.setTime(Timestamp.create(1, 2));
viewManager.registerView(view);
TagContext tags = tagger.emptyBuilder().put(KEY, VALUE).build();
for (double val : values) {
putToMeasureMap(statsRecorder.newMeasureMap(), measure, val).record(tags);
}
clock.setTime(Timestamp.create(3, 4));
ViewData viewData = viewManager.getView(VIEW_NAME);
assertThat(viewData.getView()).isEqualTo(view);
assertThat(viewData.getWindowData())
.isEqualTo(CumulativeData.create(Timestamp.create(1, 2), Timestamp.create(3, 4)));
StatsTestUtil.assertAggregationMapEquals(
viewData.getAggregationMap(),
ImmutableMap.of(
Arrays.asList(VALUE),
StatsTestUtil.createAggregationData(aggregation, measure, values)),
EPSILON);
}
示例7
/**
* Returns the value of a metric, or {@code null} if not found.
*/
@Nullable
public Double getMetric(Measure measure) {
for (Map.Entry<Measure, Number> m : metrics.entrySet()) {
if (m.getKey().equals(measure)) {
Number value = m.getValue();
if (value instanceof Double) {
return (Double) value;
} else if (value instanceof Long) {
return (double) (Long) value;
}
throw new AssertionError("Unexpected measure value type: " + value.getClass().getName());
}
}
return null;
}
示例8
/**
* Returns the value of a metric converted to long, or throw if not found.
*/
public long getMetricAsLongOrFail(Measure measure) {
Double doubleValue = getMetric(measure);
checkNotNull(doubleValue, "Measure not found: %s", measure.getName());
long longValue = (long) (Math.abs(doubleValue) + 0.0001);
if (doubleValue < 0) {
longValue = -longValue;
}
return longValue;
}
示例9
private void setupView(Measure measure, TagKey... keys) {
// Register the view. It is imperative that this step exists,
// otherwise recorded metrics will be dropped and never exported.
View view = View.create(
View.Name.create(NAME_BASE + measure.getName()),
measure.getDescription(),
measure,
Aggregation.Count.create(),
ImmutableList.copyOf(keys));
viewManager.registerView(view);
}
示例10
@SuppressWarnings("try")
public static void recordStat(Measure.MeasureLong ml, Long n) {
TagContext tctx = tagger.emptyBuilder().build();
try (Scope ss = tagger.withTagContext(tctx)) {
statsRecorder.newMeasureMap().put(ml, n).record();
}
}
示例11
@SuppressWarnings("try")
public static void recordTaggedStat(TagKey key, String value, Measure.MeasureLong ml, Long n) {
TagContext tctx = tagger.emptyBuilder().putLocal(key, TagValue.create(value)).build();
try (Scope ss = tagger.withTagContext(tctx)) {
statsRecorder.newMeasureMap().put(ml, n).record();
}
}
示例12
@SuppressWarnings("try")
public static void recordTaggedStat(
TagKey key, String value, Measure.MeasureDouble md, Double d) {
TagContext tctx = tagger.emptyBuilder().putLocal(key, TagValue.create(value)).build();
try (Scope ss = tagger.withTagContext(tctx)) {
statsRecorder.newMeasureMap().put(md, d).record();
}
}
示例13
@SuppressWarnings("try")
public static void recordTaggedStat(
TagKey[] keys, String[] values, Measure.MeasureDouble md, Double d) {
TagContextBuilder builder = tagger.emptyBuilder();
for (int i = 0; i < keys.length; i++) {
builder.putLocal(keys[i], TagValue.create(values[i]));
}
TagContext tctx = builder.build();
try (Scope ss = tagger.withTagContext(tctx)) {
statsRecorder.newMeasureMap().put(md, d).record();
}
}
示例14
@SuppressWarnings("try")
public static void recordTaggedStat(
TagKey[] keys, String[] values, Measure.MeasureLong md, Long n) {
TagContextBuilder builder = tagger.emptyBuilder();
for (int i = 0; i < keys.length; i++) {
builder.putLocal(keys[i], TagValue.create(values[i]));
}
TagContext tctx = builder.build();
try (Scope ss = tagger.withTagContext(tctx)) {
statsRecorder.newMeasureMap().put(md, n).record();
}
}
示例15
private static View[] createViews(
int size, Measure[] measures, Aggregation aggregation, TagKey... keys) {
View[] views = new View[size];
for (int i = 0; i < size; i++) {
views[i] = createView(measures[i].getName(), measures[i], aggregation, keys);
}
return views;
}
示例16
private static Measure.MeasureDouble[] createMeasureDoubles(int size, String name) {
Measure.MeasureDouble[] measures = new Measure.MeasureDouble[size];
for (int i = 0; i < size; i++) {
measures[i] = Measure.MeasureDouble.create(name + "_MD" + i, "", "ns");
}
return measures;
}
示例17
private static Measure.MeasureLong[] createMeasureLongs(int size, String name) {
Measure.MeasureLong[] measures = new Measure.MeasureLong[size];
for (int i = 0; i < size; i++) {
measures[i] = Measure.MeasureLong.create(name + "_ML" + i, "", "ns");
}
return measures;
}
示例18
private static MeasureMap record(Data data, Measure.MeasureLong measure, int value) {
MeasureMap map = data.recorder.newMeasureMap();
map.put(measure, value);
for (TagContext tags : data.contexts) {
map.record(tags);
}
return map;
}
示例19
private static MeasureMap record(Data data, Measure.MeasureDouble measure, double value) {
MeasureMap map = data.recorder.newMeasureMap();
map.put(measure, value);
for (TagContext tags : data.contexts) {
map.record(tags);
}
return map;
}
示例20
static <T> Map<T, AggregationData> createAggregationMap(
Map<T, MutableAggregation> tagValueAggregationMap, Measure measure) {
Map<T, AggregationData> map = Maps.newHashMap();
for (Entry<T, MutableAggregation> entry : tagValueAggregationMap.entrySet()) {
map.put(entry.getKey(), entry.getValue().toAggregationData());
}
return map;
}
示例21
IntervalBucket(Timestamp start, Duration duration, Aggregation aggregation, Measure measure) {
this.start = checkNotNull(start, "Start");
this.duration = checkNotNull(duration, "Duration");
checkArgument(duration.compareTo(ZERO) > 0, "Duration must be positive");
this.aggregation = checkNotNull(aggregation, "Aggregation");
this.measure = checkNotNull(measure, "measure");
}
示例22
private Map<List</*@Nullable*/ TagValue>, AggregationData> combineBucketsAndGetAggregationMap(
Timestamp now) {
// Need to maintain the order of inserted MutableAggregations (inserted based on time order).
Multimap<List</*@Nullable*/ TagValue>, MutableAggregation> multimap =
LinkedHashMultimap.create();
ArrayDeque<IntervalBucket> shallowCopy = new ArrayDeque<IntervalBucket>(buckets);
Aggregation aggregation = super.view.getAggregation();
Measure measure = super.view.getMeasure();
putBucketsIntoMultiMap(shallowCopy, multimap, aggregation, measure, now);
Map<List</*@Nullable*/ TagValue>, MutableAggregation> singleMap =
aggregateOnEachTagValueList(multimap, aggregation, measure);
return createAggregationMap(singleMap, super.getView().getMeasure());
}
示例23
private static void putBucketsIntoMultiMap(
ArrayDeque<IntervalBucket> buckets,
Multimap<List</*@Nullable*/ TagValue>, MutableAggregation> multimap,
Aggregation aggregation,
Measure measure,
Timestamp now) {
// Put fractional stats of the head (oldest) bucket.
IntervalBucket head = CheckerFrameworkUtils.castNonNull(buckets.peekFirst());
IntervalBucket tail = CheckerFrameworkUtils.castNonNull(buckets.peekLast());
double fractionTail = tail.getFraction(now);
// TODO(songya): decide what to do when time goes backwards
checkArgument(
0.0 <= fractionTail && fractionTail <= 1.0,
"Fraction " + fractionTail + " should be within [0.0, 1.0].");
double fractionHead = 1.0 - fractionTail;
putFractionalMutableAggregationsToMultiMap(
head.getTagValueAggregationMap(), multimap, aggregation, measure, fractionHead);
// Put whole data of other buckets.
boolean shouldSkipFirst = true;
for (IntervalBucket bucket : buckets) {
if (shouldSkipFirst) {
shouldSkipFirst = false;
continue; // skip the first bucket
}
for (Entry<List</*@Nullable*/ TagValue>, MutableAggregation> entry :
bucket.getTagValueAggregationMap().entrySet()) {
multimap.put(entry.getKey(), entry.getValue());
}
}
}
示例24
private static <T> void putFractionalMutableAggregationsToMultiMap(
Map<T, MutableAggregation> mutableAggrMap,
Multimap<T, MutableAggregation> multimap,
Aggregation aggregation,
Measure measure,
double fraction) {
for (Entry<T, MutableAggregation> entry : mutableAggrMap.entrySet()) {
// Initially empty MutableAggregations.
MutableAggregation fractionalMutableAgg = createMutableAggregation(aggregation, measure);
fractionalMutableAgg.combine(entry.getValue(), fraction);
multimap.put(entry.getKey(), fractionalMutableAgg);
}
}
示例25
private static <T> Map<T, MutableAggregation> aggregateOnEachTagValueList(
Multimap<T, MutableAggregation> multimap, Aggregation aggregation, Measure measure) {
Map<T, MutableAggregation> map = Maps.newHashMap();
for (T tagValues : multimap.keySet()) {
// Initially empty MutableAggregations.
MutableAggregation combinedAggregation = createMutableAggregation(aggregation, measure);
for (MutableAggregation mutableAggregation : multimap.get(tagValues)) {
combinedAggregation.combine(mutableAggregation, 1.0);
}
map.put(tagValues, combinedAggregation);
}
return map;
}
示例26
/**
* Creates an {@link AggregationData} by adding the given sequence of values, based on the
* definition of the given {@link Aggregation}.
*
* @param aggregation the {@code Aggregation} to apply the values to.
* @param values the values to add to the {@code MutableAggregation}s.
* @return an {@code AggregationData}.
*/
static AggregationData createAggregationData(
Aggregation aggregation, Measure measure, double... values) {
MutableAggregation mutableAggregation =
RecordUtils.createMutableAggregation(aggregation, measure);
for (double value : values) {
mutableAggregation.add(value, Collections.<String, AttachmentValue>emptyMap(), EMPTY);
}
return mutableAggregation.toAggregationData();
}
示例27
private void testRecord_MeasureNotMatch(Measure measure1, Measure measure2, double value) {
viewManager.registerView(createCumulativeView(VIEW_NAME, measure1, MEAN, Arrays.asList(KEY)));
TagContext tags = tagger.emptyBuilder().put(KEY, VALUE).build();
putToMeasureMap(statsRecorder.newMeasureMap(), measure2, value).record(tags);
ViewData view = viewManager.getView(VIEW_NAME);
assertThat(view.getAggregationMap()).isEmpty();
}
示例28
private void testMultipleViews_DifferentMeasures(
Measure measure1, Measure measure2, double value1, double value2) {
final View view1 = createCumulativeView(VIEW_NAME, measure1, DISTRIBUTION, Arrays.asList(KEY));
final View view2 =
createCumulativeView(VIEW_NAME_2, measure2, DISTRIBUTION, Arrays.asList(KEY));
clock.setTime(Timestamp.create(1, 0));
viewManager.registerView(view1);
clock.setTime(Timestamp.create(2, 0));
viewManager.registerView(view2);
TagContext tags = tagger.emptyBuilder().put(KEY, VALUE).build();
MeasureMap measureMap = statsRecorder.newMeasureMap();
putToMeasureMap(measureMap, measure1, value1);
putToMeasureMap(measureMap, measure2, value2);
measureMap.record(tags);
clock.setTime(Timestamp.create(3, 0));
ViewData viewData1 = viewManager.getView(VIEW_NAME);
clock.setTime(Timestamp.create(4, 0));
ViewData viewData2 = viewManager.getView(VIEW_NAME_2);
assertThat(viewData1.getWindowData())
.isEqualTo(CumulativeData.create(Timestamp.create(1, 0), Timestamp.create(3, 0)));
StatsTestUtil.assertAggregationMapEquals(
viewData1.getAggregationMap(),
ImmutableMap.of(
Arrays.asList(VALUE),
StatsTestUtil.createAggregationData(DISTRIBUTION, measure1, value1)),
EPSILON);
assertThat(viewData2.getWindowData())
.isEqualTo(CumulativeData.create(Timestamp.create(2, 0), Timestamp.create(4, 0)));
StatsTestUtil.assertAggregationMapEquals(
viewData2.getAggregationMap(),
ImmutableMap.of(
Arrays.asList(VALUE),
StatsTestUtil.createAggregationData(DISTRIBUTION, measure2, value2)),
EPSILON);
}
示例29
private static MeasureMap putToMeasureMap(MeasureMap measureMap, Measure measure, double value) {
if (measure instanceof MeasureDouble) {
return measureMap.put((MeasureDouble) measure, value);
} else if (measure instanceof MeasureLong) {
return measureMap.put((MeasureLong) measure, Math.round(value));
} else {
// Future measures.
throw new AssertionError();
}
}
示例30
private static void groupViewsByDirectoriesAndGetMeasures(
Set<View> views, TreeNode root, Map<String, Measure> measures, Set<View> cachedViews) {
for (View view : views) {
if (cachedViews.contains(view)) {
continue;
}
cachedViews.add(view);
List<String> dirs = PATH_SPLITTER.splitToList(view.getName().asString());
TreeNode node = root;
for (int i = 0; i < dirs.size(); i++) {
if (node == null) {
break; // Should never happen. Work around the nullness checker.
}
String dir = dirs.get(i);
if ("".equals(dir) && i == 0) {
continue; // In case view name starts with a '/'.
}
node.views++;
if (i != dirs.size() - 1) { // Non-leaf node (directory node)
node.children.putIfAbsent(dir, new TreeNode());
node = node.children.get(dir);
} else { // Leaf node (view node)
node.children.putIfAbsent(dir, new TreeNode(view.getName()));
}
}
Measure measure = view.getMeasure();
measures.putIfAbsent(measure.getName(), measure);
}
}