Skip to content

Commit e625365

Browse files
authored
Bump config with nullable service name, multiple propagations and OPA (#119)
* Bump config with nullable service name, multiple propagations and OPA Signed-off-by: Pavol Loffay <[email protected]> * support all Signed-off-by: Pavol Loffay <[email protected]> * remove Signed-off-by: Pavol Loffay <[email protected]> * foo Signed-off-by: Pavol Loffay <[email protected]> * revert zipkin sv name Signed-off-by: Pavol Loffay <[email protected]> * Fix Signed-off-by: Pavol Loffay <[email protected]>
1 parent 312d34e commit e625365

File tree

10 files changed

+162
-18
lines changed

10 files changed

+162
-18
lines changed

filter-custom-opa/build.gradle.kts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
plugins {
2-
java
2+
`java-library`
33
}
44

55
dependencies {
66
implementation(project(":filter-api"))
77
implementation("org.slf4j:slf4j-api:1.7.30")
88
implementation("com.squareup.okhttp3:okhttp:3.14.9")
9-
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
109
implementation("com.fasterxml.jackson.core:jackson-databind:2.11.3")
1110
implementation("com.google.auto.service:auto-service:1.0-rc7")
1211
annotationProcessor("com.google.auto.service:auto-service:1.0-rc7")

filter-custom-opa/src/main/java/org/hypertrace/agent/filter/opa/custom/CustomOpaLibProvider.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
package org.hypertrace.agent.filter.opa.custom;
1818

1919
import com.google.auto.service.AutoService;
20+
import org.hypertrace.agent.config.Config.AgentConfig;
21+
import org.hypertrace.agent.config.Config.Reporting;
2022
import org.hypertrace.agent.core.EnvironmentConfig;
23+
import org.hypertrace.agent.core.HypertraceConfig;
2124
import org.hypertrace.agent.filter.FilterRegistry;
2225
import org.hypertrace.agent.filter.api.Filter;
2326
import org.hypertrace.agent.filter.spi.FilterProvider;
@@ -35,11 +38,12 @@ public CustomOpaLibProvider() {
3538

3639
@Override
3740
public Filter create() {
38-
String endpoint = EnvironmentConfig.getProperty("hypertrace.opa.endpoint");
39-
String token = EnvironmentConfig.getProperty("hypertrace.reporting.token");
40-
String pullInterval = EnvironmentConfig.getProperty("hypertrace.opa.pull_interval");
41-
String skipVerify = EnvironmentConfig.getProperty("hypertrace.opa.skip_verify");
41+
AgentConfig agentConfig = HypertraceConfig.get();
42+
Reporting reporting = agentConfig.getReporting();
4243
return new CustomOpaLib(
43-
endpoint, token, Boolean.parseBoolean(skipVerify), Integer.parseInt(pullInterval));
44+
reporting.getOpa().getAddress().getValue(),
45+
reporting.getToken().getValue(),
46+
reporting.getSecure().getValue(),
47+
reporting.getOpa().getPollPeriod().getValue());
4448
}
4549
}

javaagent-core/src/main/java/org/hypertrace/agent/core/EnvironmentConfig.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
1717
package org.hypertrace.agent.core;
1818

1919
import com.google.protobuf.BoolValue;
20+
import com.google.protobuf.Int32Value;
2021
import com.google.protobuf.StringValue;
2122
import org.hypertrace.agent.config.Config.AgentConfig;
2223
import org.hypertrace.agent.config.Config.DataCapture;
2324
import org.hypertrace.agent.config.Config.Message;
25+
import org.hypertrace.agent.config.Config.Opa;
26+
import org.hypertrace.agent.config.Config.Opa.Builder;
27+
import org.hypertrace.agent.config.Config.PropagationFormat;
2428
import org.hypertrace.agent.config.Config.Reporting;
2529

2630
public class EnvironmentConfig {
@@ -32,10 +36,16 @@ private EnvironmentConfig() {}
3236
public static final String CONFIG_FILE_PROPERTY = HT_PREFIX + "config.file";
3337
static final String SERVICE_NAME = HT_PREFIX + "service.name";
3438

39+
static final String PROPAGATION_FORMATS = HT_PREFIX + "propagation_formats";
40+
3541
private static final String REPORTING_PREFIX = HT_PREFIX + "reporting.";
3642
static final String REPORTING_ADDRESS = REPORTING_PREFIX + "address";
3743
static final String REPORTING_SECURE = REPORTING_PREFIX + "secure";
3844

45+
private static final String OPA_PREFIX = REPORTING_PREFIX + "opa.";
46+
static final String OPA_ADDRESS = OPA_PREFIX + "address";
47+
static final String OPA_POLL_PERIOD = OPA_PREFIX + "poll.period";
48+
3949
private static final String CAPTURE_PREFIX = HT_PREFIX + "data.capture.";
4050
public static final String CAPTURE_HTTP_HEADERS_PREFIX = CAPTURE_PREFIX + "http.headers.";
4151
public static final String CAPTURE_HTTP_BODY_PREFIX = CAPTURE_PREFIX + "http.body.";
@@ -45,7 +55,7 @@ private EnvironmentConfig() {}
4555
public static AgentConfig.Builder applyPropertiesAndEnvVars(AgentConfig.Builder builder) {
4656
String serviceName = getProperty(SERVICE_NAME);
4757
if (serviceName != null) {
48-
builder.setServiceName(serviceName);
58+
builder.setServiceName(StringValue.newBuilder().setValue(serviceName).build());
4959
}
5060

5161
Reporting.Builder reportingBuilder = applyReporting(builder.getReporting().toBuilder());
@@ -54,9 +64,20 @@ public static AgentConfig.Builder applyPropertiesAndEnvVars(AgentConfig.Builder
5464
DataCapture.Builder dataCaptureBuilder =
5565
setDefaultsToDataCapture(builder.getDataCapture().toBuilder());
5666
builder.setDataCapture(dataCaptureBuilder);
67+
applyPropagationFormat(builder);
5768
return builder;
5869
}
5970

71+
private static void applyPropagationFormat(AgentConfig.Builder builder) {
72+
String propagationFormats = getProperty(PROPAGATION_FORMATS);
73+
if (propagationFormats != null) {
74+
String[] formats = propagationFormats.split(",");
75+
for (String format : formats) {
76+
builder.addPropagationFormats(PropagationFormat.valueOf(format));
77+
}
78+
}
79+
}
80+
6081
private static Reporting.Builder applyReporting(Reporting.Builder builder) {
6182
String reporterAddress = getProperty(REPORTING_ADDRESS);
6283
if (reporterAddress != null) {
@@ -66,7 +87,20 @@ private static Reporting.Builder applyReporting(Reporting.Builder builder) {
6687
if (secure != null) {
6788
builder.setSecure(BoolValue.newBuilder().setValue(Boolean.valueOf(secure)).build());
6889
}
90+
Builder opaBuilder = applyOpa(builder.getOpa().toBuilder());
91+
builder.setOpa(opaBuilder);
92+
return builder;
93+
}
6994

95+
private static Opa.Builder applyOpa(Opa.Builder builder) {
96+
String address = getProperty(OPA_ADDRESS);
97+
if (address != null) {
98+
builder.setAddress(StringValue.newBuilder().setValue(address).build());
99+
}
100+
String pollPeriod = getProperty(OPA_POLL_PERIOD);
101+
if (pollPeriod != null) {
102+
builder.setPollPeriod(Int32Value.newBuilder().setValue(Integer.parseInt(pollPeriod)).build());
103+
}
70104
return builder;
71105
}
72106

javaagent-core/src/main/java/org/hypertrace/agent/core/HypertraceConfig.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
2121
import com.google.common.annotations.VisibleForTesting;
2222
import com.google.protobuf.BoolValue;
23+
import com.google.protobuf.Int32Value;
2324
import com.google.protobuf.StringValue;
2425
import com.google.protobuf.util.JsonFormat;
2526
import java.io.File;
@@ -29,6 +30,9 @@
2930
import org.hypertrace.agent.config.Config.AgentConfig;
3031
import org.hypertrace.agent.config.Config.DataCapture;
3132
import org.hypertrace.agent.config.Config.Message;
33+
import org.hypertrace.agent.config.Config.Opa;
34+
import org.hypertrace.agent.config.Config.Opa.Builder;
35+
import org.hypertrace.agent.config.Config.PropagationFormat;
3236
import org.hypertrace.agent.config.Config.Reporting;
3337

3438
/** {@link HypertraceConfig} loads a yaml config from file. */
@@ -38,8 +42,10 @@ private HypertraceConfig() {}
3842

3943
private static AgentConfig agentConfig;
4044

45+
static final String DEFAULT_SERVICE_NAME = "unknown";
4146
static final String DEFAULT_REPORTING_ADDRESS = "http://localhost:9411/api/v2/spans";
42-
static final String DEFAULT_SERVICE_NAME = "default_service_name";
47+
static final String DEFAULT_OPA_ADDRESS = "http://opa.traceableai:8181/";
48+
static final int DEFAULT_OPA_POLL_PERIOD_SECONDS = 30;
4349

4450
public static AgentConfig get() {
4551
if (agentConfig == null) {
@@ -104,8 +110,8 @@ static AgentConfig load(String filename) throws IOException {
104110
}
105111

106112
private static AgentConfig.Builder applyDefaults(AgentConfig.Builder configBuilder) {
107-
if (configBuilder.getServiceName().isEmpty()) {
108-
configBuilder.setServiceName(DEFAULT_SERVICE_NAME);
113+
if (configBuilder.getServiceName().getValue().isEmpty()) {
114+
configBuilder.setServiceName(StringValue.newBuilder().setValue(DEFAULT_SERVICE_NAME).build());
109115
}
110116

111117
Reporting.Builder reportingBuilder =
@@ -115,13 +121,30 @@ private static AgentConfig.Builder applyDefaults(AgentConfig.Builder configBuild
115121
DataCapture.Builder dataCaptureBuilder =
116122
setDefaultsToDataCapture(configBuilder.getDataCapture().toBuilder());
117123
configBuilder.setDataCapture(dataCaptureBuilder);
124+
125+
if (configBuilder.getPropagationFormatsList().isEmpty()) {
126+
configBuilder.addPropagationFormats(PropagationFormat.TRACE_CONTEXT);
127+
}
118128
return configBuilder;
119129
}
120130

121131
private static Reporting.Builder applyReportingDefaults(Reporting.Builder builder) {
122132
if (!builder.hasAddress()) {
123133
builder.setAddress(StringValue.newBuilder().setValue(DEFAULT_REPORTING_ADDRESS).build());
124134
}
135+
Builder opaBuilder = applyOpaDefaults(builder.getOpa().toBuilder());
136+
builder.setOpa(opaBuilder);
137+
return builder;
138+
}
139+
140+
private static Opa.Builder applyOpaDefaults(Opa.Builder builder) {
141+
if (!builder.hasAddress()) {
142+
builder.setAddress(StringValue.newBuilder().setValue(DEFAULT_OPA_ADDRESS).build());
143+
}
144+
if (!builder.hasPollPeriod()) {
145+
builder.setPollPeriod(
146+
Int32Value.newBuilder().setValue(DEFAULT_OPA_POLL_PERIOD_SECONDS).build());
147+
}
125148
return builder;
126149
}
127150

javaagent-core/src/test/java/org/hypertrace/agent/core/EnvironmentConfigTest.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package org.hypertrace.agent.core;
1818

1919
import com.google.protobuf.StringValue;
20+
import java.util.Arrays;
2021
import org.hypertrace.agent.config.Config.AgentConfig;
22+
import org.hypertrace.agent.config.Config.PropagationFormat;
2123
import org.junit.jupiter.api.Assertions;
2224
import org.junit.jupiter.api.Test;
2325
import org.junitpioneer.jupiter.ClearSystemProperty;
@@ -27,20 +29,32 @@ class EnvironmentConfigTest {
2729
@Test
2830
@ClearSystemProperty(key = EnvironmentConfig.REPORTING_ADDRESS)
2931
@ClearSystemProperty(key = EnvironmentConfig.REPORTING_SECURE)
32+
@ClearSystemProperty(key = EnvironmentConfig.OPA_ADDRESS)
33+
@ClearSystemProperty(key = EnvironmentConfig.OPA_POLL_PERIOD)
34+
@ClearSystemProperty(key = EnvironmentConfig.PROPAGATION_FORMATS)
3035
@ClearSystemProperty(key = EnvironmentConfig.CAPTURE_HTTP_BODY_PREFIX + "request")
3136
public void systemProperties() {
3237
// when tests are run in parallel the env vars/sys props set it junit-pioneer are visible to
3338
// parallel tests
3439
System.setProperty(EnvironmentConfig.REPORTING_ADDRESS, "http://:-)");
3540
System.setProperty(EnvironmentConfig.REPORTING_SECURE, "true");
3641
System.setProperty(EnvironmentConfig.CAPTURE_HTTP_BODY_PREFIX + "request", "true");
42+
System.setProperty(EnvironmentConfig.OPA_ADDRESS, "http://azkaban:9090");
43+
System.setProperty(EnvironmentConfig.OPA_POLL_PERIOD, "10");
44+
System.setProperty(EnvironmentConfig.PROPAGATION_FORMATS, "B3,TRACE_CONTEXT");
3745

3846
AgentConfig.Builder configBuilder = AgentConfig.newBuilder();
39-
configBuilder.setServiceName(StringValue.newBuilder().setValue("foo").getValue());
47+
configBuilder.setServiceName(StringValue.newBuilder().setValue("foo"));
4048

4149
AgentConfig agentConfig = EnvironmentConfig.applyPropertiesAndEnvVars(configBuilder).build();
42-
Assertions.assertEquals("foo", agentConfig.getServiceName());
50+
Assertions.assertEquals("foo", agentConfig.getServiceName().getValue());
51+
Assertions.assertEquals(
52+
Arrays.asList(PropagationFormat.B3, PropagationFormat.TRACE_CONTEXT),
53+
agentConfig.getPropagationFormatsList());
4354
Assertions.assertEquals("http://:-)", agentConfig.getReporting().getAddress().getValue());
55+
Assertions.assertEquals(
56+
"http://azkaban:9090", agentConfig.getReporting().getOpa().getAddress().getValue());
57+
Assertions.assertEquals(10, agentConfig.getReporting().getOpa().getPollPeriod().getValue());
4458
Assertions.assertEquals(true, agentConfig.getReporting().getSecure().getValue());
4559
Assertions.assertEquals(
4660
true, agentConfig.getDataCapture().getHttpBody().getRequest().getValue());

javaagent-core/src/test/java/org/hypertrace/agent/core/HypertraceConfigTest.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818

1919
import java.io.IOException;
2020
import java.net.URL;
21+
import java.util.Arrays;
2122
import org.hypertrace.agent.config.Config.AgentConfig;
23+
import org.hypertrace.agent.config.Config.PropagationFormat;
2224
import org.junit.jupiter.api.Assertions;
2325
import org.junit.jupiter.api.Test;
2426
import org.junitpioneer.jupiter.ClearSystemProperty;
@@ -29,11 +31,19 @@ public class HypertraceConfigTest {
2931
public void defaultValues() throws IOException {
3032
URL resource = getClass().getClassLoader().getResource("emptyconfig.yaml");
3133
AgentConfig agentConfig = HypertraceConfig.load(resource.getPath());
32-
Assertions.assertEquals("default_service_name", agentConfig.getServiceName());
34+
Assertions.assertEquals("unknown", agentConfig.getServiceName().getValue());
3335
Assertions.assertEquals(
3436
HypertraceConfig.DEFAULT_REPORTING_ADDRESS,
3537
agentConfig.getReporting().getAddress().getValue());
38+
Assertions.assertEquals(
39+
Arrays.asList(PropagationFormat.TRACE_CONTEXT), agentConfig.getPropagationFormatsList());
3640
Assertions.assertEquals(false, agentConfig.getReporting().getSecure().getValue());
41+
Assertions.assertEquals(
42+
HypertraceConfig.DEFAULT_OPA_ADDRESS,
43+
agentConfig.getReporting().getOpa().getAddress().getValue());
44+
Assertions.assertEquals(
45+
HypertraceConfig.DEFAULT_OPA_POLL_PERIOD_SECONDS,
46+
agentConfig.getReporting().getOpa().getPollPeriod().getValue());
3747
Assertions.assertEquals(
3848
true, agentConfig.getDataCapture().getHttpHeaders().getRequest().getValue());
3949
Assertions.assertEquals(
@@ -56,10 +66,15 @@ public void defaultValues() throws IOException {
5666
public void config() throws IOException {
5767
URL resource = getClass().getClassLoader().getResource("config.yaml");
5868
AgentConfig agentConfig = HypertraceConfig.load(resource.getPath());
59-
Assertions.assertEquals("service", agentConfig.getServiceName());
69+
Assertions.assertEquals("service", agentConfig.getServiceName().getValue());
70+
Assertions.assertEquals(
71+
Arrays.asList(PropagationFormat.B3), agentConfig.getPropagationFormatsList());
6072
Assertions.assertEquals(
6173
"http://localhost:9411", agentConfig.getReporting().getAddress().getValue());
6274
Assertions.assertEquals(true, agentConfig.getReporting().getSecure().getValue());
75+
Assertions.assertEquals(
76+
"http://opa.localhost:8181/", agentConfig.getReporting().getOpa().getAddress().getValue());
77+
Assertions.assertEquals(12, agentConfig.getReporting().getOpa().getPollPeriod().getValue());
6378
Assertions.assertEquals(
6479
true, agentConfig.getDataCapture().getHttpHeaders().getRequest().getValue());
6580
Assertions.assertEquals(
@@ -79,6 +94,6 @@ public void configWithSystemProps() throws IOException {
7994
AgentConfig agentConfig = HypertraceConfig.load(resource.getPath());
8095
Assertions.assertEquals(
8196
"http://nowhere.here", agentConfig.getReporting().getAddress().getValue());
82-
Assertions.assertEquals("service", agentConfig.getServiceName());
97+
Assertions.assertEquals("service", agentConfig.getServiceName().getValue());
8398
}
8499
}

javaagent-core/src/test/resources/config.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
serviceName: service
2+
propagationFormats:
3+
- B3
24
reporting:
35
address: http://localhost:9411
46
secure: true
7+
opa:
8+
address: http://opa.localhost:8181/
9+
pollPeriod: 12
510
dataCapture:
611
httpHeaders:
712
request: true

javaagent/src/main/java/org/hypertrace/agent/instrument/HypertraceAgent.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,19 @@
1616

1717
package org.hypertrace.agent.instrument;
1818

19+
import com.google.common.annotations.VisibleForTesting;
1920
import io.opentelemetry.javaagent.OpenTelemetryAgent;
2021
import java.lang.instrument.Instrumentation;
22+
import java.util.List;
23+
import java.util.stream.Collectors;
2124
import org.hypertrace.agent.config.Config.AgentConfig;
25+
import org.hypertrace.agent.config.Config.PropagationFormat;
2226
import org.hypertrace.agent.core.HypertraceConfig;
2327

2428
public class HypertraceAgent {
2529
// https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/sdk-environment-variables.md
2630
private static final String OTEL_EXPORTER = "otel.exporter";
31+
private static final String OTEL_PROPAGATORS = "otel.propagators";
2732
private static final String OTEL_EXPORTER_ZIPKIN_ENDPOINT = "otel.exporter.zipkin.endpoint";
2833
private static final String OTEL_EXPORTER_ZIPKIN_SERVICE_NAME =
2934
"otel.exporter.zipkin.service.name";
@@ -44,8 +49,20 @@ public static void agentmain(String agentArgs, Instrumentation inst) {
4449
private static void setDefaultConfig() {
4550
AgentConfig agentConfig = HypertraceConfig.get();
4651
OpenTelemetryConfig.setDefault(OTEL_EXPORTER, "zipkin");
52+
OpenTelemetryConfig.setDefault(
53+
OTEL_EXPORTER_ZIPKIN_SERVICE_NAME, agentConfig.getServiceName().getValue());
54+
OpenTelemetryConfig.setDefault(
55+
OTEL_PROPAGATORS, toOtelPropagators(agentConfig.getPropagationFormatsList()));
4756
OpenTelemetryConfig.setDefault(
4857
OTEL_EXPORTER_ZIPKIN_ENDPOINT, agentConfig.getReporting().getAddress().getValue());
49-
OpenTelemetryConfig.setDefault(OTEL_EXPORTER_ZIPKIN_SERVICE_NAME, agentConfig.getServiceName());
58+
OpenTelemetryConfig.setDefault(
59+
OTEL_EXPORTER_ZIPKIN_SERVICE_NAME, agentConfig.getServiceName().getValue());
60+
}
61+
62+
@VisibleForTesting
63+
static String toOtelPropagators(List<PropagationFormat> propagationFormats) {
64+
return propagationFormats.stream()
65+
.map(v -> v.name().toLowerCase().replaceAll("_", ""))
66+
.collect(Collectors.joining(","));
5067
}
5168
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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.instrument;
18+
19+
import java.util.Arrays;
20+
import java.util.List;
21+
import org.hypertrace.agent.config.Config.PropagationFormat;
22+
import org.junit.jupiter.api.Assertions;
23+
import org.junit.jupiter.api.Test;
24+
25+
public class HypertraceAgentTest {
26+
27+
@Test
28+
public void propagationFormatList() {
29+
List<PropagationFormat> formats =
30+
Arrays.asList(PropagationFormat.B3, PropagationFormat.TRACE_CONTEXT);
31+
Assertions.assertEquals("b3,tracecontext", HypertraceAgent.toOtelPropagators(formats));
32+
}
33+
}

0 commit comments

Comments
 (0)