Skip to content

Commit 428dd94

Browse files
committed
Revert "switch to micronaut tracing (#201)"
This reverts commit 2533953.
1 parent 2533953 commit 428dd94

File tree

17 files changed

+261
-98
lines changed

17 files changed

+261
-98
lines changed

pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@
141141
<groupId>io.opentelemetry</groupId>
142142
<artifactId>opentelemetry-exporter-otlp</artifactId>
143143
</dependency>
144+
<dependency>
145+
<groupId>io.opentelemetry.instrumentation</groupId>
146+
<artifactId>opentelemetry-instrumentation-annotations</artifactId>
147+
</dependency>
144148
<dependency>
145149
<groupId>io.micronaut.cache</groupId>
146150
<artifactId>micronaut-cache-core</artifactId>
@@ -435,6 +439,11 @@
435439
<artifactId>micronaut-openapi</artifactId>
436440
<version>${micronaut.openapi.version}</version>
437441
</path>
442+
<path>
443+
<groupId>io.micronaut.tracing</groupId>
444+
<artifactId>micronaut-tracing-opentelemetry-annotation</artifactId>
445+
<version>${micronaut.tracing.version}</version>
446+
</path>
438447
<path>
439448
<groupId>com.google.auto.service</groupId>
440449
<artifactId>auto-service</artifactId>

src/main/java/no/ssb/dlp/pseudo/service/accessgroups/CloudIdentityService.java

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package no.ssb.dlp.pseudo.service.accessgroups;
22

33
import io.micronaut.cache.annotation.Cacheable;
4-
import io.micronaut.tracing.annotation.NewSpan;
5-
import io.micronaut.tracing.annotation.SpanTag;
6-
import io.opentelemetry.api.trace.Tracer;
74
import io.reactivex.Flowable;
8-
import org.reactivestreams.Publisher;
95
import jakarta.inject.Singleton;
106
import lombok.RequiredArgsConstructor;
7+
import no.ssb.dlp.pseudo.service.tracing.SpanAttribute;
8+
import no.ssb.dlp.pseudo.service.tracing.WithSpan;
119

1210
import java.util.ArrayList;
1311
import java.util.List;
@@ -16,11 +14,10 @@
1614
@RequiredArgsConstructor
1715
public class CloudIdentityService {
1816
private final CloudIdentityClient cloudIdentityClient;
19-
private final Tracer tracer;
2017

21-
@NewSpan
18+
@WithSpan
2219
@Cacheable(value = "cloud-identity-service-cache", parameters = {"groupEmail"})
23-
public List<Membership> listMembers(@SpanTag String groupEmail) {
20+
public List<Membership> listMembers(@SpanAttribute String groupEmail) {
2421
return Flowable.fromPublisher(cloudIdentityClient.lookup(groupEmail))
2522
.flatMap(lookupResponse -> fetchMemberships(lookupResponse.getGroupName(), null,
2623
new ArrayList<>()))
@@ -35,22 +32,19 @@ public List<Membership> listMembers(@SpanTag String groupEmail) {
3532
* @param allMemberships a list that will be populated with all memberships
3633
* @return the list of all memberships
3734
*/
38-
private Publisher<List<Membership>> fetchMemberships(
39-
String groupId,
40-
String nextPageToken,
35+
@WithSpan
36+
protected Flowable<List<Membership>> fetchMemberships(
37+
@SpanAttribute String groupId,
38+
@SpanAttribute String nextPageToken,
4139
List<Membership> allMemberships
4240
) {
43-
final var span = tracer.spanBuilder("fetchMemberships").startSpan();
44-
span.setAttribute("groupId", groupId);
45-
span.setAttribute("nextPageToken", nextPageToken);
4641
if (groupId == null || groupId.isEmpty()) {
4742
return Flowable.just(allMemberships);
4843
}
4944
return Flowable.fromPublisher(cloudIdentityClient.listMembers(groupId, nextPageToken))
5045
.flatMap(membershipResponse -> {
5146
allMemberships.addAll(membershipResponse.getMemberships());
5247
String nextToken = membershipResponse.getNextPageToken();
53-
span.end();
5448
return nextToken != null ?
5549
fetchMemberships(groupId, nextToken, allMemberships) :
5650
Flowable.just(allMemberships);

src/main/java/no/ssb/dlp/pseudo/service/filters/AccessTokenFilter.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,13 @@
1010
import io.micronaut.http.filter.ClientFilterChain;
1111
import io.micronaut.http.filter.HttpClientFilter;
1212
import io.micronaut.inject.qualifiers.Qualifiers;
13-
import io.micronaut.tracing.annotation.NewSpan;
14-
import io.opentelemetry.api.trace.Span;
15-
import io.opentelemetry.api.trace.Tracer;
1613
import jakarta.annotation.Nullable;
1714
import lombok.Data;
1815
import lombok.SneakyThrows;
1916
import lombok.extern.slf4j.Slf4j;
2017
import org.reactivestreams.Publisher;
18+
import no.ssb.dlp.pseudo.service.tracing.WithSpan;
19+
import no.ssb.dlp.pseudo.service.tracing.WithSpanContext;
2120

2221
import jakarta.inject.Inject;
2322
import jakarta.inject.Singleton;
@@ -44,10 +43,9 @@ public class AccessTokenFilter implements HttpClientFilter {
4443
@Value("${gcp.http.client.filter.project-id}")
4544
private String projectId;
4645
private final GoogleCredentials credentials;
47-
private final Tracer tracer;
4846

4947
@SneakyThrows
50-
public AccessTokenFilter(@Nullable @Value("${gcp.http.client.filter.credentials-path}") String credentialsPath, Tracer tracer) {
48+
public AccessTokenFilter(@Nullable @Value("${gcp.http.client.filter.credentials-path}") String credentialsPath) {
5149
if (credentialsPath == null) {
5250
log.info("Using Application Default Credentials");
5351
this.credentials = GoogleCredentials.getApplicationDefault();
@@ -56,13 +54,12 @@ public AccessTokenFilter(@Nullable @Value("${gcp.http.client.filter.credentials-
5654
this.credentials = GoogleCredentials.fromStream(
5755
new FileInputStream(credentialsPath));
5856
}
59-
this.tracer = tracer;
6057
}
6158

6259
@SneakyThrows
63-
@NewSpan
60+
@WithSpan
6461
public Publisher<? extends HttpResponse<?>> doFilter(MutableHttpRequest<?> request, ClientFilterChain chain) {
65-
final var currentSpan = Span.current();
62+
final var currentSpan = WithSpanContext.currentSpan();
6663
currentSpan.setAttribute("request.url", request.getUri().toString());
6764
final var config = request.getAttribute("micronaut.http.serviceId").map(Object::toString).flatMap(this::getConfig);
6865
currentSpan.addEvent("Add bearer auth", Instant.now());
@@ -86,20 +83,18 @@ private void setProjectIdHeader(MutableHttpRequest<?> request) {
8683
}
8784

8885
@SneakyThrows
89-
private String getAccessToken(String audience) {
90-
Span span = tracer.spanBuilder("getAccessToken").startSpan();
91-
final var result = credentials.createScoped(audience).refreshAccessToken().getTokenValue();
92-
span.end();
93-
return result;
86+
@WithSpan
87+
protected String getAccessToken(String audience) {
88+
return credentials.createScoped(audience).refreshAccessToken().getTokenValue();
9489
}
9590

96-
@Cacheable(value = "access-token-filter-cache", parameters = {"serviceId"})
97-
@NewSpan
91+
@Cacheable(value="access-token-filter-cache", parameters = {"serviceId"})
92+
@WithSpan
9893
protected Optional<AccessTokenFilterConfig> getConfig(String serviceId) {
9994
return Optional
10095
.ofNullable(applicationContext)
10196
.flatMap(ac ->
102-
ac.findBean(AccessTokenFilterConfig.class, Qualifiers.byName(serviceId))
97+
ac.findBean(AccessTokenFilterConfig.class, Qualifiers.byName(serviceId))
10398
);
10499
}
105100

src/main/java/no/ssb/dlp/pseudo/service/pseudo/PseudoController.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import io.micronaut.scheduling.TaskExecutors;
1010
import io.micronaut.scheduling.annotation.ExecuteOn;
1111
import io.micronaut.security.annotation.Secured;
12-
import io.micronaut.tracing.annotation.NewSpan;
13-
import io.opentelemetry.api.trace.Tracer;
1412
import io.reactivex.Flowable;
1513
import io.opentelemetry.api.trace.Span;
1614
import io.swagger.v3.oas.annotations.Operation;
@@ -28,6 +26,8 @@
2826
import no.ssb.dlp.pseudo.service.sid.InvalidSidSnapshotDateException;
2927
import no.ssb.dlp.pseudo.service.sid.SidIndexUnavailableException;
3028

29+
import no.ssb.dlp.pseudo.service.tracing.WithSpan;
30+
import no.ssb.dlp.pseudo.service.tracing.WithSpanContext;
3131
import org.slf4j.MDC;
3232

3333
import java.lang.reflect.InvocationTargetException;
@@ -52,7 +52,6 @@ public class PseudoController {
5252
private final StreamProcessorFactory streamProcessorFactory;
5353
private final RecordMapProcessorFactory recordProcessorFactory;
5454
private final PseudoConfigSplitter pseudoConfigSplitter;
55-
private final Tracer tracer;
5655

5756
/**
5857
* Pseudonymizes a field.
@@ -61,14 +60,14 @@ public class PseudoController {
6160
* @return HTTP response containing a {@link HttpResponse<Flowable>} object.
6261
*/
6362

64-
@NewSpan
63+
@WithSpan
6564
@Operation(summary = "Pseudonymize field", description = "Pseudonymize a field.")
6665
@Produces(MediaType.APPLICATION_JSON)
6766
@Post(value = "/pseudonymize/field", consumes = MediaType.APPLICATION_JSON)
6867
@ExecuteOn(TaskExecutors.BLOCKING)
6968
public HttpResponse<Flowable<byte[]>> pseudonymizeField(@Schema(implementation = PseudoFieldRequest.class) String request) {
7069
PseudoFieldRequest req = Json.toObject(PseudoFieldRequest.class, request);
71-
final var currentSpan = Span.current();
70+
final var currentSpan = WithSpanContext.currentSpan();
7271
if (req != null) {
7372
currentSpan.setAttribute("pseudoRequest.field", req.getName());
7473
currentSpan.setAttribute("pseudoRequest.pattern", req.getPattern());
@@ -77,6 +76,7 @@ public HttpResponse<Flowable<byte[]>> pseudonymizeField(@Schema(implementation =
7776
if (values != null) {
7877
currentSpan.setAttribute("pseudoRequest.values.count", values.size());
7978
currentSpan.setAttribute("pseudoRequest.values", values.toString());
79+
Span.current().setAttribute("pseudoRequest.values", values.toString());
8080
}
8181
}
8282
log.info(Strings.padEnd(String.format("*** Pseudonymize field: %s ", req.getName()), 80, '*'));
@@ -108,7 +108,7 @@ public HttpResponse<Flowable<byte[]>> pseudonymizeField(@Schema(implementation =
108108
* @param request JSON string representing a {@link DepseudoFieldRequest} object.
109109
* @return HTTP response containing a {@link HttpResponse<Flowable>} object.
110110
*/
111-
@NewSpan
111+
@WithSpan
112112
@Operation(summary = "Depseudonymize field", description = "Depseudonymize a field.")
113113
@Produces(MediaType.APPLICATION_JSON)
114114
@Secured({PseudoServiceRole.ADMIN})
@@ -117,7 +117,7 @@ public HttpResponse<Flowable<byte[]>> pseudonymizeField(@Schema(implementation =
117117
public HttpResponse<Flowable<byte[]>> depseudonymizeField(@Schema(implementation = DepseudoFieldRequest.class) String request) {
118118
DepseudoFieldRequest req = Json.toObject(DepseudoFieldRequest.class, request);
119119
Span currentSpan = Span.current();
120-
if (req != null) {
120+
if (currentSpan.getSpanContext().isValid() && req != null) {
121121
currentSpan.setAttribute("pseudo.field", req.getName());
122122
currentSpan.setAttribute("pseudo.pattern", req.getPattern());
123123
currentSpan.setAttribute("pseudo.values.count", req.getValues() == null ? 0 : req.getValues().size());
@@ -140,7 +140,7 @@ public HttpResponse<Flowable<byte[]>> depseudonymizeField(@Schema(implementation
140140
* @param request JSON string representing a {@link RepseudoFieldRequest} object.
141141
* @return HTTP response containing a {@link HttpResponse<Flowable>} object.
142142
*/
143-
@NewSpan
143+
@WithSpan
144144
@Operation(summary = "Repseudonymize field", description = "Repseudonymize a field.")
145145
@Produces(MediaType.APPLICATION_JSON)
146146
@Secured({PseudoServiceRole.ADMIN})
@@ -149,7 +149,7 @@ public HttpResponse<Flowable<byte[]>> depseudonymizeField(@Schema(implementation
149149
public HttpResponse<Flowable<byte[]>> repseudonymizeField(@Schema(implementation = RepseudoFieldRequest.class) String request) {
150150
RepseudoFieldRequest req = Json.toObject(RepseudoFieldRequest.class, request);
151151
Span currentSpan = Span.current();
152-
if (req != null) {
152+
if (currentSpan.getSpanContext().isValid() && req != null) {
153153
currentSpan.setAttribute("pseudo.field", req.getName());
154154
currentSpan.setAttribute("pseudo.pattern", req.getPattern());
155155
currentSpan.setAttribute("pseudo.values.count", req.getValues() == null ? 0 : req.getValues().size());

src/main/java/no/ssb/dlp/pseudo/service/pseudo/PseudoField.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package no.ssb.dlp.pseudo.service.pseudo;
22

33
import com.google.common.base.Stopwatch;
4-
import io.micronaut.tracing.annotation.NewSpan;
4+
import io.opentelemetry.api.GlobalOpenTelemetry;
5+
import io.opentelemetry.api.trace.Tracer;
6+
import io.opentelemetry.context.Scope;
7+
import io.opentelemetry.instrumentation.annotations.AddingSpanAttributes;
8+
import io.opentelemetry.instrumentation.annotations.SpanAttribute;
59
import io.reactivex.Completable;
610
import io.reactivex.Flowable;
711
import lombok.AccessLevel;
@@ -16,6 +20,7 @@
1620
import no.ssb.dlp.pseudo.core.util.Json;
1721
import no.ssb.dlp.pseudo.service.pseudo.metadata.FieldMetric;
1822
import no.ssb.dlp.pseudo.service.pseudo.metadata.PseudoMetadataProcessor;
23+
import no.ssb.dlp.pseudo.service.tracing.WithSpan;
1924

2025
import java.util.List;
2126
import java.util.Map;
@@ -82,7 +87,7 @@ public PseudoField(String name, String pattern, String pseudoFunc, EncryptedKeys
8287
* @param values The values to be processed.
8388
* @return A Flowable stream that processes the field values by applying the configured pseudo rules, and returns them as a lists of strings.
8489
*/
85-
@NewSpan
90+
@WithSpan
8691
public Flowable<String> process(PseudoConfigSplitter pseudoConfigSplitter,
8792
RecordMapProcessorFactory recordProcessorFactory,
8893
List<String> values,
@@ -132,7 +137,7 @@ public Flowable<String> process(PseudoConfigSplitter pseudoConfigSplitter,
132137
* @param values The values to be processed.
133138
* @return A Flowable stream that processes the field values by applying the configured pseudo rules, and returns them as a lists of strings.
134139
*/
135-
@NewSpan
140+
@WithSpan
136141
public Flowable<String> process(RecordMapProcessorFactory recordProcessorFactory,
137142
List<String> values,
138143
PseudoField targetPseudoField,

src/main/java/no/ssb/dlp/pseudo/service/pseudo/PseudoSecrets.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package no.ssb.dlp.pseudo.service.pseudo;
22

33
import io.micronaut.context.annotation.Property;
4-
import io.micronaut.tracing.annotation.NewSpan;
54
import jakarta.inject.Singleton;
65
import no.ssb.dlp.pseudo.core.PseudoSecret;
76
import no.ssb.dlp.pseudo.service.secrets.SecretService;
7+
import no.ssb.dlp.pseudo.service.tracing.WithSpan;
88

99
import java.util.List;
1010
import java.util.Map;
@@ -48,7 +48,7 @@ public List<PseudoSecret> resolve() {
4848
* @param configuredPseudoSecrets a Map named pseudo secrets
4949
* @return a List of cleaned up, resolved pseudo secrets
5050
*/
51-
@NewSpan
51+
@WithSpan
5252
List<PseudoSecret> resolvePseudoSecrets(Map<String, PseudoSecret> configuredPseudoSecrets) {
5353
if (configuredPseudoSecrets == null) {
5454
return List.of();

src/main/java/no/ssb/dlp/pseudo/service/pseudo/RecordMapProcessorFactory.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@
22

33
import com.github.benmanes.caffeine.cache.LoadingCache;
44
import com.google.crypto.tink.Aead;
5-
import io.micronaut.tracing.annotation.NewSpan;
6-
import io.micronaut.tracing.annotation.SpanTag;
7-
import io.opentelemetry.api.trace.Span;
8-
import io.opentelemetry.api.trace.Tracer;
95
import jakarta.inject.Singleton;
106
import lombok.RequiredArgsConstructor;
117
import lombok.extern.slf4j.Slf4j;
@@ -32,6 +28,8 @@
3228
import no.ssb.dlp.pseudo.service.pseudo.metadata.FieldMetadata;
3329
import no.ssb.dlp.pseudo.service.pseudo.metadata.FieldMetric;
3430
import no.ssb.dlp.pseudo.service.pseudo.metadata.PseudoMetadataProcessor;
31+
import no.ssb.dlp.pseudo.service.tracing.SpanAttribute;
32+
import no.ssb.dlp.pseudo.service.tracing.WithSpan;
3533

3634
import java.util.Collection;
3735
import java.util.List;
@@ -49,10 +47,9 @@
4947
public class RecordMapProcessorFactory {
5048
private final PseudoSecrets pseudoSecrets;
5149
private final LoadingCache<String, Aead> aeadCache;
52-
private final Tracer tracer;
5350

54-
@NewSpan
55-
public RecordMapProcessor<PseudoMetadataProcessor> newPseudonymizeRecordProcessor(@SpanTag List<PseudoConfig> pseudoConfigs, String correlationId) {
51+
@WithSpan
52+
public RecordMapProcessor<PseudoMetadataProcessor> newPseudonymizeRecordProcessor(@SpanAttribute List<PseudoConfig> pseudoConfigs, String correlationId) {
5653
ValueInterceptorChain chain = new ValueInterceptorChain();
5754
PseudoMetadataProcessor metadataProcessor = new PseudoMetadataProcessor(correlationId);
5855

@@ -68,7 +65,7 @@ public RecordMapProcessor<PseudoMetadataProcessor> newPseudonymizeRecordProcesso
6865
return new RecordMapProcessor<>(chain, metadataProcessor);
6966
}
7067

71-
@NewSpan
68+
@WithSpan
7269
public RecordMapProcessor<PseudoMetadataProcessor> newDepseudonymizeRecordProcessor(List<PseudoConfig> pseudoConfigs, String correlationId) {
7370
ValueInterceptorChain chain = new ValueInterceptorChain();
7471
PseudoMetadataProcessor metadataProcessor = new PseudoMetadataProcessor(correlationId);
@@ -83,7 +80,7 @@ public RecordMapProcessor<PseudoMetadataProcessor> newDepseudonymizeRecordProces
8380
return new RecordMapProcessor<>(chain, metadataProcessor);
8481
}
8582

86-
@NewSpan
83+
@WithSpan
8784
public RecordMapProcessor<PseudoMetadataProcessor> newRepseudonymizeRecordProcessor(PseudoConfig sourcePseudoConfig,
8885
PseudoConfig targetPseudoConfig, String correlationId) {
8986
final PseudoFuncs fieldDepseudonymizer = newPseudoFuncs(sourcePseudoConfig.getRules(),
@@ -112,24 +109,22 @@ private String init(PseudoFuncs pseudoFuncs, TransformDirection direction, Field
112109
return varValue;
113110
}
114111

115-
private String process(PseudoOperation operation,
112+
@WithSpan
113+
protected String process(PseudoOperation operation,
116114
PseudoFuncs func,
117115
FieldDescriptor field,
118116
String varValue,
119117
PseudoMetadataProcessor metadataProcessor) {
120-
Span span = tracer.spanBuilder("process").startSpan();
121118
PseudoFuncRuleMatch match = func.findPseudoFunc(field).orElse(null);
122119

123120
if (match == null) {
124-
span.end();
125121
return varValue;
126122
}
127123
if (varValue == null) {
128124
// Avoid counting null values to map-sid twice (since map-sid consists of 2 functions)
129125
if (!(match.getFunc() instanceof MapFunc)) {
130126
metadataProcessor.addMetric(FieldMetric.NULL_VALUE);
131127
}
132-
span.end();
133128
return varValue;
134129
}
135130
try {
@@ -192,8 +187,6 @@ private String process(PseudoOperation operation,
192187
} catch (Exception e) {
193188
throw new PseudoException(String.format("pseudonymize error - field='%s', originalValue='%s'",
194189
field.getPath(), varValue), e);
195-
} finally {
196-
span.end();
197190
}
198191
}
199192

0 commit comments

Comments
 (0)