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 ;
@@ -32,11 +29,19 @@ public class OpenlineageParentContext implements AgentSpanContext {
32
29
private final String parentJobNamespace ;
33
30
private final String parentJobName ;
34
31
private final String parentRunId ;
32
+ private final String rootParentJobNamespace ;
33
+ private final String rootParentJobName ;
34
+ private final String rootParentRunId ;
35
35
36
36
public static final String OPENLINEAGE_PARENT_JOB_NAMESPACE =
37
37
"spark.openlineage.parentJobNamespace" ;
38
38
public static final String OPENLINEAGE_PARENT_JOB_NAME = "spark.openlineage.parentJobName" ;
39
39
public static final String OPENLINEAGE_PARENT_RUN_ID = "spark.openlineage.parentRunId" ;
40
+ public static final String OPENLINEAGE_ROOT_PARENT_JOB_NAMESPACE =
41
+ "spark.openlineage.rootParentJobNamespace" ;
42
+ public static final String OPENLINEAGE_ROOT_PARENT_JOB_NAME =
43
+ "spark.openlineage.rootParentJobName" ;
44
+ public static final String OPENLINEAGE_ROOT_PARENT_RUN_ID = "spark.openlineage.rootParentRunId" ;
40
45
41
46
public static Optional <OpenlineageParentContext > from (SparkConf sparkConf ) {
42
47
if (!sparkConf .contains (OPENLINEAGE_PARENT_JOB_NAMESPACE )
@@ -53,60 +58,73 @@ public static Optional<OpenlineageParentContext> from(SparkConf sparkConf) {
53
58
return Optional .empty ();
54
59
}
55
60
61
+ if (!sparkConf .contains (OPENLINEAGE_ROOT_PARENT_RUN_ID )) {
62
+ log .error ("Have parent info, but not root parent info. Can't construct valid trace id." );
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
+
56
70
return Optional .of (
57
- new OpenlineageParentContext (parentJobNamespace , parentJobName , parentRunId ));
71
+ new OpenlineageParentContext (
72
+ parentJobNamespace ,
73
+ parentJobName ,
74
+ parentRunId ,
75
+ rootParentJobNamespace ,
76
+ rootParentJobName ,
77
+ rootParentRunId ));
58
78
}
59
79
60
- OpenlineageParentContext (String parentJobNamespace , String parentJobName , String parentRunId ) {
80
+ OpenlineageParentContext (
81
+ String parentJobNamespace ,
82
+ String parentJobName ,
83
+ String parentRunId ,
84
+ String rootParentJobNamespace ,
85
+ String rootParentJobName ,
86
+ String rootParentRunId ) {
61
87
log .debug (
62
- "Creating OpenlineageParentContext with parentJobNamespace: {}, parentJobName: {}, parentRunId: {}" ,
88
+ "Creating OpenlineageParentContext with parentJobNamespace: {}, parentJobName: {}, parentRunId: {}, rootParentJobNamespace: {}, rootParentJobName: {}, rootParentRunId: {} " ,
63
89
parentJobNamespace ,
64
90
parentJobName ,
65
- parentRunId );
91
+ parentRunId ,
92
+ rootParentJobNamespace ,
93
+ rootParentJobName ,
94
+ rootParentRunId );
66
95
67
96
this .parentJobNamespace = parentJobNamespace ;
68
97
this .parentJobName = parentJobName ;
69
98
this .parentRunId = parentRunId ;
70
99
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
- }
100
+ this .rootParentJobNamespace = rootParentJobNamespace ;
101
+ this .rootParentJobName = rootParentJobName ;
102
+ this .rootParentRunId = rootParentRunId ;
77
103
78
- if (digest != null && parentJobNamespace != null && parentRunId != null ) {
79
- traceId = computeTraceId (digest , parentJobNamespace , parentJobName , parentRunId );
104
+ if (this . parentRunId != null ) {
105
+ traceId = computeTraceId (this . parentRunId );
80
106
spanId = DDSpanId .ZERO ;
81
107
82
- childRootSpanId =
83
- computeChildRootSpanId (digest , parentJobNamespace , parentJobName , parentRunId );
108
+ if (this .rootParentRunId != null ) {
109
+ childRootSpanId = computeSpanId (this .rootParentRunId );
110
+ } else {
111
+ childRootSpanId = DDSpanId .ZERO ;
112
+ }
84
113
} else {
85
114
traceId = DDTraceId .ZERO ;
86
115
spanId = DDSpanId .ZERO ;
87
-
88
116
childRootSpanId = DDSpanId .ZERO ;
89
117
}
90
118
91
119
log .debug ("Created OpenlineageParentContext with traceId: {}, spanId: {}" , traceId , spanId );
92
120
}
93
121
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 ();
122
+ private long computeSpanId (String runId ) {
123
+ return FNV64Hash .generateHash (runId , FNV64Hash .Version .v1A );
101
124
}
102
125
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 ());
126
+ private DDTraceId computeTraceId (String runId ) {
127
+ return DDTraceId .from (FNV64Hash .generateHash (runId , FNV64Hash .Version .v1A ));
110
128
}
111
129
112
130
@ Override
@@ -159,4 +177,16 @@ public String getParentJobName() {
159
177
public String getParentRunId () {
160
178
return parentRunId ;
161
179
}
180
+
181
+ public String getRootParentJobNamespace () {
182
+ return rootParentJobNamespace ;
183
+ }
184
+
185
+ public String getRootParentJobName () {
186
+ return rootParentJobName ;
187
+ }
188
+
189
+ public String getRootParentRunId () {
190
+ return rootParentRunId ;
191
+ }
162
192
}
0 commit comments