13
13
import io .opentelemetry .proto .trace .v1 .ResourceSpans ;
14
14
import io .opentelemetry .proto .trace .v1 .Span ;
15
15
import io .opentelemetry .proto .trace .v1 .Status ;
16
+ import io .opentelemetry .sdk .trace .IdGenerator ;
16
17
import jakarta .el .ELProcessor ;
17
18
import lombok .Getter ;
18
19
import lombok .extern .slf4j .Slf4j ;
19
20
20
- import java .nio .charset .StandardCharsets ;
21
21
import java .util .*;
22
22
import java .util .concurrent .TimeUnit ;
23
23
import java .util .stream .Collectors ;
24
+ import java .util .stream .IntStream ;
24
25
25
26
@ Slf4j
26
27
public class SpansGenerator {
27
28
28
29
private final RootSpanDefinition traceTree ;
29
30
private final String groupName ;
30
- private final int groupOffset ;
31
31
private final String requestID ;
32
32
private final ELProcessor jelProcessor ;
33
33
private ByteString [] traceIds ;
34
34
private long [] startTimes ;
35
35
private long [] endTimes ;
36
+ private ByteString [][] spanIds ;
36
37
@ Getter
37
38
private int currentPostCount ;
38
39
@ Getter
@@ -42,7 +43,6 @@ public SpansGenerator(String groupName, RootSpanDefinition traceTree, String req
42
43
this .traceTree = traceTree ;
43
44
this .groupName = groupName ;
44
45
this .requestID = requestID ;
45
- groupOffset = Integer .parseInt (groupName .split ("::group::" )[1 ]);
46
46
jelProcessor = JELProvider .getJelProcessor ();
47
47
currentPostCount = 0 ;
48
48
currentTreePart = 0 ;
@@ -51,7 +51,7 @@ public SpansGenerator(String groupName, RootSpanDefinition traceTree, String req
51
51
public ExportTraceServiceRequest getTraces () {
52
52
log .debug (requestID + ": Received get traces request for " + groupName );
53
53
if (currentTreePart == 0 ) {
54
- initTimesAndTraceId ();
54
+ initTimesAndIds ();
55
55
currentPostCount ++;
56
56
}
57
57
Map <String , List <List <Span >>> spanCopiesByResource = getSpanCopiesByResource ();
@@ -70,7 +70,7 @@ public ExportTraceServiceRequest getTraces() {
70
70
.addInstrumentationLibrarySpans (InstrumentationLibrarySpans .newBuilder ()
71
71
.setInstrumentationLibrary (InstrumentationLibrary .newBuilder ()
72
72
.setName ("@opentelemetry/test-telemetry-generator" )
73
- .setVersion ("22.5 .0" )
73
+ .setVersion ("22.9 .0" )
74
74
.build ())
75
75
.addAllSpans (spans )
76
76
.build ())
@@ -118,18 +118,19 @@ private Map<String, List<List<Span>>> getSpanCopiesByResource() {
118
118
return spanCopiesByResource ;
119
119
}
120
120
121
- private void initTimesAndTraceId () {
122
- traceIds = new ByteString [traceTree .getCopyCount ()];
123
- for (var copyIndex =0 ; copyIndex <traceTree .getCopyCount (); copyIndex ++) {
124
- traceIds [copyIndex ] = getId (traceTree .getName (), copyIndex , true );
125
- }
121
+ private void initTimesAndIds () {
122
+ traceIds = getTraceIds (traceTree .getCopyCount ());
126
123
int spansSize = traceTree .getTreeNodesPostOrder ().size ();
127
124
startTimes = new long [spansSize ];
128
125
endTimes = new long [spansSize ];
126
+ spanIds = new ByteString [spansSize ][traceTree .getCopyCount ()];
129
127
long baseTime = System .currentTimeMillis ();
130
128
for (var spanIndex =0 ; spanIndex <spansSize ; spanIndex ++) {
131
129
startTimes [spanIndex ] = baseTime + traceTree .getTreeNodesPostOrder ().get (spanIndex ).getStartTimeMillisOffset ();
132
130
endTimes [spanIndex ] = baseTime + traceTree .getTreeNodesPostOrder ().get (spanIndex ).getEndTimeMillisOffset ();
131
+ for (var copyIndex =0 ; copyIndex <traceTree .getCopyCount (); copyIndex ++) {
132
+ spanIds [spanIndex ][copyIndex ] = getId (false );
133
+ }
133
134
}
134
135
}
135
136
@@ -168,12 +169,15 @@ private Span getSingleSpan(SpanDefinition spanDefinition, int spanIndex, boolean
168
169
private List <Span > getSpanCopies (Span span , SpanDefinition spanDefinition ) {
169
170
List <Span > spanCopies = new ArrayList <>();
170
171
Span .Builder eachCopy ;
172
+ int spanIndex = traceTree .getSpansIndexMap ().get (spanDefinition .getName ());
173
+ int parentNodeIndex = spanDefinition .getParentNodes ().containsKey (traceTree .getName ()) ?
174
+ traceTree .getSpansIndexMap ().get (spanDefinition .getParentNodes ().get (traceTree .getName ()).getName ()) : -1 ;
171
175
for (var copyIndex =0 ; copyIndex <traceTree .getCopyCount (); copyIndex ++) {
172
176
eachCopy = Span .newBuilder (span )
173
177
.setTraceId (traceIds [copyIndex ])
174
- .setSpanId (getId ( span . getName (), copyIndex , false ) );
175
- if (spanDefinition . getParentNodes (). containsKey ( traceTree . getName ()) ) {
176
- eachCopy .setParentSpanId (getId ( spanDefinition . getParentNodes (). get ( traceTree . getName ()). getName (), copyIndex , false ) );
178
+ .setSpanId (spanIds [ spanIndex ][ copyIndex ] );
179
+ if (parentNodeIndex != - 1 ) {
180
+ eachCopy .setParentSpanId (spanIds [ parentNodeIndex ][ copyIndex ] );
177
181
}
178
182
spanCopies .add (eachCopy .build ());
179
183
}
@@ -201,12 +205,17 @@ private int getSpanStatusCode(int spanIndex) {
201
205
return traceTree .getSpanErrorEndsTrace () ? 2 : 1 ;
202
206
}
203
207
204
- private ByteString getId (String spanName , int copyIndex , boolean isTrace ) {
205
- int actualCopyIndex = (groupOffset * traceTree .getCopyCount ()) + copyIndex ;
206
- String name = isTrace ?
207
- "trace-" + spanName + "_" + actualCopyIndex + "_" + currentPostCount :
208
- spanName + "_" + actualCopyIndex + "_" + currentPostCount ;
209
- return ByteString .copyFromUtf8 (UUID .nameUUIDFromBytes (name .getBytes (StandardCharsets .UTF_8 )).toString ());
208
+ private ByteString [] getTraceIds (int count ) {
209
+ ByteString [] traceIds = new ByteString [count ];
210
+ IntStream .range (0 , count ).forEach (i -> {
211
+ traceIds [i ] = getId (true );
212
+ });
213
+ return traceIds ;
214
+ }
215
+
216
+ private ByteString getId (boolean isTrace ) {
217
+ String idString = isTrace ? IdGenerator .random ().generateTraceId () : IdGenerator .random ().generateSpanId ();
218
+ return ByteString .copyFrom (Base64 .getEncoder ().encode (idString .getBytes ()));
210
219
}
211
220
212
221
}
0 commit comments