Skip to content

Commit dcc82b4

Browse files
committed
feat: Cache OpenTelemetry metric instruments
This change introduces caching for OpenTelemetry metric instruments (Gauge, Counter, Histogram, UpDownCounter) within the `InstrumentationManager`. Previously, a new instrument was built for every metric recording call (`recordMetric`, `recordCount`, etc.), which is inefficient. Now, instruments are created once per metric name and reused for subsequent calls, improving performance.
1 parent 3548b42 commit dcc82b4

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

sdk/@launchdarkly/observability-android/lib/src/main/kotlin/com/launchdarkly/observability/client/InstrumentationManager.kt

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ import io.opentelemetry.android.session.SessionConfig
1818
import io.opentelemetry.api.common.Attributes
1919
import io.opentelemetry.api.logs.Logger
2020
import io.opentelemetry.api.logs.Severity
21+
import io.opentelemetry.api.metrics.DoubleGauge
22+
import io.opentelemetry.api.metrics.DoubleHistogram
23+
import io.opentelemetry.api.metrics.LongCounter
24+
import io.opentelemetry.api.metrics.LongUpDownCounter
2125
import io.opentelemetry.api.metrics.Meter
2226
import io.opentelemetry.api.trace.Span
2327
import io.opentelemetry.api.trace.Tracer
@@ -87,10 +91,13 @@ class InstrumentationManager(
8791
private var inMemoryLogExporter: InMemoryLogRecordExporter? = null
8892
private var inMemoryMetricExporter: InMemoryMetricExporter? = null
8993
private var telemetryInspector: TelemetryInspector? = null
90-
9194
private var spanProcessor: BatchSpanProcessor? = null
9295
private var logProcessor: BatchLogRecordProcessor? = null
9396
private var metricsReader: PeriodicMetricReader? = null
97+
private val gaugeCache = mutableMapOf<String, DoubleGauge>()
98+
private val counterCache = mutableMapOf<String, LongCounter>()
99+
private val histogramCache = mutableMapOf<String, DoubleHistogram>()
100+
private val upDownCounterCache = mutableMapOf<String, LongUpDownCounter>()
94101

95102
//TODO: Evaluate if this class should have a close/shutdown method to close this scope
96103
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
@@ -275,29 +282,39 @@ class InstrumentationManager(
275282
}
276283

277284
fun recordMetric(metric: Metric) {
278-
otelMeter.gaugeBuilder(metric.name).build()
279-
.set(metric.value, metric.attributes)
285+
val gauge = gaugeCache.getOrPut(metric.name) {
286+
otelMeter.gaugeBuilder(metric.name).build()
287+
}
288+
gauge.set(metric.value, metric.attributes)
280289
}
281290

282291
fun recordCount(metric: Metric) {
283292
// TODO: handle double casting to long better
284-
otelMeter.counterBuilder(metric.name).build()
285-
.add(metric.value.toLong(), metric.attributes)
293+
val counter = counterCache.getOrPut(metric.name) {
294+
otelMeter.counterBuilder(metric.name).build()
295+
}
296+
counter.add(metric.value.toLong(), metric.attributes)
286297
}
287298

288299
fun recordIncr(metric: Metric) {
289-
otelMeter.counterBuilder(metric.name).build()
290-
.add(1, metric.attributes)
300+
val counter = counterCache.getOrPut(metric.name) {
301+
otelMeter.counterBuilder(metric.name).build()
302+
}
303+
counter.add(1, metric.attributes)
291304
}
292305

293306
fun recordHistogram(metric: Metric) {
294-
otelMeter.histogramBuilder(metric.name).build()
295-
.record(metric.value, metric.attributes)
307+
val histogram = histogramCache.getOrPut(metric.name) {
308+
otelMeter.histogramBuilder(metric.name).build()
309+
}
310+
histogram.record(metric.value, metric.attributes)
296311
}
297312

298313
fun recordUpDownCounter(metric: Metric) {
299-
otelMeter.upDownCounterBuilder(metric.name).build()
300-
.add(metric.value.toLong(), metric.attributes)
314+
val upDownCounter = upDownCounterCache.getOrPut(metric.name) {
315+
otelMeter.upDownCounterBuilder(metric.name).build()
316+
}
317+
upDownCounter.add(metric.value.toLong(), metric.attributes)
301318
}
302319

303320
fun recordLog(message: String, severity: Severity, attributes: Attributes) {

0 commit comments

Comments
 (0)