in apm-agent-plugins/apm-micrometer-plugin/src/main/java/co/elastic/apm/agent/micrometer/MicrometerMeterRegistrySerializer.java [98:164]
boolean serializeMetricSet(List<Tag> tags, List<Meter> meters, long epochMicros, StringBuilder replaceBuilder, JsonWriter jw) {
boolean hasSamples = false;
boolean dedotMetricName = config.isDedotCustomMetrics();
jw.writeByte(JsonWriter.OBJECT_START);
{
DslJsonUtil.writeFieldName("metricset", jw);
jw.writeByte(JsonWriter.OBJECT_START);
{
DslJsonUtil.writeFieldName("timestamp", jw);
NumberConverter.serialize(epochMicros, jw);
jw.writeByte(JsonWriter.COMMA);
serializeTags(tags, replaceBuilder, jw);
DslJsonUtil.writeFieldName("samples", jw);
jw.writeByte(JsonWriter.OBJECT_START);
ClassLoader originalContextCL = PrivilegedActionUtils.getContextClassLoader(Thread.currentThread());
try {
for (int i = 0, size = meters.size(); i < size; i++) {
Meter meter = meters.get(i);
if (internallyDisabledMeters.contains(meter)) {
continue;
}
try {
// Setting the Meter CL as the context class loader during the Meter query operations
PrivilegedActionUtils.setContextClassLoader(Thread.currentThread(), PrivilegedActionUtils.getClassLoader(meter.getClass()));
if (meter instanceof Timer) {
Timer timer = (Timer) meter;
hasSamples = serializeTimer(jw, timer.takeSnapshot(), timer.getId(), timer.count(), timer.totalTime(TimeUnit.MICROSECONDS), hasSamples, replaceBuilder, dedotMetricName);
} else if (meter instanceof FunctionTimer) {
FunctionTimer timer = (FunctionTimer) meter;
hasSamples = serializeTimer(jw, null, timer.getId(), (long) timer.count(), timer.totalTime(TimeUnit.MICROSECONDS), hasSamples, replaceBuilder, dedotMetricName);
} else if (meter instanceof LongTaskTimer) {
LongTaskTimer timer = (LongTaskTimer) meter;
hasSamples = serializeTimer(jw, timer.takeSnapshot(), timer.getId(), timer.activeTasks(), timer.duration(TimeUnit.MICROSECONDS), hasSamples, replaceBuilder, dedotMetricName);
} else if (meter instanceof DistributionSummary) {
DistributionSummary summary = (DistributionSummary) meter;
hasSamples = serializeDistributionSummary(jw, summary.takeSnapshot(), summary.getId(), summary.count(), summary.totalAmount(), hasSamples, replaceBuilder, dedotMetricName);
} else if (meter instanceof Gauge) {
Gauge gauge = (Gauge) meter;
hasSamples = serializeValue(gauge.getId(), gauge.value(), hasSamples, jw, replaceBuilder, dedotMetricName);
} else if (meter instanceof Counter) {
Counter counter = (Counter) meter;
hasSamples = serializeValue(counter.getId(), counter.count(), hasSamples, jw, replaceBuilder, dedotMetricName);
} else if (meter instanceof FunctionCounter) {
FunctionCounter counter = (FunctionCounter) meter;
hasSamples = serializeValue(counter.getId(), counter.count(), hasSamples, jw, replaceBuilder, dedotMetricName);
}
} catch (Throwable throwable) {
String meterName = meter.getId().getName();
logger.warn("Failed to serialize Micrometer meter \"{}\" with tags {}. This meter will be " +
"excluded from serialization going forward.", meterName, tags);
logger.debug("Detailed info about failure to register Micrometer meter \"" + meterName +
"\": ", throwable);
internallyDisabledMeters.add(meter);
}
}
} finally {
PrivilegedActionUtils.setContextClassLoader(Thread.currentThread(), originalContextCL);
}
jw.writeByte(JsonWriter.OBJECT_END);
}
jw.writeByte(JsonWriter.OBJECT_END);
}
jw.writeByte(JsonWriter.OBJECT_END);
jw.writeByte(NEW_LINE);
return hasSamples;
}