Skip to content

Commit 5c45dcf

Browse files
authored
Merge pull request #742 from iRevive/sdk-common/resource-detector-config
sdk-common: allow disabling resource detectors from the config
2 parents 9f8c8b0 + e74dc66 commit 5c45dcf

File tree

6 files changed

+84
-31
lines changed

6 files changed

+84
-31
lines changed

docs/sdk/configuration.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,17 @@ If not specified, SDK defaults the service name to `unknown_service:scala`.
5050
| otel.resource.attributes | OTEL\\_RESOURCE\\_ATTRIBUTES | Specify resource attributes in the following format: `key1=val1,key2=val2,key3=val3`. |
5151
| otel.service.name | OTEL\\_SERVICE\\_NAME | Specify logical service name. Takes precedence over `service.name` defined with `otel.resource.attributes`. |
5252
| otel.experimental.resource.disabled-keys | OTEL\\_EXPERIMENTAL\\_RESOURCE\\_DISABLED\\_KEYS | Specify resource attribute keys that are filtered. |
53-
| otel.otel4s.resource.detectors | OTEL\\_OTEL4S\\_RESOURCE\\_DETECTORS | Specify resource detectors to use. Defaults to `host,os,process_runtime`. |
53+
| otel.otel4s.resource.detectors.enabled | OTEL\\_OTEL4S\\_RESOURCE\\_DETECTORS\\_ENABLED | Specify resource detectors to use. Defaults to `host,os,process,process_runtime`. |
54+
| otel.otel4s.resource.detectors.disabled | OTEL\\_OTEL4S\\_RESOURCE\\_DETECTORS\\_DISABLED | Specify resource detectors to disable. |
55+
56+
### Telemetry resource detectors
57+
58+
`TelemetryResourceDetector` adds environment-aware attributes to the telemetry resource.
59+
For example, `HostDetector` will add `host.arch` and `host.name` attributes.
60+
By default, the following resource detectors are enabled: `host`, `os`, `process`, `process_runtime`.
61+
62+
To disable all detectors, set `-Dotel.otel4s.resource.detectors.enabled=none`.
63+
To disable some detectors, use `-Dotel.otel4s.resource.detectors.disabled=host,os,process`.
5464

5565
## Metrics
5666

sdk/all/src/test/scala/org/typelevel/otel4s/sdk/OpenTelemetrySdkSuite.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class OpenTelemetrySdkSuite extends CatsEffectSuite {
6969
test("withConfig - use the given config") {
7070
val config = Config.ofProps(
7171
Map(
72-
"otel.otel4s.resource.detectors" -> "none",
72+
"otel.otel4s.resource.detectors.enabled" -> "none",
7373
"otel.traces.exporter" -> "none",
7474
"otel.metrics.exporter" -> "none"
7575
)
@@ -125,7 +125,7 @@ class OpenTelemetrySdkSuite extends CatsEffectSuite {
125125
test("addTracerProviderCustomizer - customize tracer provider") {
126126
val config = Config.ofProps(
127127
Map(
128-
"otel.otel4s.resource.detectors" -> "none",
128+
"otel.otel4s.resource.detectors.enabled" -> "none",
129129
"otel.traces.exporter" -> "none",
130130
"otel.metrics.exporter" -> "none"
131131
)
@@ -147,7 +147,7 @@ class OpenTelemetrySdkSuite extends CatsEffectSuite {
147147
test("addResourceCustomizer - customize a resource") {
148148
val config = Config.ofProps(
149149
Map(
150-
"otel.otel4s.resource.detectors" -> "none",
150+
"otel.otel4s.resource.detectors.enabled" -> "none",
151151
"otel.traces.exporter" -> "none",
152152
"otel.metrics.exporter" -> "none"
153153
)
@@ -176,7 +176,7 @@ class OpenTelemetrySdkSuite extends CatsEffectSuite {
176176
test("addSpanExporterConfigurer - support external configurers") {
177177
val config = Config.ofProps(
178178
Map(
179-
"otel.otel4s.resource.detectors" -> "none",
179+
"otel.otel4s.resource.detectors.enabled" -> "none",
180180
"otel.traces.exporter" -> "custom-1,custom-2",
181181
"otel.metrics.exporter" -> "none"
182182
)
@@ -217,7 +217,7 @@ class OpenTelemetrySdkSuite extends CatsEffectSuite {
217217
test("addSamplerConfigurer - support external configurers") {
218218
val config = Config.ofProps(
219219
Map(
220-
"otel.otel4s.resource.detectors" -> "none",
220+
"otel.otel4s.resource.detectors.enabled" -> "none",
221221
"otel.traces.exporter" -> "none",
222222
"otel.metrics.exporter" -> "none",
223223
"otel.traces.sampler" -> "custom-sampler",
@@ -252,7 +252,7 @@ class OpenTelemetrySdkSuite extends CatsEffectSuite {
252252
test("addTextMapPropagatorConfigurer - support external configurers") {
253253
val config = Config.ofProps(
254254
Map(
255-
"otel.otel4s.resource.detectors" -> "none",
255+
"otel.otel4s.resource.detectors.enabled" -> "none",
256256
"otel.traces.exporter" -> "none",
257257
"otel.metrics.exporter" -> "none",
258258
"otel.propagators" -> "tracecontext,custom-1,custom-2,baggage",
@@ -297,7 +297,7 @@ class OpenTelemetrySdkSuite extends CatsEffectSuite {
297297
test("addMeterProviderCustomizer - customize meter provider") {
298298
val config = Config.ofProps(
299299
Map(
300-
"otel.otel4s.resource.detectors" -> "none",
300+
"otel.otel4s.resource.detectors.enabled" -> "none",
301301
"otel.traces.exporter" -> "none",
302302
"otel.metrics.exporter" -> "console"
303303
)
@@ -331,7 +331,7 @@ class OpenTelemetrySdkSuite extends CatsEffectSuite {
331331
test("addMeterExporterConfigurer - support external configurers") {
332332
val config = Config.ofProps(
333333
Map(
334-
"otel.otel4s.resource.detectors" -> "none",
334+
"otel.otel4s.resource.detectors.enabled" -> "none",
335335
"otel.traces.exporter" -> "none",
336336
"otel.metrics.exporter" -> "custom-1,custom-2"
337337
)

sdk/common/shared/src/main/scala/org/typelevel/otel4s/sdk/autoconfigure/TelemetryResourceAutoConfigure.scala

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ import java.nio.charset.StandardCharsets
4040
* | otel.resource.attributes | OTEL_RESOURCE_ATTRIBUTES | Specify resource attributes in the following format: key1=val1,key2=val2,key3=val3 |
4141
* | otel.service.name | OTEL_SERVICE_NAME | Specify logical service name. Takes precedence over `service.name` defined with `otel.resource.attributes` |
4242
* | otel.experimental.resource.disabled-keys | OTEL_EXPERIMENTAL_RESOURCE_DISABLED_KEYS | Specify resource attribute keys that are filtered. |
43-
* | otel.otel4s.resource.detectors | OTEL_OTEL4S_RESOURCE_DETECTORS | Specify resource detectors to use. Defaults to `host,os,process,process_runtime`. |
43+
* | otel.otel4s.resource.detectors.enabled | OTEL_OTEL4S_RESOURCE_DETECTORS_ENABLED | Specify resource detectors to use. Defaults to `host,os,process,process_runtime`. |
44+
* | otel.otel4s.resource.detectors.disabled | OTEL_OTEL4S_RESOURCE_DETECTORS_DISABLED | Specify resource detectors to disable. |
4445
* }}}
4546
*
4647
* @see
@@ -75,7 +76,12 @@ private final class TelemetryResourceAutoConfigure[F[_]: Sync: Console](
7576
Sync[F].fromEither(fromEnv(config, disabledKeys))
7677
)
7778

78-
detectedResource <- fromDetectors(config, disabledKeys)
79+
disabledDetectors <- Resource.eval(
80+
Sync[F].fromEither(
81+
config.getOrElse(ConfigKeys.DetectorsDisabled, Set.empty[String])
82+
)
83+
)
84+
detectedResource <- fromDetectors(config, disabledKeys, disabledDetectors)
7985
} yield detectedResource.fold(envResource)(_.mergeUnsafe(envResource))
8086

8187
private def fromEnv(
@@ -122,7 +128,8 @@ private final class TelemetryResourceAutoConfigure[F[_]: Sync: Console](
122128

123129
private def fromDetectors(
124130
config: Config,
125-
disabledKeys: Set[String]
131+
disabledKeys: Set[String],
132+
disabledDetectors: Set[String]
126133
): Resource[F, Option[TelemetryResource]] = {
127134

128135
def removeDisabledAttributes(resource: TelemetryResource) =
@@ -148,18 +155,18 @@ private final class TelemetryResourceAutoConfigure[F[_]: Sync: Console](
148155
case None =>
149156
Sync[F].raiseError(
150157
ConfigurationError.unrecognized(
151-
ConfigKeys.Detectors.name,
158+
ConfigKeys.DetectorsEnabled.name,
152159
name,
153160
detectors.map(_.name) + Const.NoneDetector
154161
)
155162
)
156163
}
157164

158-
config.getOrElse(ConfigKeys.Detectors, Defaults.Detectors) match {
165+
config.getOrElse(ConfigKeys.DetectorsEnabled, Defaults.Detectors) match {
159166
case Right(n) if n.contains(Const.NoneDetector) && n.sizeIs > 1 =>
160167
Resource.raiseError(
161168
ConfigurationError(
162-
s"[${ConfigKeys.Detectors}] contains '${Const.NoneDetector}' along with other detectors"
169+
s"[${ConfigKeys.DetectorsEnabled}] contains '${Const.NoneDetector}' along with other detectors"
163170
): Throwable
164171
)
165172

@@ -168,7 +175,9 @@ private final class TelemetryResourceAutoConfigure[F[_]: Sync: Console](
168175

169176
case Right(names) =>
170177
Resource.eval(
171-
names.toList
178+
names
179+
.diff(disabledDetectors)
180+
.toList
172181
.flatTraverse(detector => detect(detector).map(_.toList))
173182
.map(resources => resources.reduceOption(_ mergeUnsafe _))
174183
)
@@ -192,10 +201,19 @@ private[sdk] object TelemetryResourceAutoConfigure {
192201
val ServiceName: Config.Key[String] =
193202
Config.Key("otel.service.name")
194203

195-
val Detectors: Config.Key[Set[String]] =
196-
Config.Key("otel.otel4s.resource.detectors")
204+
val DetectorsEnabled: Config.Key[Set[String]] =
205+
Config.Key("otel.otel4s.resource.detectors.enabled")
206+
207+
val DetectorsDisabled: Config.Key[Set[String]] =
208+
Config.Key("otel.otel4s.resource.detectors.disabled")
197209

198-
val All: Set[Config.Key[_]] = Set(DisabledKeys, Attributes, ServiceName)
210+
val All: Set[Config.Key[_]] = Set(
211+
DisabledKeys,
212+
Attributes,
213+
ServiceName,
214+
DetectorsEnabled,
215+
DetectorsDisabled
216+
)
199217
}
200218

201219
private object Const {
@@ -220,7 +238,8 @@ private[sdk] object TelemetryResourceAutoConfigure {
220238
* | otel.resource.attributes | OTEL_RESOURCE_ATTRIBUTES | Specify resource attributes in the following format: key1=val1,key2=val2,key3=val3 |
221239
* | otel.service.name | OTEL_SERVICE_NAME | Specify logical service name. Takes precedence over `service.name` defined with `otel.resource.attributes` |
222240
* | otel.experimental.resource.disabled-keys | OTEL_EXPERIMENTAL_RESOURCE_DISABLED_KEYS | Specify resource attribute keys that are filtered. |
223-
* | otel.otel4s.resource.detectors | OTEL_OTEL4S_RESOURCE_DETECTORS | Specify resource detectors to use. Defaults to `host,os,process,process_runtime`. |
241+
* | otel.otel4s.resource.detectors.enabled | OTEL_OTEL4S_RESOURCE_DETECTORS_ENABLED | Specify resource detectors to use. Defaults to `host,os,process,process_runtime`. |
242+
* | otel.otel4s.resource.detectors.disabled | OTEL_OTEL4S_RESOURCE_DETECTORS_DISABLED | Specify resource detectors to disable. |
224243
* }}}
225244
*
226245
* @see

sdk/common/shared/src/test/scala/org/typelevel/otel4s/sdk/autoconfigure/TelemetryResourceAutoConfigureSuite.scala

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import org.typelevel.otel4s.sdk.resource.TelemetryResourceDetector
2626
class TelemetryResourceAutoConfigureSuite extends CatsEffectSuite {
2727

2828
test("load from an empty config - use default as a fallback") {
29-
val props = Map("otel.otel4s.resource.detectors" -> "none")
29+
val props = Map("otel.otel4s.resource.detectors.enabled" -> "none")
3030
val config = Config.ofProps(props)
3131

3232
TelemetryResourceAutoConfigure[IO](Set.empty)
@@ -41,7 +41,7 @@ class TelemetryResourceAutoConfigureSuite extends CatsEffectSuite {
4141
"otel.service.name" -> "some-service",
4242
"otel.resource.attributes" -> "key1=val1,key2=val2,key3=val3",
4343
"otel.experimental.resource.disabled-keys" -> "key1,val3,test,key3",
44-
"otel.otel4s.resource.detectors" -> "none"
44+
"otel.otel4s.resource.detectors.enabled" -> "none"
4545
)
4646

4747
val config = Config.ofProps(props)
@@ -112,7 +112,7 @@ class TelemetryResourceAutoConfigureSuite extends CatsEffectSuite {
112112
}
113113

114114
test("use extra detectors") {
115-
val props = Map("otel.otel4s.resource.detectors" -> "custom")
115+
val props = Map("otel.otel4s.resource.detectors.enabled" -> "custom")
116116
val config = Config(props, Map.empty, Map.empty)
117117

118118
val customResource =
@@ -134,4 +134,28 @@ class TelemetryResourceAutoConfigureSuite extends CatsEffectSuite {
134134
)
135135
}
136136
}
137+
138+
test("do not load disabled detectors") {
139+
val props = Map(
140+
"otel.otel4s.resource.detectors.disabled" -> "host,process,process_runtime"
141+
)
142+
val config = Config.ofProps(props)
143+
144+
TelemetryResourceAutoConfigure[IO](Set.empty)
145+
.configure(config)
146+
.use { resource =>
147+
val service = Set("service.name")
148+
val os = Set("os.type", "os.description")
149+
150+
val telemetry = Set(
151+
"telemetry.sdk.language",
152+
"telemetry.sdk.name",
153+
"telemetry.sdk.version"
154+
)
155+
156+
val all = os ++ service ++ telemetry
157+
158+
IO(assertEquals(resource.attributes.map(_.key.name).toSet, all))
159+
}
160+
}
137161
}

sdk/metrics/src/test/scala/org/typelevel/otel4s/sdk/metrics/SdkMetricsSuite.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class SdkMetricsSuite extends CatsEffectSuite {
4747
test("withConfig - use the given config") {
4848
val config = Config.ofProps(
4949
Map(
50-
"otel.otel4s.resource.detectors" -> "none",
50+
"otel.otel4s.resource.detectors.enabled" -> "none",
5151
"otel.metrics.exporter" -> "console"
5252
)
5353
)
@@ -128,7 +128,7 @@ class SdkMetricsSuite extends CatsEffectSuite {
128128
test("addResourceCustomizer - customize a resource") {
129129
val config = Config.ofProps(
130130
Map(
131-
"otel.otel4s.resource.detectors" -> "none",
131+
"otel.otel4s.resource.detectors.enabled" -> "none",
132132
"otel.metrics.exporter" -> "console"
133133
)
134134
)
@@ -156,7 +156,7 @@ class SdkMetricsSuite extends CatsEffectSuite {
156156
test("addExporterConfigurer - support external configurers") {
157157
val config = Config.ofProps(
158158
Map(
159-
"otel.otel4s.resource.detectors" -> "none",
159+
"otel.otel4s.resource.detectors.enabled" -> "none",
160160
"otel.metrics.exporter" -> "custom-1,custom-2"
161161
)
162162
)

sdk/trace/src/test/scala/org/typelevel/otel4s/sdk/trace/SdkTracesSuite.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class SdkTracesSuite extends CatsEffectSuite {
5959
test("withConfig - use the given config") {
6060
val config = Config.ofProps(
6161
Map(
62-
"otel.otel4s.resource.detectors" -> "none",
62+
"otel.otel4s.resource.detectors.enabled" -> "none",
6363
"otel.traces.exporter" -> "none"
6464
)
6565
)
@@ -137,7 +137,7 @@ class SdkTracesSuite extends CatsEffectSuite {
137137
test("addResourceCustomizer - customize a resource") {
138138
val config = Config.ofProps(
139139
Map(
140-
"otel.otel4s.resource.detectors" -> "none",
140+
"otel.otel4s.resource.detectors.enabled" -> "none",
141141
"otel.traces.exporter" -> "none"
142142
)
143143
)
@@ -165,7 +165,7 @@ class SdkTracesSuite extends CatsEffectSuite {
165165
test("addExporterConfigurer - support external configurers") {
166166
val config = Config.ofProps(
167167
Map(
168-
"otel.otel4s.resource.detectors" -> "none",
168+
"otel.otel4s.resource.detectors.enabled" -> "none",
169169
"otel.traces.exporter" -> "custom-1,custom-2"
170170
)
171171
)
@@ -205,7 +205,7 @@ class SdkTracesSuite extends CatsEffectSuite {
205205
test("addSamplerConfigurer - support external configurers") {
206206
val config = Config.ofProps(
207207
Map(
208-
"otel.otel4s.resource.detectors" -> "none",
208+
"otel.otel4s.resource.detectors.enabled" -> "none",
209209
"otel.traces.exporter" -> "none",
210210
"otel.traces.sampler" -> "custom-sampler",
211211
)
@@ -239,7 +239,7 @@ class SdkTracesSuite extends CatsEffectSuite {
239239
test("addTextMapPropagatorConfigurer - support external configurers") {
240240
val config = Config.ofProps(
241241
Map(
242-
"otel.otel4s.resource.detectors" -> "none",
242+
"otel.otel4s.resource.detectors.enabled" -> "none",
243243
"otel.traces.exporter" -> "none",
244244
"otel.propagators" -> "tracecontext,custom-1,custom-2,baggage",
245245
)

0 commit comments

Comments
 (0)