@@ -18,6 +18,10 @@ import io.opentelemetry.android.session.SessionConfig
1818import io.opentelemetry.api.common.Attributes
1919import io.opentelemetry.api.logs.Logger
2020import 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
2125import io.opentelemetry.api.metrics.Meter
2226import io.opentelemetry.api.trace.Span
2327import 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