kezhenxu94 commented on code in PR #12953:
URL: https://github.com/apache/skywalking/pull/12953#discussion_r1910371243
##########
oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusMetricsCollector.java:
##########
@@ -23,23 +23,91 @@
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicLong;
import org.apache.skywalking.oap.server.telemetry.api.MetricFamily;
import org.apache.skywalking.oap.server.telemetry.api.MetricsCollector;
public class PrometheusMetricsCollector implements MetricsCollector {
- @Override public Iterable<MetricFamily> collect() {
+ @Override
+ public Iterable<MetricFamily> collect() {
Enumeration<Collector.MetricFamilySamples> mfs =
CollectorRegistry.defaultRegistry.metricFamilySamples();
List<MetricFamily> result = new ArrayList<>();
while (mfs.hasMoreElements()) {
Collector.MetricFamilySamples metricFamilySamples =
mfs.nextElement();
List<MetricFamily.Sample> samples = new
ArrayList<>(metricFamilySamples.samples.size());
- MetricFamily m = new MetricFamily(metricFamilySamples.name,
MetricFamily.Type.valueOf(metricFamilySamples.type
- .name()), metricFamilySamples.help, samples);
+ MetricFamily m = new MetricFamily(
+ metricFamilySamples.name,
MetricFamily.Type.valueOf(metricFamilySamples.type
+
.name()), metricFamilySamples.help, samples
+ );
result.add(m);
for (Collector.MetricFamilySamples.Sample sample :
metricFamilySamples.samples) {
- samples.add(new MetricFamily.Sample(sample.name,
sample.labelNames, sample.labelValues, sample.value, sample.timestampMs));
+ samples.add(new MetricFamily.Sample(
+ sample.name, sample.labelNames, sample.labelValues,
sample.value,
+ sample.timestampMs
+ ));
}
}
return result;
}
+
+ @Override
+ public long heapMemoryUsage() {
+ final AtomicLong heapMemoryUsed = new AtomicLong();
+ this.find("jvm_memory_bytes_used")
+ .ifPresent(metricFamily -> {
+ metricFamily.samples.forEach(sample -> {
+ for (int i = 0; i < sample.labelNames.size(); i++) {
+ if (sample.labelNames.get(i).equals("area") &&
sample.labelValues.get(i)
+
.equals("heap")) {
+ heapMemoryUsed.addAndGet((long) sample.value);
+ }
+ }
+ });
+ });
+ return heapMemoryUsed.longValue();
+ }
+
+ @Override
+ public long heapMemoryMax() {
+ final AtomicLong heapMemoryMax = new AtomicLong();
+ this.find("jvm_memory_bytes_max")
+ .ifPresent(metricFamily -> {
+ metricFamily.samples.forEach(sample -> {
+ for (int i = 0; i < sample.labelNames.size(); i++) {
+ if (sample.labelNames.get(i).equals("area") &&
sample.labelValues.get(i)
+
.equals("heap")) {
+ heapMemoryMax.addAndGet((long) sample.value);
+ }
+ }
+ });
+ });
Review Comment:
And this looks poorly performant, it is complexity of `#metrics family *
#labels`, cases might be the metrics family or the labels are huge and this is
excuted every 10 seconds, which might be an issue itself. Do we have a more
performant way to find the metrics family or labels ?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]