Skip to content

Commit c3e3fa0

Browse files
committed
gcp auth
1 parent 6f3a18a commit c3e3fa0

File tree

3 files changed

+204
-7
lines changed

3 files changed

+204
-7
lines changed

gcp-auth-extension/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ dependencies {
2020
compileOnly("com.google.auto.service:auto-service-annotations")
2121
compileOnly("io.opentelemetry:opentelemetry-api")
2222
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
23+
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator")
2324
compileOnly("io.opentelemetry:opentelemetry-exporter-otlp")
2425

2526
// Only dependencies added to `implementation` configuration will be picked up by Shadow plugin

gcp-auth-extension/src/main/java/io/opentelemetry/contrib/gcp/auth/GcpAuthAutoConfigurationCustomizerProvider.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,7 @@ public class GcpAuthAutoConfigurationCustomizerProvider
9696
*/
9797
@Override
9898
public void customize(@Nonnull AutoConfigurationCustomizer autoConfiguration) {
99-
GoogleCredentials credentials;
100-
try {
101-
credentials = GoogleCredentials.getApplicationDefault();
102-
} catch (IOException e) {
103-
throw new GoogleAuthException(Reason.FAILED_ADC_RETRIEVAL, e);
104-
}
99+
GoogleCredentials credentials = getCredentials();
105100
autoConfiguration
106101
.addSpanExporterCustomizer(
107102
(spanExporter, configProperties) ->
@@ -112,6 +107,16 @@ public void customize(@Nonnull AutoConfigurationCustomizer autoConfiguration) {
112107
.addResourceCustomizer(GcpAuthAutoConfigurationCustomizerProvider::customizeResource);
113108
}
114109

110+
static GoogleCredentials getCredentials() {
111+
GoogleCredentials credentials;
112+
try {
113+
credentials = GoogleCredentials.getApplicationDefault();
114+
} catch (IOException e) {
115+
throw new GoogleAuthException(Reason.FAILED_ADC_RETRIEVAL, e);
116+
}
117+
return credentials;
118+
}
119+
115120
@Override
116121
public int order() {
117122
return Integer.MAX_VALUE - 1;
@@ -193,7 +198,7 @@ private static MetricExporter addAuthorizationHeaders(
193198
return exporter;
194199
}
195200

196-
private static Map<String, String> getRequiredHeaderMap(
201+
static Map<String, String> getRequiredHeaderMap(
197202
GoogleCredentials credentials, ConfigProperties configProperties) {
198203
Map<String, List<String>> gcpHeaders;
199204
try {
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
package io.opentelemetry.contrib.gcp.auth;
2+
3+
import com.google.auth.oauth2.GoogleCredentials;
4+
import com.google.auto.service.AutoService;
5+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
6+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
7+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchLogRecordProcessorModel;
8+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchSpanProcessorModel;
9+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel;
10+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel;
13+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReaderModel;
14+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.NameStringValuePairModel;
15+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
16+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpGrpcExporterModel;
17+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpGrpcMetricExporterModel;
18+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpExporterModel;
19+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpMetricExporterModel;
20+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PushMetricExporterModel;
21+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleLogRecordProcessorModel;
22+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleSpanProcessorModel;
23+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel;
24+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
25+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
26+
import java.util.ArrayList;
27+
import java.util.List;
28+
import java.util.Map;
29+
30+
@AutoService(DeclarativeConfigurationCustomizerProvider.class)
31+
public class GcpAuthCustomizerProvider implements DeclarativeConfigurationCustomizerProvider {
32+
33+
@Override
34+
public void customize(DeclarativeConfigurationCustomizer customizer) {
35+
customizer.addModelCustomizer(
36+
model -> {
37+
GoogleCredentials credentials = GcpAuthAutoConfigurationCustomizerProvider.getCredentials();
38+
// todo pass config bridge
39+
Map<String, String> headerMap = GcpAuthAutoConfigurationCustomizerProvider.getRequiredHeaderMap(
40+
credentials, null);
41+
customizeMeter(model, headerMap);
42+
// todo are loggers supported now (not covered in old variant)?
43+
customizeLogger(model, headerMap);
44+
customizeTracer(model, headerMap);
45+
46+
return model;
47+
});
48+
}
49+
50+
private void customizeMeter(OpenTelemetryConfigurationModel model,
51+
Map<String, String> headerMap) {
52+
MeterProviderModel meterProvider = model.getMeterProvider();
53+
if (meterProvider == null) {
54+
return;
55+
}
56+
57+
for (MetricReaderModel reader : meterProvider.getReaders()) {
58+
if (reader.getPeriodic() != null) {
59+
addAuth(meterModelHeaders(reader.getPeriodic().getExporter()),
60+
headerMap);
61+
}
62+
}
63+
}
64+
65+
private List<List<NameStringValuePairModel>> meterModelHeaders(
66+
PushMetricExporterModel exporter) {
67+
ArrayList<List<NameStringValuePairModel>> list = new ArrayList<>();
68+
if (exporter == null) {
69+
return list;
70+
}
71+
OtlpGrpcMetricExporterModel grpc = exporter.getOtlpGrpc();
72+
if (grpc != null) {
73+
list.add(grpc.getHeaders());
74+
}
75+
OtlpHttpMetricExporterModel http = exporter.getOtlpHttp();
76+
if (http != null) {
77+
list.add(http.getHeaders());
78+
}
79+
return list;
80+
}
81+
82+
private void customizeLogger(OpenTelemetryConfigurationModel model,
83+
Map<String, String> headerMap) {
84+
LoggerProviderModel loggerProvider = model.getLoggerProvider();
85+
if (loggerProvider == null) {
86+
return;
87+
}
88+
for (LogRecordProcessorModel processor : loggerProvider.getProcessors()) {
89+
BatchLogRecordProcessorModel batch = processor.getBatch();
90+
if (batch != null) {
91+
addAuth(logRecordModelHeaders(batch.getExporter()),
92+
headerMap);
93+
}
94+
SimpleLogRecordProcessorModel simple = processor.getSimple();
95+
if (simple != null) {
96+
addAuth(logRecordModelHeaders(simple.getExporter()),
97+
headerMap);
98+
}
99+
}
100+
}
101+
102+
private List<List<NameStringValuePairModel>> logRecordModelHeaders(
103+
LogRecordExporterModel exporter) {
104+
ArrayList<List<NameStringValuePairModel>> list = new ArrayList<>();
105+
106+
if (exporter == null) {
107+
return list;
108+
}
109+
OtlpGrpcExporterModel grpc = exporter.getOtlpGrpc();
110+
if (grpc != null) {
111+
list.add(grpc.getHeaders());
112+
}
113+
OtlpHttpExporterModel http = exporter.getOtlpHttp();
114+
if (http != null) {
115+
list.add(http.getHeaders());
116+
}
117+
return list;
118+
}
119+
120+
private void customizeTracer(OpenTelemetryConfigurationModel model,
121+
Map<String, String> headerMap) {
122+
TracerProviderModel tracerProvider = model.getTracerProvider();
123+
if (tracerProvider == null) {
124+
return;
125+
}
126+
127+
// todo here we would want a simplified version of the declarative config bridge
128+
// https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/DeclarativeConfigPropertiesBridge.java
129+
// googleNode(model)
130+
131+
// if (!isSignalTargeted(SIGNAL_TYPE_TRACES, configProperties)) {
132+
// todo
133+
// String[] params = {SIGNAL_TYPE_TRACES, SIGNAL_TARGET_WARNING_FIX_SUGGESTION};
134+
// logger.log(
135+
// Level.WARNING,
136+
// "GCP Authentication Extension is not configured for signal type: {0}. {1}",
137+
// params);
138+
// return;
139+
// }
140+
141+
for (SpanProcessorModel processor : tracerProvider.getProcessors()) {
142+
BatchSpanProcessorModel batch = processor.getBatch();
143+
if (batch != null) {
144+
addAuth(spanExporterModelHeaders(batch.getExporter()),
145+
headerMap);
146+
}
147+
SimpleSpanProcessorModel simple = processor.getSimple();
148+
if (simple != null) {
149+
addAuth(spanExporterModelHeaders(simple.getExporter()),
150+
headerMap);
151+
}
152+
}
153+
}
154+
155+
private void googleNode(OpenTelemetryConfigurationModel model) {
156+
// todo use declarative config bridge
157+
}
158+
159+
private List<List<NameStringValuePairModel>> spanExporterModelHeaders(
160+
SpanExporterModel exporter) {
161+
ArrayList<List<NameStringValuePairModel>> list = new ArrayList<>();
162+
163+
if (exporter == null) {
164+
return list;
165+
}
166+
OtlpGrpcExporterModel grpc = exporter.getOtlpGrpc();
167+
if (grpc != null) {
168+
list.add(grpc.getHeaders());
169+
}
170+
OtlpHttpExporterModel http = exporter.getOtlpHttp();
171+
if (http != null) {
172+
list.add(http.getHeaders());
173+
}
174+
return list;
175+
}
176+
177+
private void addAuth(
178+
List<List<NameStringValuePairModel>> headerConsumers, Map<String, String> headerMap) {
179+
headerConsumers.forEach(
180+
headers -> addHeaders(headers, headerMap));
181+
}
182+
183+
private void addHeaders(List<NameStringValuePairModel> headers, Map<String, String> add) {
184+
add.forEach(
185+
(key, value) -> {
186+
if (headers.stream().noneMatch(header -> key.equals(header.getName()))) {
187+
headers.add(new NameStringValuePairModel().withName(key).withValue(value));
188+
}
189+
});
190+
}
191+
}

0 commit comments

Comments
 (0)