@@ -22,10 +22,11 @@ import kamon.Kamon
22
22
import kamon .module .{Module , ModuleFactory , SpanReporter }
23
23
import kamon .trace .Span
24
24
import org .slf4j .LoggerFactory
25
+ import java .net .URLDecoder
25
26
import java .util .{Collection => JCollection }
26
27
27
28
import scala .concurrent .ExecutionContext
28
- import scala .util .{Failure , Success }
29
+ import scala .util .{Failure , Success , Try }
29
30
30
31
import io .opentelemetry .sdk .common .InstrumentationLibraryInfo
31
32
import io .opentelemetry .sdk .resources .Resource
@@ -73,7 +74,14 @@ class OpenTelemetryTraceReporter(traceServiceFactory: Config => TraceService)(im
73
74
logger.info(" Reconfigure OpenTelemetry Trace Reporter" )
74
75
75
76
// pre-generate the function for converting Kamon span to proto span
76
- val resource : Resource = buildResource
77
+ val attributes : Map [String , String ] =
78
+ newConfig.getString(" kamon.otel.attributes" ).split(',' ).filter(_ contains '=' ).map(_.trim.split(" =" , 2 )).map {
79
+ case Array (k, v) =>
80
+ val decoded = Try (URLDecoder .decode(v.trim, " UTF-8" ))
81
+ decoded.failed.foreach(t => throw new IllegalArgumentException (s " value for attribute ${k.trim} is not a url-encoded string " , t))
82
+ k.trim -> decoded.get
83
+ }.toMap
84
+ val resource : Resource = buildResource(attributes)
77
85
this .spanConverterFunc = SpanConverter .convert(newConfig.getBoolean(" kamon.otel.trace.include-error-event" ), resource, kamonSettings.version)
78
86
79
87
this .traceService = Option (traceServiceFactory.apply(newConfig))
@@ -90,7 +98,7 @@ class OpenTelemetryTraceReporter(traceServiceFactory: Config => TraceService)(im
90
98
*
91
99
* @return
92
100
*/
93
- private def buildResource : Resource = {
101
+ private def buildResource ( attributes : Map [ String , String ]) : Resource = {
94
102
val env = Kamon .environment
95
103
val builder = Resource .builder()
96
104
.put(" host.name" , kamonSettings.environment.host)
@@ -100,6 +108,7 @@ class OpenTelemetryTraceReporter(traceServiceFactory: Config => TraceService)(im
100
108
.put(" telemetry.sdk.language" , " scala" )
101
109
.put(" telemetry.sdk.version" , kamonSettings.version)
102
110
111
+ attributes.foreach { case (k, v) => builder.put(k, v) }
103
112
// add all kamon.environment.tags as KeyValues to the Resource object
104
113
env.tags.iterator().foreach {
105
114
case t : Tag .String => builder.put(t.key, t.value)
0 commit comments