Skip to content

Commit 10b3dc8

Browse files
committed
guard against empty
1 parent 1b8eaa0 commit 10b3dc8

File tree

2 files changed

+32
-26
lines changed

2 files changed

+32
-26
lines changed

reporters/kamon-opentelemetry/src/main/scala/kamon/otel/MetricsConverter.scala

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,21 @@ class WithResourceMetricsConverter(resource: Resource, kamonVersion: String, fro
6565
s.value.buckets.map(JLong valueOf _.frequency).asJava
6666
)
6767

68-
def toHistogramData(any: Seq[Snapshot[Distribution]]): HistogramData =
69-
ImmutableHistogramData.create(AggregationTemporality.CUMULATIVE, any.map(toHistogramDatum).asJava)
70-
71-
def convertHistogram(histogram: MetricSnapshot.Distributions): MetricData =
72-
ImmutableMetricData.createDoubleHistogram(
73-
resource,
74-
instrumentationScopeInfo(histogram),
75-
histogram.name,
76-
histogram.description,
77-
toString(histogram.settings.unit),
78-
toHistogramData(histogram.instruments))
68+
def toHistogramData(distributions: Seq[Snapshot[Distribution]]): Option[HistogramData] =
69+
distributions.filter(_.value.buckets.nonEmpty) match {
70+
case Nil => None
71+
case nonEmpty => Some(ImmutableHistogramData.create(AggregationTemporality.CUMULATIVE, nonEmpty.map(toHistogramDatum).asJava))
72+
}
73+
74+
def convertHistogram(histogram: MetricSnapshot.Distributions): Option[MetricData] =
75+
toHistogramData(histogram.instruments).map(d =>
76+
ImmutableMetricData.createDoubleHistogram(
77+
resource,
78+
instrumentationScopeInfo(histogram),
79+
histogram.name,
80+
histogram.description,
81+
toString(histogram.settings.unit),
82+
d))
7983

8084
def toCounterDatum(g: Snapshot[Long]): LongPointData =
8185
ImmutableLongPointData.create(fromNs, toNs, SpanConverter.toAttributes(g.tags), g.value)
@@ -100,9 +104,9 @@ class WithResourceMetricsConverter(resource: Resource, kamonVersion: String, fro
100104
private[otel] object MetricsConverter {
101105
def convert(resource: Resource, kamonVersion: String)(metrics: PeriodSnapshot): JCollection[MetricData] = {
102106
val converter = new WithResourceMetricsConverter(resource, kamonVersion, metrics.from, metrics.to)
103-
val gauges = metrics.gauges.map(converter.convertGauge)
104-
val histograms = (metrics.histograms ++ metrics.timers ++ metrics.rangeSamplers).map(converter.convertHistogram)
105-
val counters = metrics.counters.map(converter.convertCounter)
107+
val gauges = metrics.gauges.filter(_.instruments.nonEmpty).map(converter.convertGauge)
108+
val histograms = (metrics.histograms ++ metrics.timers ++ metrics.rangeSamplers).filter(_.instruments.nonEmpty).flatMap(converter.convertHistogram)
109+
val counters = metrics.counters.filter(_.instruments.nonEmpty).map(converter.convertCounter)
106110

107111
(gauges ++ histograms ++ counters).asJava
108112
}

reporters/kamon-opentelemetry/src/main/scala/kamon/otel/Services.scala

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,21 @@ private[otel] class OtlpMetricsService(c: OpenTelemetryConfiguration) extends Me
122122
builder.build()
123123
}
124124

125-
override def exportMetrics(metrics: JCollection[MetricData]): Future[Unit] = {
126-
val result = Promise[Unit]
127-
val completableResultCode = delegate.`export`(metrics)
128-
val runnable: Runnable = new Runnable {
129-
override def run(): Unit =
130-
if (completableResultCode.isSuccess) result.success(())
131-
else result.failure(MetricStatusRuntimeException)
125+
override def exportMetrics(metrics: JCollection[MetricData]): Future[Unit] =
126+
if (metrics.isEmpty) Future.successful(())
127+
else {
128+
val result = Promise[Unit]
129+
val completableResultCode = delegate.`export`(metrics)
130+
val runnable: Runnable = new Runnable {
131+
override def run(): Unit =
132+
if (completableResultCode.isSuccess) result.success(())
133+
else result.failure(MetricStatusRuntimeException)
134+
}
135+
completableResultCode.whenComplete {
136+
runnable
137+
}
138+
result.future
132139
}
133-
completableResultCode.whenComplete {
134-
runnable
135-
}
136-
result.future
137-
}
138140

139141
override def close(): Unit = delegate.close()
140142
}

0 commit comments

Comments
 (0)