From 08898e15ad1e316fb27d9aab8cc2312b6054b2ad Mon Sep 17 00:00:00 2001 From: Hugh Simpson Date: Fri, 4 Aug 2023 14:21:46 +0100 Subject: [PATCH] dedup --- .../otel/OpenTelemetryConfiguration.scala | 30 ++++++++++++++++++ .../otel/OpenTelemetryMetricsReporter.scala | 27 +--------------- .../otel/OpenTelemetryTraceReporter.scala | 31 ++----------------- 3 files changed, 34 insertions(+), 54 deletions(-) diff --git a/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryConfiguration.scala b/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryConfiguration.scala index 6cab8e107..c88c29f0f 100644 --- a/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryConfiguration.scala +++ b/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryConfiguration.scala @@ -1,6 +1,10 @@ package kamon.otel import com.typesafe.config.Config +import io.opentelemetry.sdk.resources.Resource +import kamon.Kamon +import kamon.status.Status +import kamon.tag.Tag import org.slf4j.LoggerFactory import java.net.URL @@ -68,4 +72,30 @@ object OpenTelemetryConfiguration { OpenTelemetryConfiguration(protocol, url, compression, headers, timeout) } + private val kamonSettings: Status.Settings = Kamon.status().settings() + /** + * Builds the resource information added as resource labels to the exported metrics/traces + * + * @return + */ + def buildResource(attributes: Map[String, String]): Resource = { + val env = Kamon.environment + val builder = Resource.builder() + .put("host.name", kamonSettings.environment.host) + .put("service.instance.id", kamonSettings.environment.instance) + .put("service.name", env.service) + .put("telemetry.sdk.name", "kamon") + .put("telemetry.sdk.language", "scala") + .put("telemetry.sdk.version", kamonSettings.version) + + attributes.foreach { case (k, v) => builder.put(k, v) } + //add all kamon.environment.tags as KeyValues to the Resource object + env.tags.iterator().foreach { + case t: Tag.String => builder.put(t.key, t.value) + case t: Tag.Boolean => builder.put(t.key, t.value) + case t: Tag.Long => builder.put(t.key, t.value) + } + + builder.build() + } } diff --git a/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryMetricsReporter.scala b/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryMetricsReporter.scala index 0d1a1eb5c..9a3193815 100644 --- a/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryMetricsReporter.scala +++ b/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryMetricsReporter.scala @@ -81,7 +81,7 @@ class OpenTelemetryMetricsReporter(metricsServiceFactory: Config => MetricsServi decoded.failed.foreach(t => throw new IllegalArgumentException(s"value for attribute ${k.trim} is not a url-encoded string", t)) k.trim -> decoded.get }.toMap - val resource: Resource = buildResource(attributes) + val resource: Resource = OpenTelemetryConfiguration.buildResource(attributes) this.metricsConverterFunc = MetricsConverter.convert(resource, kamonSettings.version) this.metricsService = Option(metricsServiceFactory.apply(newConfig)) @@ -93,29 +93,4 @@ class OpenTelemetryMetricsReporter(metricsServiceFactory: Config => MetricsServi this.metricsService = None } - /** - * Builds the resource information added as resource labels to the exported metrics - * - * @return - */ - private def buildResource(attributes: Map[String, String]): Resource = { - val env = Kamon.environment - val builder = Resource.builder() - .put("host.name", kamonSettings.environment.host) - .put("service.instance.id", kamonSettings.environment.instance) - .put("service.name", env.service) - .put("telemetry.sdk.name", "kamon") - .put("telemetry.sdk.language", "scala") - .put("telemetry.sdk.version", kamonSettings.version) - - attributes.foreach { case (k, v) => builder.put(k, v) } - //add all kamon.environment.tags as KeyValues to the Resource object - env.tags.iterator().foreach { - case t: Tag.String => builder.put(t.key, t.value) - case t: Tag.Boolean => builder.put(t.key, t.value) - case t: Tag.Long => builder.put(t.key, t.value) - } - - builder.build() - } } diff --git a/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryTraceReporter.scala b/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryTraceReporter.scala index 19cbab794..f1184e718 100644 --- a/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryTraceReporter.scala +++ b/reporters/kamon-opentelemetry/src/main/scala/kamon/otel/OpenTelemetryTraceReporter.scala @@ -52,8 +52,8 @@ object OpenTelemetryTraceReporter { import OpenTelemetryTraceReporter._ /** - * Converts internal finished Kamon spans to OpenTelemetry format and sends to a configured OpenTelemetry endpoint using gRPC or REST. - */ + * Converts internal finished Kamon spans to OpenTelemetry format and sends to a configured OpenTelemetry endpoint using gRPC or REST. + */ class OpenTelemetryTraceReporter(traceServiceFactory: Config => TraceService)(implicit ec: ExecutionContext) extends SpanReporter { private var traceService: Option[TraceService] = None private var spanConverterFunc: Seq[Span.Finished] => JCollection[SpanData] = (_ => new util.ArrayList[SpanData](0)) @@ -81,7 +81,7 @@ class OpenTelemetryTraceReporter(traceServiceFactory: Config => TraceService)(im decoded.failed.foreach(t => throw new IllegalArgumentException(s"value for attribute ${k.trim} is not a url-encoded string", t)) k.trim -> decoded.get }.toMap - val resource: Resource = buildResource(attributes) + val resource: Resource = OpenTelemetryConfiguration.buildResource(attributes) this.spanConverterFunc = SpanConverter.convert(newConfig.getBoolean("kamon.otel.trace.include-error-event"), resource, kamonSettings.version) this.traceService = Option(traceServiceFactory.apply(newConfig)) @@ -93,29 +93,4 @@ class OpenTelemetryTraceReporter(traceServiceFactory: Config => TraceService)(im this.traceService = None } - /** - * Builds the resource information added as resource labels to the exported traces - * - * @return - */ - private def buildResource(attributes: Map[String, String]): Resource = { - val env = Kamon.environment - val builder = Resource.builder() - .put("host.name", kamonSettings.environment.host) - .put("service.instance.id", kamonSettings.environment.instance) - .put("service.name", env.service) - .put("telemetry.sdk.name", "kamon") - .put("telemetry.sdk.language", "scala") - .put("telemetry.sdk.version", kamonSettings.version) - - attributes.foreach { case (k, v) => builder.put(k, v) } - //add all kamon.environment.tags as KeyValues to the Resource object - env.tags.iterator().foreach { - case t: Tag.String => builder.put(t.key, t.value) - case t: Tag.Boolean => builder.put(t.key, t.value) - case t: Tag.Long => builder.put(t.key, t.value) - } - - builder.build() - } }