|
6 | 6 | package io.opentelemetry.instrumentation.api.internal; |
7 | 7 |
|
8 | 8 | import com.google.errorprone.annotations.CanIgnoreReturnValue; |
| 9 | +import io.opentelemetry.api.common.AttributesBuilder; |
9 | 10 | import io.opentelemetry.api.trace.SpanKind; |
10 | 11 | import io.opentelemetry.context.Context; |
11 | 12 | import io.opentelemetry.context.propagation.TextMapGetter; |
12 | 13 | import io.opentelemetry.context.propagation.TextMapSetter; |
| 14 | +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; |
13 | 15 | import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; |
14 | 16 | import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; |
15 | 17 | import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; |
| 18 | +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; |
| 19 | +import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor; |
16 | 20 | import java.time.Instant; |
| 21 | +import java.util.function.Function; |
| 22 | +import java.util.function.UnaryOperator; |
17 | 23 | import javax.annotation.Nullable; |
18 | 24 |
|
19 | 25 | /** |
@@ -85,5 +91,72 @@ InstrumenterBuilder<REQUEST, RESPONSE> propagateOperationListenersToOnEnd( |
85 | 91 | return builder; |
86 | 92 | } |
87 | 93 |
|
| 94 | + public static <REQUESTFROM, RESPONSEFROM, REQUESTTO, RESPONSETO> |
| 95 | + UnaryOperator<SpanStatusExtractor<REQUESTTO, RESPONSETO>> convertSpanStatusExtractor( |
| 96 | + UnaryOperator<SpanStatusExtractor<REQUESTFROM, RESPONSEFROM>> extractor, |
| 97 | + Function<REQUESTFROM, REQUESTTO> requestConverter, |
| 98 | + Function<RESPONSEFROM, RESPONSETO> responseConverter, |
| 99 | + Function<REQUESTTO, REQUESTFROM> requestReverseConverter, |
| 100 | + Function<RESPONSETO, RESPONSEFROM> responseReverseConverter) { |
| 101 | + return inputExtractor -> { |
| 102 | + SpanStatusExtractor<REQUESTFROM, RESPONSEFROM> outputExtractor = |
| 103 | + extractor.apply( |
| 104 | + (spanStatusBuilder, requestFrom, responseFrom, error) -> |
| 105 | + inputExtractor.extract( |
| 106 | + spanStatusBuilder, |
| 107 | + requestConverter.apply(requestFrom), |
| 108 | + responseFrom == null ? null : responseConverter.apply(responseFrom), |
| 109 | + error)); |
| 110 | + return (spanStatusBuilder, requestTo, responseTo, error) -> |
| 111 | + outputExtractor.extract( |
| 112 | + spanStatusBuilder, |
| 113 | + requestReverseConverter.apply(requestTo), |
| 114 | + responseTo == null ? null : responseReverseConverter.apply(responseTo), |
| 115 | + error); |
| 116 | + }; |
| 117 | + } |
| 118 | + |
| 119 | + public static <REQUESTFROM, REQUESTTO> |
| 120 | + UnaryOperator<SpanNameExtractor<REQUESTTO>> convertSpanNameExtractor( |
| 121 | + UnaryOperator<SpanNameExtractor<REQUESTFROM>> extractor, |
| 122 | + Function<REQUESTFROM, REQUESTTO> requestConverter, |
| 123 | + Function<REQUESTTO, REQUESTFROM> requestReverseConverter) { |
| 124 | + return inputExtractor -> { |
| 125 | + SpanNameExtractor<REQUESTFROM> outputExtractor = |
| 126 | + extractor.apply( |
| 127 | + requestFrom -> inputExtractor.extract(requestConverter.apply(requestFrom))); |
| 128 | + return requestTo -> outputExtractor.extract(requestReverseConverter.apply(requestTo)); |
| 129 | + }; |
| 130 | + } |
| 131 | + |
| 132 | + public static <REQUESTFROM, RESPONSEFROM, REQUESTTO, RESPONSETO> |
| 133 | + AttributesExtractor<REQUESTTO, RESPONSETO> convertAttributesExtractor( |
| 134 | + AttributesExtractor<REQUESTFROM, RESPONSEFROM> extractor, |
| 135 | + Function<REQUESTTO, REQUESTFROM> requestConverter, |
| 136 | + Function<RESPONSETO, RESPONSEFROM> responseConverter) { |
| 137 | + return new AttributesExtractor<REQUESTTO, RESPONSETO>() { |
| 138 | + @Override |
| 139 | + public void onStart( |
| 140 | + AttributesBuilder attributes, Context parentContext, REQUESTTO requestTo) { |
| 141 | + extractor.onStart(attributes, parentContext, requestConverter.apply(requestTo)); |
| 142 | + } |
| 143 | + |
| 144 | + @Override |
| 145 | + public void onEnd( |
| 146 | + AttributesBuilder attributes, |
| 147 | + Context context, |
| 148 | + REQUESTTO requestTo, |
| 149 | + @Nullable RESPONSETO responseTo, |
| 150 | + @Nullable Throwable error) { |
| 151 | + extractor.onEnd( |
| 152 | + attributes, |
| 153 | + context, |
| 154 | + requestConverter.apply(requestTo), |
| 155 | + responseConverter.apply(responseTo), |
| 156 | + error); |
| 157 | + } |
| 158 | + }; |
| 159 | + } |
| 160 | + |
88 | 161 | private InstrumenterUtil() {} |
89 | 162 | } |
0 commit comments