7
7
import datadog .trace .bootstrap .instrumentation .api .AgentSpanContext ;
8
8
import datadog .trace .bootstrap .instrumentation .api .AgentTraceCollector ;
9
9
import datadog .trace .bootstrap .instrumentation .api .AgentTracer ;
10
- import java .nio .ByteBuffer ;
11
- import java .nio .charset .StandardCharsets ;
12
- import java .security .MessageDigest ;
13
- import java .security .NoSuchAlgorithmException ;
10
+ import datadog .trace .util .FNV64Hash ;
14
11
import java .util .Collections ;
15
12
import java .util .Map ;
16
13
import java .util .Optional ;
@@ -27,16 +24,23 @@ public class OpenlineageParentContext implements AgentSpanContext {
27
24
28
25
private final DDTraceId traceId ;
29
26
private final long spanId ;
30
- private final long childRootSpanId ;
31
27
32
28
private final String parentJobNamespace ;
33
29
private final String parentJobName ;
34
30
private final String parentRunId ;
31
+ private final String rootParentJobNamespace ;
32
+ private final String rootParentJobName ;
33
+ private final String rootParentRunId ;
35
34
36
35
public static final String OPENLINEAGE_PARENT_JOB_NAMESPACE =
37
36
"spark.openlineage.parentJobNamespace" ;
38
37
public static final String OPENLINEAGE_PARENT_JOB_NAME = "spark.openlineage.parentJobName" ;
39
38
public static final String OPENLINEAGE_PARENT_RUN_ID = "spark.openlineage.parentRunId" ;
39
+ public static final String OPENLINEAGE_ROOT_PARENT_JOB_NAMESPACE =
40
+ "spark.openlineage.rootParentJobNamespace" ;
41
+ public static final String OPENLINEAGE_ROOT_PARENT_JOB_NAME =
42
+ "spark.openlineage.rootParentJobName" ;
43
+ public static final String OPENLINEAGE_ROOT_PARENT_RUN_ID = "spark.openlineage.rootParentRunId" ;
40
44
41
45
public static Optional <OpenlineageParentContext > from (SparkConf sparkConf ) {
42
46
if (!sparkConf .contains (OPENLINEAGE_PARENT_JOB_NAMESPACE )
@@ -45,68 +49,84 @@ public static Optional<OpenlineageParentContext> from(SparkConf sparkConf) {
45
49
return Optional .empty ();
46
50
}
47
51
52
+ if (!sparkConf .contains (OPENLINEAGE_ROOT_PARENT_RUN_ID )) {
53
+ log .debug ("Found parent info, but not root parent info. Can't construct valid trace id." );
54
+ return Optional .empty ();
55
+ }
56
+
48
57
String parentJobNamespace = sparkConf .get (OPENLINEAGE_PARENT_JOB_NAMESPACE );
49
58
String parentJobName = sparkConf .get (OPENLINEAGE_PARENT_JOB_NAME );
50
59
String parentRunId = sparkConf .get (OPENLINEAGE_PARENT_RUN_ID );
51
60
52
61
if (!UUID .matcher (parentRunId ).matches ()) {
62
+ log .debug ("OpenLineage parent run id is not a valid UUID: {}" , parentRunId );
63
+ return Optional .empty ();
64
+ }
65
+
66
+ String rootParentJobNamespace = sparkConf .get (OPENLINEAGE_ROOT_PARENT_JOB_NAMESPACE );
67
+ String rootParentJobName = sparkConf .get (OPENLINEAGE_ROOT_PARENT_JOB_NAME );
68
+ String rootParentRunId = sparkConf .get (OPENLINEAGE_ROOT_PARENT_RUN_ID );
69
+
70
+ if (!UUID .matcher (rootParentRunId ).matches ()) {
71
+ log .debug ("OpenLineage root parent run id is not a valid UUID: {}" , parentRunId );
53
72
return Optional .empty ();
54
73
}
55
74
56
75
return Optional .of (
57
- new OpenlineageParentContext (parentJobNamespace , parentJobName , parentRunId ));
76
+ new OpenlineageParentContext (
77
+ parentJobNamespace ,
78
+ parentJobName ,
79
+ parentRunId ,
80
+ rootParentJobNamespace ,
81
+ rootParentJobName ,
82
+ rootParentRunId ));
58
83
}
59
84
60
- OpenlineageParentContext (String parentJobNamespace , String parentJobName , String parentRunId ) {
85
+ OpenlineageParentContext (
86
+ String parentJobNamespace ,
87
+ String parentJobName ,
88
+ String parentRunId ,
89
+ String rootParentJobNamespace ,
90
+ String rootParentJobName ,
91
+ String rootParentRunId ) {
61
92
log .debug (
62
- "Creating OpenlineageParentContext with parentJobNamespace: {}, parentJobName: {}, parentRunId: {}" ,
93
+ "Creating OpenlineageParentContext with parentJobNamespace: {}, parentJobName: {}, parentRunId: {}, rootParentJobNamespace: {}, rootParentJobName: {}, rootParentRunId: {} " ,
63
94
parentJobNamespace ,
64
95
parentJobName ,
65
- parentRunId );
96
+ parentRunId ,
97
+ rootParentJobNamespace ,
98
+ rootParentJobName ,
99
+ rootParentRunId );
66
100
67
101
this .parentJobNamespace = parentJobNamespace ;
68
102
this .parentJobName = parentJobName ;
69
103
this .parentRunId = parentRunId ;
70
104
71
- MessageDigest digest = null ;
72
- try {
73
- digest = MessageDigest .getInstance ("SHA-256" );
74
- } catch (NoSuchAlgorithmException e ) {
75
- log .debug ("Unable to find SHA-256 algorithm" , e );
76
- }
105
+ this .rootParentJobNamespace = rootParentJobNamespace ;
106
+ this .rootParentJobName = rootParentJobName ;
107
+ this .rootParentRunId = rootParentRunId ;
77
108
78
- if (digest != null && parentJobNamespace != null && parentRunId != null ) {
79
- traceId = computeTraceId (digest , parentJobNamespace , parentJobName , parentRunId );
80
- spanId = DDSpanId . ZERO ;
81
-
82
- childRootSpanId =
83
- computeChildRootSpanId ( digest , parentJobNamespace , parentJobName , parentRunId );
109
+ if (this . rootParentRunId != null ) {
110
+ traceId = computeTraceId (this . rootParentRunId );
111
+ spanId = computeSpanId ( this . parentRunId ) ;
112
+ } else if ( this . parentRunId != null ) {
113
+ traceId = computeTraceId ( this . parentRunId );
114
+ spanId = computeSpanId ( this . parentRunId );
84
115
} else {
85
116
traceId = DDTraceId .ZERO ;
86
117
spanId = DDSpanId .ZERO ;
87
-
88
- childRootSpanId = DDSpanId .ZERO ;
89
118
}
90
119
91
120
log .debug ("Created OpenlineageParentContext with traceId: {}, spanId: {}" , traceId , spanId );
92
121
}
93
122
94
- private long computeChildRootSpanId (
95
- MessageDigest digest , String parentJobNamespace , String parentJobName , String parentRunId ) {
96
- byte [] inputBytes =
97
- (parentJobNamespace + parentJobName + parentRunId ).getBytes (StandardCharsets .UTF_8 );
98
- byte [] hash = digest .digest (inputBytes );
99
-
100
- return ByteBuffer .wrap (hash ).getLong ();
123
+ private long computeSpanId (String runId ) {
124
+ return FNV64Hash .generateHash (runId , FNV64Hash .Version .v1A );
101
125
}
102
126
103
- private DDTraceId computeTraceId (
104
- MessageDigest digest , String parentJobNamespace , String parentJobName , String parentRunId ) {
105
- byte [] inputBytes =
106
- (parentJobNamespace + parentJobName + parentRunId ).getBytes (StandardCharsets .UTF_8 );
107
- byte [] hash = digest .digest (inputBytes );
108
-
109
- return DDTraceId .from (ByteBuffer .wrap (hash ).getLong ());
127
+ private DDTraceId computeTraceId (String runId ) {
128
+ log .debug ("Generating traceID from runId: {}" , runId );
129
+ return DDTraceId .from (FNV64Hash .generateHash (runId , FNV64Hash .Version .v1A ));
110
130
}
111
131
112
132
@ Override
@@ -119,10 +139,6 @@ public long getSpanId() {
119
139
return spanId ;
120
140
}
121
141
122
- public long getChildRootSpanId () {
123
- return childRootSpanId ;
124
- }
125
-
126
142
@ Override
127
143
public AgentTraceCollector getTraceCollector () {
128
144
return AgentTracer .NoopAgentTraceCollector .INSTANCE ;
@@ -159,4 +175,16 @@ public String getParentJobName() {
159
175
public String getParentRunId () {
160
176
return parentRunId ;
161
177
}
178
+
179
+ public String getRootParentJobNamespace () {
180
+ return rootParentJobNamespace ;
181
+ }
182
+
183
+ public String getRootParentJobName () {
184
+ return rootParentJobName ;
185
+ }
186
+
187
+ public String getRootParentRunId () {
188
+ return rootParentRunId ;
189
+ }
162
190
}
0 commit comments