Skip to content

Commit

Permalink
add option for logging spans via Java Logging subsystem
Browse files Browse the repository at this point in the history
this is not recommended in production but could be a useful
debugging tool
  • Loading branch information
bpholt committed Dec 20, 2023
1 parent 2fbe5f5 commit 10988d8
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 18 deletions.
1 change: 1 addition & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ lazy val core = project.in(file("core"))
"io.opentelemetry" % "opentelemetry-api" % "1.33.0",
"io.opentelemetry" % "opentelemetry-context" % "1.33.0",
"io.opentelemetry" % "opentelemetry-exporter-otlp" % "1.33.0",
"io.opentelemetry" % "opentelemetry-exporter-logging-otlp" % "1.33.0",
"io.opentelemetry" % "opentelemetry-extension-trace-propagators" % "1.33.0",
"io.opentelemetry" % "opentelemetry-sdk" % "1.33.0",
"io.opentelemetry" % "opentelemetry-sdk-common" % "1.33.0",
Expand Down
52 changes: 34 additions & 18 deletions core/src/main/scala/com/dwolla/tracing/OpenTelemetryAtDwolla.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.dwolla.tracing

import cats.effect.std.Env
import cats.effect.std.*
import cats.effect.syntax.all.*
import cats.effect.{Trace as _, *}
import cats.syntax.all.*
Expand All @@ -10,17 +10,24 @@ import io.opentelemetry.context.propagation.{ContextPropagators, TextMapPropagat
import io.opentelemetry.contrib.aws.resource.{Ec2Resource, EcsResource}
import io.opentelemetry.contrib.awsxray.AwsXrayIdGenerator
import io.opentelemetry.contrib.awsxray.propagator.AwsXrayPropagator
import io.opentelemetry.exporter.logging.otlp.OtlpJsonLoggingSpanExporter
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter
import io.opentelemetry.extension.trace.propagation.B3Propagator
import io.opentelemetry.sdk.resources.Resource as OTResource
import io.opentelemetry.sdk.trace.SdkTracerProvider
import io.opentelemetry.sdk.trace.`export`.BatchSpanProcessor
import io.opentelemetry.sdk.trace.{SdkTracerProvider, SdkTracerProviderBuilder}
import io.opentelemetry.sdk.trace.`export`.{BatchSpanProcessor, SimpleSpanProcessor}
import io.opentelemetry.semconv.ResourceAttributes
import natchez.*
import natchez.opentelemetry.OpenTelemetry

object OpenTelemetryAtDwolla {
def apply[F[_] : Sync : Env](serviceName: String, env: DwollaEnvironment): Resource[F, EntryPoint[F]] =
def apply[F[_] : Sync : Env](serviceName: String,
env: DwollaEnvironment): Resource[F, EntryPoint[F]] =
OpenTelemetryAtDwolla[F](serviceName, env, logTraces = false)

def apply[F[_] : Sync : Env](serviceName: String,
env: DwollaEnvironment,
logTraces: Boolean): Resource[F, EntryPoint[F]] =
OpenTelemetry.entryPoint(globallyRegister = true) { sdkBuilder =>
// TODO consider whether to use the OpenTelemetry SDK Autoconfigure module to support all the environment variables https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk-extensions/autoconfigure
Env[F].get("OTEL_EXPORTER_OTLP_ENDPOINT")
Expand All @@ -32,8 +39,15 @@ object OpenTelemetryAtDwolla {

BatchSpanProcessor.builder(builder).build()
})
.map(_.pure[List])
.map {
logTraces
.guard[Option]
.as(SimpleSpanProcessor.create(OtlpJsonLoggingSpanExporter.create()))
.toList ::: _
}
}
.evalMap { bsp =>
.evalMap { spanProcessors =>
Sync[F].delay {
sdkBuilder
.setPropagators {
Expand All @@ -46,19 +60,21 @@ object OpenTelemetryAtDwolla {
}
}
.setTracerProvider {
SdkTracerProvider.builder()
.setResource {
OTResource
.getDefault
.merge(OTResource.create(Attributes.of(
ResourceAttributes.SERVICE_NAME, serviceName,
ResourceAttributes.DEPLOYMENT_ENVIRONMENT, env.name,
)))
.merge(Ec2Resource.get())
.merge(EcsResource.get())
}
.addSpanProcessor(bsp)
.setIdGenerator(AwsXrayIdGenerator.getInstance())
spanProcessors
.foldl[SdkTracerProviderBuilder] {
SdkTracerProvider.builder()
.setResource {
OTResource
.getDefault
.merge(OTResource.create(Attributes.of(
ResourceAttributes.SERVICE_NAME, serviceName,
ResourceAttributes.DEPLOYMENT_ENVIRONMENT, env.name,
)))
.merge(Ec2Resource.get())
.merge(EcsResource.get())
}
.setIdGenerator(AwsXrayIdGenerator.getInstance())
}(_ addSpanProcessor _)
.build()
}
}
Expand Down

0 comments on commit 10988d8

Please sign in to comment.