Skip to content

Commit

Permalink
RuntimeMetrics - move creation logic out of constructor (#8653)
Browse files Browse the repository at this point in the history
  • Loading branch information
breedx-splk committed Jun 6, 2023
1 parent c8bcdee commit a0cfb06
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,15 @@

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.runtimemetrics.java17.internal.RecordedEventHandler;
import io.opentelemetry.instrumentation.runtimemetrics.java8.BufferPools;
import io.opentelemetry.instrumentation.runtimemetrics.java8.Classes;
import io.opentelemetry.instrumentation.runtimemetrics.java8.Cpu;
import io.opentelemetry.instrumentation.runtimemetrics.java8.GarbageCollector;
import io.opentelemetry.instrumentation.runtimemetrics.java8.MemoryPools;
import io.opentelemetry.instrumentation.runtimemetrics.java8.Threads;
import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.JmxRuntimeMetricsUtil;
import java.io.Closeable;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import jdk.jfr.EventSettings;
import jdk.jfr.consumer.RecordingStream;

Expand All @@ -32,33 +26,17 @@ public final class RuntimeMetrics implements Closeable {

private final AtomicBoolean isClosed = new AtomicBoolean();
private final OpenTelemetry openTelemetry;
private final List<AutoCloseable> observables = new ArrayList<>();
private final JfrRuntimeMetrics jfrRuntimeMetrics;
private final List<AutoCloseable> observables;

@Nullable private final JfrRuntimeMetrics jfrRuntimeMetrics;

@SuppressWarnings("CatchingUnchecked")
RuntimeMetrics(
OpenTelemetry openTelemetry,
Predicate<JfrFeature> featurePredicate,
boolean disableJmx,
boolean disableJfr) {
List<AutoCloseable> observables,
@Nullable JfrRuntimeMetrics jfrRuntimeMetrics) {
this.openTelemetry = openTelemetry;
try {
jfrRuntimeMetrics =
disableJfr ? null : JfrRuntimeMetrics.build(openTelemetry, featurePredicate);

// Set up metrics gathered by JMX
if (!disableJmx) {
observables.addAll(BufferPools.registerObservers(openTelemetry));
observables.addAll(Classes.registerObservers(openTelemetry));
observables.addAll(Cpu.registerObservers(openTelemetry));
observables.addAll(MemoryPools.registerObservers(openTelemetry));
observables.addAll(Threads.registerObservers(openTelemetry));
observables.addAll(GarbageCollector.registerObservers(openTelemetry));
}
} catch (Exception e) {
close();
throw new IllegalStateException("Error starting RuntimeMetrics", e);
}
this.observables = List.copyOf(observables);
this.jfrRuntimeMetrics = jfrRuntimeMetrics;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,18 @@

import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.runtimemetrics.java8.BufferPools;
import io.opentelemetry.instrumentation.runtimemetrics.java8.Classes;
import io.opentelemetry.instrumentation.runtimemetrics.java8.Cpu;
import io.opentelemetry.instrumentation.runtimemetrics.java8.GarbageCollector;
import io.opentelemetry.instrumentation.runtimemetrics.java8.MemoryPools;
import io.opentelemetry.instrumentation.runtimemetrics.java8.Threads;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumMap;
import java.util.function.Predicate;
import java.util.List;
import javax.annotation.Nullable;

/** Builder for {@link RuntimeMetrics}. */
public final class RuntimeMetricsBuilder {
Expand Down Expand Up @@ -73,8 +82,36 @@ public RuntimeMetricsBuilder disableAllJmx() {

/** Build and start an {@link RuntimeMetrics} with the config from this builder. */
public RuntimeMetrics build() {
Predicate<JfrFeature> featurePredicate = jfrFeature -> enabledFeatureMap.get(jfrFeature);
boolean disableJfr = !enabledFeatureMap.keySet().stream().anyMatch(featurePredicate);
return new RuntimeMetrics(openTelemetry, featurePredicate, disableJmx, disableJfr);
List<AutoCloseable> observables = buildObservables();
RuntimeMetrics.JfrRuntimeMetrics jfrRuntimeMetrics = buildJfrMetrics();
return new RuntimeMetrics(openTelemetry, observables, jfrRuntimeMetrics);
}

@SuppressWarnings("CatchingUnchecked")
private List<AutoCloseable> buildObservables() {
if (disableJmx) {
return Collections.emptyList();
}
try {
// Set up metrics gathered by JMX
List<AutoCloseable> observables = new ArrayList<>();
observables.addAll(BufferPools.registerObservers(openTelemetry));
observables.addAll(Classes.registerObservers(openTelemetry));
observables.addAll(Cpu.registerObservers(openTelemetry));
observables.addAll(MemoryPools.registerObservers(openTelemetry));
observables.addAll(Threads.registerObservers(openTelemetry));
observables.addAll(GarbageCollector.registerObservers(openTelemetry));
return observables;
} catch (Exception e) {
throw new IllegalStateException("Error building RuntimeMetrics", e);
}
}

@Nullable
private RuntimeMetrics.JfrRuntimeMetrics buildJfrMetrics() {
if (enabledFeatureMap.values().stream().noneMatch(isEnabled -> isEnabled)) {
return null;
}
return RuntimeMetrics.JfrRuntimeMetrics.build(openTelemetry, enabledFeatureMap::get);
}
}

0 comments on commit a0cfb06

Please sign in to comment.