Skip to content

Commit 3907a4e

Browse files
refactor: convert FilteringSpanExporter to kotlin (#1379)
1 parent 42f994b commit 3907a4e

File tree

5 files changed

+117
-135
lines changed

5 files changed

+117
-135
lines changed

core/api/core.api

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,18 @@ public final class io/opentelemetry/android/export/AttributeModifyingSpanExporte
9090
public fun shutdown ()Lio/opentelemetry/sdk/common/CompletableResultCode;
9191
}
9292

93-
public class io/opentelemetry/android/export/FilteringSpanExporter {
94-
public fun <init> ()V
95-
public static fun builder (Lio/opentelemetry/sdk/trace/export/SpanExporter;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
93+
public final class io/opentelemetry/android/export/FilteringSpanExporter {
94+
public static final field INSTANCE Lio/opentelemetry/android/export/FilteringSpanExporter;
95+
public static final fun builder (Lio/opentelemetry/sdk/trace/export/SpanExporter;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
9696
}
9797

9898
public final class io/opentelemetry/android/export/FilteringSpanExporterBuilder {
99-
public fun build ()Lio/opentelemetry/sdk/trace/export/SpanExporter;
100-
public fun rejectSpansNamed (Ljava/lang/String;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
101-
public fun rejectSpansNamed (Ljava/util/function/Predicate;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
102-
public fun rejectSpansWithAttributesMatching (Ljava/util/Map;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
103-
public fun rejectSpansWithNameContaining (Ljava/lang/String;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
104-
public fun rejecting (Ljava/util/function/Predicate;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
99+
public final fun build ()Lio/opentelemetry/sdk/trace/export/SpanExporter;
100+
public final fun rejectSpansNamed (Ljava/lang/String;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
101+
public final fun rejectSpansNamed (Ljava/util/function/Predicate;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
102+
public final fun rejectSpansWithAttributesMatching (Ljava/util/Map;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
103+
public final fun rejectSpansWithNameContaining (Ljava/lang/String;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
104+
public final fun rejecting (Ljava/util/function/Predicate;)Lio/opentelemetry/android/export/FilteringSpanExporterBuilder;
105105
}
106106

107107
public final class io/opentelemetry/android/export/SpanDataModifier {

core/src/main/java/io/opentelemetry/android/export/FilteringSpanExporter.java

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.android.export
7+
8+
import io.opentelemetry.sdk.trace.export.SpanExporter
9+
10+
/** An exporter that will filter (not export) spans that fail a predicate. */
11+
object FilteringSpanExporter {
12+
@JvmStatic
13+
fun builder(delegate: SpanExporter): FilteringSpanExporterBuilder = FilteringSpanExporterBuilder(delegate)
14+
}

core/src/main/java/io/opentelemetry/android/export/FilteringSpanExporterBuilder.java

Lines changed: 0 additions & 110 deletions
This file was deleted.
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.android.export
7+
8+
import io.opentelemetry.api.common.AttributeKey
9+
import io.opentelemetry.contrib.interceptor.InterceptableSpanExporter
10+
import io.opentelemetry.contrib.interceptor.api.Interceptor
11+
import io.opentelemetry.sdk.trace.data.SpanData
12+
import io.opentelemetry.sdk.trace.export.SpanExporter
13+
import java.util.function.Predicate
14+
15+
@Suppress("UNCHECKED_CAST")
16+
class FilteringSpanExporterBuilder internal constructor(
17+
private val delegate: SpanExporter,
18+
) {
19+
private var predicate = Predicate { _: SpanData -> false }
20+
private val interceptor: Interceptor<SpanData> =
21+
Interceptor<SpanData> { item ->
22+
when {
23+
predicate.test(item) -> null
24+
else -> item
25+
}
26+
}
27+
28+
/**
29+
* Creates a SpanExporter that will not export any spans whose name matches the given name. All
30+
* other spans will be exported by the delegate.
31+
*
32+
* @param name - Entire case sensitive span name to match for exclusion
33+
* @return a SpanExporter
34+
*/
35+
fun rejectSpansNamed(name: String): FilteringSpanExporterBuilder = rejecting { span: SpanData -> name == span.name }
36+
37+
/**
38+
* Creates a SpanExporter that will not export any spans whose name matches the given predicate.
39+
* All other spans will be exported by the delegate.
40+
*
41+
* @param spanNamePredicate - predicate to test the span name atainst
42+
* @return a SpanExporter
43+
*/
44+
fun rejectSpansNamed(spanNamePredicate: Predicate<String>): FilteringSpanExporterBuilder =
45+
rejecting { span: SpanData -> spanNamePredicate.test(span.name) }
46+
47+
/**
48+
* Creates a SpanExporter that will not export any spans whose name contains the given
49+
* substring. All other spans will be exported by the delegate.
50+
*
51+
* @param substring - Substring go match within the span name
52+
* @return a SpanExporter
53+
*/
54+
fun rejectSpansWithNameContaining(substring: String): FilteringSpanExporterBuilder =
55+
rejecting { span: SpanData -> span.name.contains(substring) }
56+
57+
/**
58+
* Creates a span exporter that will not export any spans whose SpanData matches the rejecting
59+
* predicate.
60+
*
61+
* @param predicate A predicate that returns true when a span is to be rejected
62+
* @return this
63+
*/
64+
fun rejecting(predicate: Predicate<SpanData>): FilteringSpanExporterBuilder {
65+
this.predicate = this.predicate.or(predicate)
66+
return this
67+
}
68+
69+
fun rejectSpansWithAttributesMatching(attrRejection: MutableMap<AttributeKey<*>, Predicate<*>>): FilteringSpanExporterBuilder {
70+
if (attrRejection.isEmpty()) {
71+
return this
72+
}
73+
val spanRejecter =
74+
Predicate { spanData: SpanData ->
75+
val attributes = spanData.attributes
76+
attrRejection.entries
77+
.stream()
78+
.anyMatch { e: MutableMap.MutableEntry<AttributeKey<*>, Predicate<*>> ->
79+
val key: AttributeKey<*> = e.key
80+
val valuePredicate =
81+
e.value as Predicate<in Any?>
82+
val attributeValue: Any? = attributes.get(key)
83+
(
84+
attributeValue != null &&
85+
valuePredicate.test(attributeValue)
86+
)
87+
}
88+
}
89+
this.predicate = this.predicate.or(spanRejecter)
90+
return this
91+
}
92+
93+
fun build(): SpanExporter = InterceptableSpanExporter(delegate, interceptor)
94+
}

0 commit comments

Comments
 (0)