private void mergeMeasurements(Map<Statistic, Double> samples, Meter meter) { meter.measure().forEach((measurement) -> samples.merge(measurement.getStatistic(), measurement.getValue(), mergeFunction(measurement.getStatistic()))); }
/** * Returns a newly-created immutable {@link Map} which contains all values of {@link Meter}s in the * specified {@link MeterRegistry}. The format of the key string is: * <ul> * <li>{@code <name>#<statistic>{tagName=tagValue,...}}</li> * <li>e.g. {@code "armeria.server.activeRequests#value{method=greet}"}</li> * <li>e.g. {@code "someSubsystem.someValue#sumOfSquares"} (no tags)</li> * </ul> * Note: It is not recommended to use this method for the purposes other than testing. */ public static Map<String, Double> measureAll(MeterRegistry registry) { requireNonNull(registry, "registry"); final ImmutableMap.Builder<String, Double> builder = ImmutableMap.builder(); registry.forEachMeter(meter -> Streams.stream(meter.measure()).forEach(measurement -> { final String fullName = measurementName(meter.getId(), measurement); final double value = measurement.getValue(); builder.put(fullName, value); })); return builder.build(); }
private static String measurementName(Meter.Id id, Measurement measurement) { final StringBuilder buf = new StringBuilder(); // Append name. buf.append(id.getName()); // Append statistic. buf.append('#'); buf.append(measurement.getStatistic().getTagValueRepresentation()); // Append tags if there are any. final Iterator<Tag> tagsIterator = id.getTags().iterator(); if (tagsIterator.hasNext()) { buf.append('{'); tagsIterator.forEachRemaining(tag -> buf.append(tag.getKey()).append('=') .append(tag.getValue()).append(',')); buf.setCharAt(buf.length() - 1, '}'); } return buf.toString(); }
@Override public Stream<Collector.MetricFamilySamples.Sample> collect() { return stream(measurements.spliterator(), false) .map(m -> new MetricFamilySamples.Sample(name, tagKeys, tagValues, m.getValue())); } }
m -> { for (Measurement measurement : m.measure()) { pollableMeters.remove(m.getId().withTag(measurement.getStatistic()));
Optional<String> writeMeter(Meter meter) { return Optional.of(writeDocument(meter, builder -> { for (Measurement measurement : meter.measure()) { builder.append(",\"").append(measurement.getStatistic().getTagValueRepresentation()).append("\":\"").append(measurement.getValue()).append("\""); } })); }
private void announceMeter(Meter meter) { for (Measurement measurement : meter.measure()) { announce(meter, measurement.getValue(), measurement.getStatistic().toString().toLowerCase()); } }
private Stream<TimeSeries> createMeter(Batch batch, Meter m) { return stream(m.measure().spliterator(), false) .map(ms -> batch.createTimeSeries(m, ms.getValue(), ms.getStatistic().getTagValueRepresentation())); }
private Stream<MetricDatum> metricData(Meter m) { return stream(m.measure().spliterator(), false) .map(ms -> metricDatum(m.getId().withTag(ms.getStatistic()), ms.getValue())) .filter(Objects::nonNull); }
private Stream<SignalFxProtocolBuffers.DataPoint.Builder> addMeter(Meter meter) { return stream(meter.measure().spliterator(), false).flatMap(measurement -> { String statSuffix = NamingConvention.camelCase.tagKey(measurement.getStatistic().toString()); switch (measurement.getStatistic()) { case TOTAL: case TOTAL_TIME: case COUNT: case DURATION: return Stream.of(addDatapoint(meter, COUNTER, statSuffix, measurement.getValue())); case MAX: case VALUE: case UNKNOWN: case ACTIVE_TASKS: return Stream.of(addDatapoint(meter, GAUGE, statSuffix, measurement.getValue())); } return Stream.empty(); }); }
/** Helper for converting Micrometer measurements to Spectator measurements. */ Iterable<Measurement> convert(Iterable<io.micrometer.core.instrument.Measurement> ms) { long now = Clock.SYSTEM.wallTime(); List<Measurement> measurements = new ArrayList<>(); for (io.micrometer.core.instrument.Measurement m : ms) { Id measurementId = id.withTag("statistic", m.getStatistic().getTagValueRepresentation()); measurements.add(new Measurement(measurementId, now, m.getValue())); } return measurements; } }
private Stream<String> writeMeter(Meter meter) { return Stream.of( event(meter.getId(), stream(meter.measure().spliterator(), false) .map(measure -> new Attribute(measure.getStatistic().getTagValueRepresentation(), measure.getValue())) .toArray(Attribute[]::new) ) ); }
private Stream<String> writeMeter(Meter m, Map<String, DatadogMetricMetadata> metadata) { long wallTime = clock.wallTime(); return stream(m.measure().spliterator(), false) .map(ms -> { Meter.Id id = m.getId().withTag(ms.getStatistic()); addToMetadataList(metadata, id, null, ms.getStatistic(), null); return writeMetric(id, null, wallTime, ms.getValue()); }); }
private Optional<String> writeMeter(Meter meter) { return Optional.of(StreamSupport.stream(meter.measure().spliterator(), false) .map(ms -> write(meter.getId().withTag(ms.getStatistic()), null, Fields.Value.tag(), decimal(ms.getValue()))) .collect(joining(","))); }
private Stream<String> writeMeter(Meter meter) { long wallTime = clock.wallTime(); Stream.Builder<String> metrics = Stream.builder(); stream(meter.measure().spliterator(), false) .forEach(measurement -> { Meter.Id id = meter.getId().withTag(measurement.getStatistic()); addMetric(metrics, id, null, wallTime, measurement.getValue()); }); return metrics.build(); }
@Override protected Meter newMeter(Meter.Id id, Meter.Type type, Iterable<Measurement> measurements) { measurements.forEach(ms -> { StatsdLineBuilder line = lineBuilder(id); Statistic stat = ms.getStatistic(); switch (stat) { case COUNT: case TOTAL: case TOTAL_TIME: pollableMeters.put(id.withTag(stat), () -> processor.onNext(line.count((long) ms.getValue(), stat))); break; case VALUE: case ACTIVE_TASKS: case DURATION: case UNKNOWN: pollableMeters.put(id.withTag(stat), () -> processor.onNext(line.gauge(ms.getValue(), stat))); break; } }); return new DefaultMeter(id, type, measurements); }
@Test @DisplayName("function timers respect the base unit of an underlying registry") void functionTimerUnits(MeterRegistry registry) { Object o = new Object(); registry.more().timer("function.timer", emptyList(), o, o2 -> 1, o2 -> 1, TimeUnit.MILLISECONDS); FunctionTimer ft = registry.get("function.timer").functionTimer(); clock(registry).add(step()); assertThat(ft.measure()) .anySatisfy(ms -> { TimeUnit baseUnit = TimeUnit.valueOf(requireNonNull(ft.getId().getBaseUnit()).toUpperCase()); assertThat(ms.getStatistic()).isEqualTo(Statistic.TOTAL_TIME); assertThat(TimeUtils.convert(ms.getValue(), baseUnit, TimeUnit.MILLISECONDS)).isEqualTo(1); }); }
private Stream<String> writeCustomMetric(Meter meter) { long wallTime = config().clock().wallTime(); List<Tag> tags = getConventionTags(meter.getId()); return StreamSupport.stream(meter.measure().spliterator(), false) .map(ms -> new KairosMetricBuilder() .field("name", ms.getStatistic().getTagValueRepresentation()) .datapoints(wallTime, ms.getValue()) .tags(tags) .build()); }
public static List<Datapoint> listDatapoints(String regName, Predicate<Meter> predicate) { List<Datapoint> result = new ArrayList<>(); MeterRegistry registry = BackendRegistries.getNow(regName); if (registry == null) { throw new NoRegistryException(regName); } registry.forEachMeter(m -> { if (predicate.test(m)) { String id = id(m); m.measure().forEach(measurement -> { result.add(new Datapoint(id + "$" + measurement.getStatistic().name(), measurement.getValue())); }); } }); return result; }
private Meter convert(io.micrometer.core.instrument.Meter meter) { Meter.Builder meterBuilder = Meter.newBuilder(); MeterId.Builder idBuilder = MeterId.newBuilder(); io.micrometer.core.instrument.Meter.Id id = meter.getId(); io.micrometer.core.instrument.Meter.Type type = id.getType(); for (Tag tag : id.getTags()) { idBuilder.addTag(MeterTag.newBuilder().setKey(tag.getKey()).setValue(tag.getValue())); } idBuilder.setName(id.getName()); idBuilder.setType(convert(type)); if (id.getDescription() != null) { idBuilder.setDescription(id.getDescription()); } if (id.getBaseUnit() != null) { idBuilder.setBaseUnit(id.getBaseUnit()); } meterBuilder.setId(idBuilder); for (Measurement measurement : meter.measure()) { meterBuilder.addMeasure( MeterMeasurement.newBuilder() .setValue(measurement.getValue()) .setStatistic(convert(measurement.getStatistic()))); } return meterBuilder.build(); }