Skip to content

Commit bc729df

Browse files
committed
refactor metadata to use otel api
1 parent 6d4cdb5 commit bc729df

File tree

6 files changed

+95
-21
lines changed

6 files changed

+95
-21
lines changed

core/pom.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@
3838
<type>pom</type>
3939
<scope>import</scope>
4040
</dependency>
41+
<dependency>
42+
<groupId>io.opentelemetry</groupId>
43+
<artifactId>opentelemetry-bom</artifactId>
44+
<version>1.59.0</version>
45+
<type>pom</type>
46+
<scope>import</scope>
47+
</dependency>
4148
</dependencies>
4249
</dependencyManagement>
4350
<dependencies>
@@ -46,6 +53,19 @@
4653
<artifactId>logging</artifactId>
4754
<version>${revision}</version>
4855
</dependency>
56+
<dependency>
57+
<groupId>io.opentelemetry</groupId>
58+
<artifactId>opentelemetry-api</artifactId>
59+
</dependency>
60+
<dependency>
61+
<groupId>io.opentelemetry</groupId>
62+
<artifactId>opentelemetry-context</artifactId>
63+
</dependency>
64+
<dependency>
65+
<groupId>javax.xml.bind</groupId>
66+
<artifactId>jaxb-api</artifactId>
67+
<version>2.3.1</version>
68+
</dependency>
4969
<dependency>
5070
<groupId>com.solarwinds.joboe</groupId>
5171
<artifactId>config</artifactId>

core/src/main/java/com/solarwinds/joboe/core/Context.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010
import com.solarwinds.joboe.sampling.SettingsArg;
1111
import com.solarwinds.joboe.sampling.SettingsArgChangeListener;
1212
import com.solarwinds.joboe.sampling.SettingsManager;
13+
import io.opentelemetry.api.GlobalOpenTelemetry;
14+
import io.opentelemetry.api.trace.Span;
15+
import io.opentelemetry.api.trace.SpanContext;
16+
import io.opentelemetry.api.trace.Tracer;
17+
18+
import java.util.Arrays;
1319

1420
public class Context {
1521
private static final ThreadLocal<Boolean> skipInheritingContextThreadLocal = new ThreadLocal<Boolean>();
@@ -52,11 +58,6 @@ public void onChange(Boolean newValue) {
5258
});
5359
}
5460

55-
public static Event startTrace() {
56-
getMetadata().randomize(true);
57-
return createEventWithContext(getMetadata(), false); //do not add edge on trace start
58-
}
59-
6061
public static Event createEvent() {
6162
return createEventWithContext(getMetadata(), true);
6263
}
@@ -122,31 +123,55 @@ private static boolean shouldCreateEvent(Metadata context) {
122123
* Returns metadata for current thread
123124
*/
124125
public static Metadata getMetadata() {
125-
return mdThreadLocal.get();
126+
Metadata md = mdThreadLocal.get();
127+
if (Arrays.equals(md.getTaskID(), Metadata.unsetTaskID)) {
128+
SpanContext sc = Span.current().getSpanContext();
129+
if (sc.isValid()) {
130+
return new Metadata(sc);
131+
}
132+
}
133+
return md;
126134
}
127135

128136
/**
129-
* Sets metadata for current thread
137+
* Sets metadata for current thread.
138+
* <p>
139+
* <b>Note:</b> This sets the metadata in the local thread storage only. It does NOT update the OpenTelemetry context.
140+
* To propagate context via OpenTelemetry, please use {@code io.opentelemetry.context.Context.makeCurrent()}.
141+
* </p>
130142
* @param md
143+
* @deprecated Use OpenTelemetry Context propagation instead.
131144
*/
145+
@Deprecated
132146
public static void setMetadata(Metadata md) {
133147
setMap(md);
134148
}
135149

136150
/**
137-
* Sets metadata for this thread from
151+
* Sets metadata for this thread from hex string
152+
* <p>
153+
* <b>Note:</b> This sets the metadata in the local thread storage only. It does NOT update the OpenTelemetry context.
154+
* To propagate context via OpenTelemetry, please use {@code io.opentelemetry.context.Context.makeCurrent()}.
155+
* </p>
138156
* @param hexStr
139-
* @throws OboeException
157+
* @throws SamplingException
158+
* @deprecated Use OpenTelemetry Context propagation instead.
140159
*/
160+
@Deprecated
141161
public static void setMetadata(String hexStr) throws SamplingException {
142162
Metadata md = new Metadata();
143163
md.fromHexString(hexStr);
144164
setMap(md);
145165
}
146166

147167
/**
148-
* Clears metadata for current thread
168+
* Clears metadata for current thread.
169+
* <p>
170+
* <b>Note:</b> This only clears the local thread storage. It does not affect any active OpenTelemetry Scope.
171+
* </p>
172+
* @deprecated Use OpenTelemetry Context propagation instead.
149173
*/
174+
@Deprecated
150175
public static void clearMetadata() {
151176
setMap(new Metadata());
152177
}

core/src/test/java/com/solarwinds/joboe/core/EventImplTest.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public void testEventReport() throws Exception {
186186
public void testOversizedEvent1() throws InvalidConfigException {
187187
String bigValue = new String(new char[1000000]);
188188

189-
Event testEvent = Context.startTrace();
189+
Event testEvent = startTrace();
190190

191191
testEvent.addInfo("key1", bigValue);
192192
testEvent.addInfo("key2", new String[] { bigValue, bigValue, bigValue});
@@ -225,7 +225,7 @@ public void testOversizedEvent1() throws InvalidConfigException {
225225
*/
226226
@Test
227227
public void testOversizedEvent2() throws InvalidConfigException {
228-
Event testEvent = Context.startTrace();
228+
Event testEvent = startTrace();
229229

230230
for (int i = 0 ; i < 10000; i ++) {
231231
testEvent.addInfo(String.valueOf(i), i);
@@ -264,7 +264,7 @@ public void testOversizedEvent3() throws InvalidConfigException {
264264
hugeArray[i] = 0;
265265
}
266266

267-
Event testEvent = Context.startTrace();
267+
Event testEvent = startTrace();
268268
testEvent.addInfo("HugeArray", hugeArray);
269269

270270
TestReporter reporter = ReporterFactory.getInstance().createTestReporter();
@@ -299,7 +299,7 @@ public void testOversizedEvent4() throws InvalidConfigException {
299299
longString.append(i);
300300
}
301301

302-
Event testEvent = Context.startTrace();
302+
Event testEvent = startTrace();
303303
testEvent.addInfo("LongString", longString.toString());
304304

305305
TestReporter reporter = ReporterFactory.getInstance().createTestReporter();
@@ -335,7 +335,7 @@ public void testOversizedEvent5() throws InvalidConfigException {
335335
}
336336
final String longPrefix = longString.toString();
337337

338-
Event testEvent = Context.startTrace();
338+
Event testEvent = startTrace();
339339
for (int i = 0 ; i < 100; i++) {
340340
testEvent.addInfo(longPrefix + i, longPrefix + 1);
341341
}
@@ -372,7 +372,7 @@ public void testOversizedEvent6() throws InvalidConfigException {
372372
map.put(PREFIX + i, PREFIX);
373373
}
374374

375-
Event testEvent = Context.startTrace();
375+
Event testEvent = startTrace();
376376
testEvent.addInfo("large-map", map);
377377

378378
testEvent.addInfo("k1", 1); //these 2 should still make it
@@ -414,7 +414,7 @@ public void testOversizedEvent7() throws InvalidConfigException {
414414
list.add(PREFIX + i);
415415
}
416416

417-
Event testEvent = Context.startTrace();
417+
Event testEvent = startTrace();
418418
testEvent.addInfo("long-list", list);
419419

420420
testEvent.addInfo("k1", 1); //these 2 should still make it
@@ -522,4 +522,11 @@ public void testW3cContextToXTrace() {
522522
assertEquals("2BA6A6D97A748BFC9F91A4DC46A0D15BBB00000000B6968E14AC09A25A01", EventImpl.w3cContextToXTrace("00-a6a6d97a748bfc9f91a4dc46a0d15bbb-b6968e14ac09a25a-01"));
523523
assertEquals("2BA6A6D97A748BFC9F91A4DC46A0D15BBB00000000B6968E14AC09A25A00", EventImpl.w3cContextToXTrace("00-a6a6d97a748bfc9f91a4dc46a0d15bbb-b6968e14ac09a25a-00"));
524524
}
525+
526+
private Event startTrace() {
527+
Metadata md = new Metadata();
528+
md.randomize(true);
529+
Context.setMetadata(md);
530+
return Context.createEventWithContext(md, false);
531+
}
525532
}

core/src/test/java/com/solarwinds/joboe/core/TestReporterTest.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ public void testReporterSameThread() throws InvalidConfigException {
2222

2323
Event event;
2424

25-
event = Context.startTrace();
25+
event = startTrace();
2626
event.report(threadLocalReporter);
2727

28-
event = Context.startTrace();
28+
event = startTrace();
2929
event.report(nonThreadLocalReporter);
3030

3131

@@ -41,10 +41,10 @@ public void testReporterDifferentThread() throws InvalidConfigException, Interru
4141
Thread thread = new Thread(() -> {
4242
Event event;
4343

44-
event = Context.startTrace();
44+
event = startTrace();
4545
event.report(threadLocalReporter);
4646

47-
event = Context.startTrace();
47+
event = startTrace();
4848
event.report(nonThreadLocalReporter);
4949
});
5050

@@ -55,4 +55,11 @@ public void testReporterDifferentThread() throws InvalidConfigException, Interru
5555
assertEquals(0, threadLocalReporter.getSentEvents().size()); //different thread, should not get the event
5656
assertEquals(1, nonThreadLocalReporter.getSentEvents().size());
5757
}
58+
59+
private Event startTrace() {
60+
Metadata md = new Metadata();
61+
md.randomize(true);
62+
Context.setMetadata(md);
63+
return Context.createEventWithContext(md, false);
64+
}
5865
}

sampling/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
</properties>
1919

2020
<dependencies>
21+
<dependency>
22+
<groupId>io.opentelemetry</groupId>
23+
<artifactId>opentelemetry-api</artifactId>
24+
<version>1.59.0</version>
25+
</dependency>
2126
<dependency>
2227
<groupId>com.solarwinds.joboe</groupId>
2328
<artifactId>logging</artifactId>

sampling/src/main/java/com/solarwinds/joboe/sampling/Metadata.java

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

33
import com.solarwinds.joboe.logging.Logger;
44
import com.solarwinds.joboe.logging.LoggerFactory;
5+
import io.opentelemetry.api.trace.SpanContext;
56
import lombok.Getter;
67

78
import java.util.Arrays;
@@ -70,6 +71,15 @@ public Metadata(String hexStr) throws SamplingException {
7071
}
7172
}
7273

74+
public Metadata(SpanContext spanContext) {
75+
initialize();
76+
if (spanContext.isValid()) {
77+
System.arraycopy(spanContext.getTraceIdBytes(), 0, this.taskID, 0, Constants.TASK_ID_LEN);
78+
System.arraycopy(spanContext.getSpanIdBytes(), 0, this.opID, 0, Constants.OP_ID_LEN);
79+
this.flags = spanContext.getTraceFlags().asByte();
80+
}
81+
}
82+
7383
public Metadata(Metadata toClone) {
7484
if (toClone.isExpired(System.currentTimeMillis())) { //stop this source from spreading expired metadata
7585
toClone.invalidate();

0 commit comments

Comments
 (0)