Skip to content

Commit aabc0c4

Browse files
authored
Move filter module to bootstrap classloader (#113)
* Move filter module to bootstrap classloader Signed-off-by: Pavol Loffay <[email protected]> * More docs Signed-off-by: Pavol Loffay <[email protected]>
1 parent a339bd5 commit aabc0c4

File tree

21 files changed

+148
-88
lines changed

21 files changed

+148
-88
lines changed

filter/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ plugins {
44

55
dependencies {
66
implementation("io.opentelemetry:opentelemetry-api:0.9.1")
7+
implementation("com.google.auto.service:auto-service:1.0-rc7")
8+
annotationProcessor("com.google.auto.service:auto-service:1.0-rc7")
79
}

filter/src/main/java/org/hypertrace/agent/filter/FilterEvaluator.java renamed to filter/src/main/java/org/hypertrace/agent/filter/Filter.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@
2020
import java.util.Map;
2121

2222
/**
23-
* {@link FilterEvaluator} evaluates given request/RPC and the result is used to block further
24-
* processing of the request.
23+
* {@link Filter} evaluates given request/RPC and the result is used to block further processing of
24+
* the request.
25+
*
26+
* <p>Filter implementation should be discoverable via Java service loader API - each implementation
27+
* has to be registered in {@code META-INF/services/}. The filters are accessed via {@link
28+
* FilterRegistry}.
2529
*/
26-
public interface FilterEvaluator {
30+
public interface Filter {
2731

2832
/**
2933
* Evaluate the execution.

filter/src/main/java/org/hypertrace/agent/filter/FilterProvider.java

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright The Hypertrace Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.hypertrace.agent.filter;
18+
19+
import java.util.ArrayList;
20+
import java.util.List;
21+
import java.util.ServiceLoader;
22+
23+
/**
24+
* Provides access to the {@link Filter} implementations. The {@link Filter} implementation are
25+
* found via Java service loader.
26+
*/
27+
public class FilterRegistry {
28+
29+
private FilterRegistry() {}
30+
31+
private static Filter filter;
32+
33+
/**
34+
* Get {@link Filter}
35+
*
36+
* @return the filter evaluator.
37+
*/
38+
public static Filter getFilter() {
39+
if (filter == null) {
40+
synchronized (FilterRegistry.class) {
41+
if (filter == null) {
42+
filter = load();
43+
}
44+
}
45+
}
46+
return filter;
47+
}
48+
49+
private static Filter load() {
50+
ServiceLoader<Filter> filters = ServiceLoader.load(Filter.class);
51+
List<Filter> filterList = new ArrayList<>();
52+
filters.iterator().forEachRemaining(filterList::add);
53+
return new MultiFilter(filterList);
54+
}
55+
}

filter/src/main/java/org/hypertrace/agent/filter/FilterResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package org.hypertrace.agent.filter;
1818

19-
/** Result of filter evaluation from {@link FilterEvaluator} */
19+
/** Result of filter evaluation from {@link Filter} */
2020
public interface FilterResult {
2121

2222
/**

filter/src/main/java/org/hypertrace/agent/filter/MockFilterEvaluator.java renamed to filter/src/main/java/org/hypertrace/agent/filter/MockFilter.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,17 @@
1616

1717
package org.hypertrace.agent.filter;
1818

19+
import com.google.auto.service.AutoService;
1920
import io.opentelemetry.trace.Span;
2021
import java.util.Map;
2122

22-
/** Mock blocking evaluator, blocks execution if an attribute with "block" key is present. */
23-
class MockFilterEvaluator implements FilterEvaluator {
24-
25-
private MockFilterEvaluator() {}
26-
27-
public static MockFilterEvaluator INSTANCE = new MockFilterEvaluator();
23+
/** Mock blocking evaluator, blocks execution if an attribute with "mockblock" key is present. */
24+
@AutoService(Filter.class)
25+
public class MockFilter implements Filter {
2826

2927
@Override
3028
public FilterResult evaluateRequestHeaders(Span span, Map<String, String> headers) {
31-
if (headers.containsKey("block")) {
29+
if (headers.containsKey("mockblock")) {
3230
span.setAttribute("hypertrace.mock.filter.result", "true");
3331
return ExecutionBlocked.INSTANCE;
3432
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright The Hypertrace Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.hypertrace.agent.filter;
18+
19+
import io.opentelemetry.trace.Span;
20+
import java.util.List;
21+
import java.util.Map;
22+
23+
public class MultiFilter implements Filter {
24+
25+
private final List<Filter> filters;
26+
27+
public MultiFilter(List<Filter> filters) {
28+
this.filters = filters;
29+
}
30+
31+
@Override
32+
public FilterResult evaluateRequestHeaders(Span span, Map<String, String> headers) {
33+
boolean shouldBlock = false;
34+
for (Filter filter : filters) {
35+
if (filter.evaluateRequestHeaders(span, headers).blockExecution()) {
36+
shouldBlock = true;
37+
}
38+
}
39+
return shouldBlock ? ExecutionBlocked.INSTANCE : ExecutionNotBlocked.INSTANCE;
40+
}
41+
42+
@Override
43+
public FilterResult evaluateRequestBody(Span span, String body) {
44+
boolean shouldBlock = false;
45+
for (Filter filter : filters) {
46+
if (filter.evaluateRequestBody(span, body).blockExecution()) {
47+
shouldBlock = true;
48+
}
49+
}
50+
return shouldBlock ? ExecutionBlocked.INSTANCE : ExecutionNotBlocked.INSTANCE;
51+
}
52+
}

instrumentation/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ tasks {
4545

4646
mergeServiceFiles()
4747

48+
relocate("org.hypertrace.agent", "io.opentelemetry.javaagent.shaded.org.hypertrace.agent")
49+
4850
relocate("com.fasterxml.jackson", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.fasterxml.jackson")
4951
relocate("com.google", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.google")
5052
relocate("google.protobuf", "io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.google.protobuf")

instrumentation/grpc-1.5/src/main/java/io/opentelemetry/instrumentation/hypertrace/grpc/v1_5/server/GrpcServerBodyInstrumentation.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,6 @@ public int getOrder() {
4545
@Override
4646
public String[] helperClassNames() {
4747
return new String[] {
48-
"org.hypertrace.agent.filter.FilterProvider",
49-
"org.hypertrace.agent.filter.FilterEvaluator",
50-
"org.hypertrace.agent.filter.FilterResult",
51-
"org.hypertrace.agent.filter.ExecutionBlocked",
52-
"org.hypertrace.agent.filter.ExecutionNotBlocked",
53-
"org.hypertrace.agent.filter.MockFilterEvaluator",
5448
"io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.GrpcTracer",
5549
"io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.GrpcSpanDecorator",
5650
"io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.InstrumentationName",

instrumentation/grpc-1.5/src/main/java/io/opentelemetry/instrumentation/hypertrace/grpc/v1_5/server/GrpcServerInterceptor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import java.util.Map;
3434
import org.hypertrace.agent.core.HypertraceConfig;
3535
import org.hypertrace.agent.core.HypertraceSemanticAttributes;
36-
import org.hypertrace.agent.filter.FilterProvider;
36+
import org.hypertrace.agent.filter.FilterRegistry;
3737
import org.hypertrace.agent.filter.FilterResult;
3838

3939
public class GrpcServerInterceptor implements ServerInterceptor {
@@ -57,7 +57,7 @@ public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
5757
}
5858

5959
FilterResult filterResult =
60-
FilterProvider.getFilterEvaluator().evaluateRequestHeaders(currentSpan, mapHeaders);
60+
FilterRegistry.getFilter().evaluateRequestHeaders(currentSpan, mapHeaders);
6161
if (filterResult.blockExecution()) {
6262
call.close(Status.PERMISSION_DENIED, new Metadata());
6363
@SuppressWarnings("unchecked")

0 commit comments

Comments
 (0)