fluentd-openlineage-parser 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.idea/.gitignore +8 -0
  3. data/.idea/fluentd.iml +204 -0
  4. data/.idea/misc.xml +4 -0
  5. data/.idea/modules/benchmark-memory-0.2.iml +12 -0
  6. data/.idea/modules/bigdecimal-3.1.iml +11 -0
  7. data/.idea/modules/certstore_c-0.1.iml +15 -0
  8. data/.idea/modules/concurrent-ruby-1.3.iml +18 -0
  9. data/.idea/modules/concurrent-ruby-1.31.iml +15 -0
  10. data/.idea/modules/connection_pool-2.4.iml +11 -0
  11. data/.idea/modules/cool.io-1.8.iml +16 -0
  12. data/.idea/modules/drb-2.2.iml +14 -0
  13. data/.idea/modules/drb-2.21.iml +11 -0
  14. data/.idea/modules/ffi-1.17.iml +20 -0
  15. data/.idea/modules/ffi-win32-extensions-1.0.iml +19 -0
  16. data/.idea/modules/fluentd-1.17.iml +43 -0
  17. data/.idea/modules/http_parser.rb-0.8.iml +17 -0
  18. data/.idea/modules/json-2.7.iml +14 -0
  19. data/.idea/modules/json-2.71.iml +11 -0
  20. data/.idea/modules/msgpack-1.7.iml +15 -0
  21. data/.idea/modules/mutex_m-0.2.iml +15 -0
  22. data/.idea/modules/new_gem.iml +15 -0
  23. data/.idea/modules/power_assert-2.0.iml +19 -0
  24. data/.idea/modules/rake-13.2.iml +18 -0
  25. data/.idea/modules/rake-13.21.iml +15 -0
  26. data/.idea/modules/rake-compiler-1.2.iml +13 -0
  27. data/.idea/modules/rusty_json_schema-0.15.iml +15 -0
  28. data/.idea/modules/serverengine-2.3.iml +17 -0
  29. data/.idea/modules/sigdump-0.2.iml +16 -0
  30. data/.idea/modules/specifications.iml +14 -0
  31. data/.idea/modules/specifications1.iml +11 -0
  32. data/.idea/modules/strptime-0.2.iml +16 -0
  33. data/.idea/modules/thermite-0.13.iml +17 -0
  34. data/.idea/modules/webrick-1.8.iml +18 -0
  35. data/.idea/modules/win32-event-0.6.iml +21 -0
  36. data/.idea/modules/win32-ipc-0.7.iml +20 -0
  37. data/.idea/modules/yajl-ruby-1.4.iml +779 -0
  38. data/.idea/modules.xml +41 -0
  39. data/Gemfile +3 -0
  40. data/README.md +223 -0
  41. data/Rakefile +13 -0
  42. data/config/conf/fluent.conf +101 -0
  43. data/config/test-complete.json +73 -0
  44. data/config/test-start.json +73 -0
  45. data/events/event_full.json +206 -0
  46. data/events/event_invalid_dataset_facet.json +31 -0
  47. data/events/event_invalid_input_dataset_facet.json +29 -0
  48. data/events/event_invalid_job_facet.json +26 -0
  49. data/events/event_invalid_output_dataset_facet.json +29 -0
  50. data/events/event_invalid_run_facet.json +28 -0
  51. data/events/event_no_run_id.json +28 -0
  52. data/events/event_simple.json +29 -0
  53. data/fluentd-openlineage-parser.gemspec +28 -0
  54. data/lib/fluent/plugin/fluentd-openlineage-parser.rb +182 -0
  55. data/spec/Naming.md +500 -0
  56. data/spec/OpenLineage.json +304 -0
  57. data/spec/OpenLineage.md +179 -0
  58. data/spec/OpenLineage.yml +27 -0
  59. data/spec/OpenLineageModel.svg +1 -0
  60. data/spec/Versioning.md +49 -0
  61. data/spec/facets/ColumnLineageDatasetFacet.json +96 -0
  62. data/spec/facets/ColumnLineageDatasetFacet.md +106 -0
  63. data/spec/facets/DataQualityAssertionsDatasetFacet.json +49 -0
  64. data/spec/facets/DataQualityMetricsInputDatasetFacet.json +76 -0
  65. data/spec/facets/DatasetVersionDatasetFacet.json +31 -0
  66. data/spec/facets/DatasourceDatasetFacet.json +32 -0
  67. data/spec/facets/DocumentationDatasetFacet.json +31 -0
  68. data/spec/facets/DocumentationJobFacet.json +30 -0
  69. data/spec/facets/ErrorMessageRunFacet.json +41 -0
  70. data/spec/facets/ExternalQueryRunFacet.json +36 -0
  71. data/spec/facets/ExternalQueryRunFacet.md +49 -0
  72. data/spec/facets/ExtractionErrorRunFacet.json +58 -0
  73. data/spec/facets/JobTypeJobFacet.json +41 -0
  74. data/spec/facets/LifecycleStateChangeDatasetFacet.json +46 -0
  75. data/spec/facets/NominalTimeRunFacet.json +38 -0
  76. data/spec/facets/OutputStatisticsOutputDatasetFacet.json +36 -0
  77. data/spec/facets/OwnershipDatasetFacet.json +45 -0
  78. data/spec/facets/OwnershipJobFacet.json +45 -0
  79. data/spec/facets/ParentRunFacet.json +54 -0
  80. data/spec/facets/ProcessingEngineRunFacet.json +41 -0
  81. data/spec/facets/SQLJobFacet.json +30 -0
  82. data/spec/facets/SchemaDatasetFacet.json +59 -0
  83. data/spec/facets/SourceCodeJobFacet.json +34 -0
  84. data/spec/facets/SourceCodeLocationJobFacet.json +60 -0
  85. data/spec/facets/StorageDatasetFacet.json +35 -0
  86. data/spec/facets/SymlinksDatasetFacet.json +47 -0
  87. data/spec/registry/core/registry.json +31 -0
  88. data/spec/registry/gcp/facets/GcpCommonJobFacet.json +43 -0
  89. data/spec/registry/gcp/registry.json +6 -0
  90. data/spec/release.sh +80 -0
  91. data/spec/tests/ColumnLineageDatasetFacet/1.json +172 -0
  92. data/spec/tests/DataQualityAssertionsDatasetFacet/1.json +58 -0
  93. data/spec/tests/DataQualityMetricsInputDatasetFacet/1.json +23 -0
  94. data/spec/tests/DatasetVersionDatasetFacet/1.json +7 -0
  95. data/spec/tests/DatasourceDatasetFacet/1.json +7 -0
  96. data/spec/tests/DocumentationDatasetFacet/1.json +7 -0
  97. data/spec/tests/DocumentationJobFacet/1.json +7 -0
  98. data/spec/tests/ErrorMessageRunFacet/1.json +9 -0
  99. data/spec/tests/ExternalQueryRunFacet/1.json +8 -0
  100. data/spec/tests/ExtractionErrorRunFacet/1.json +15 -0
  101. data/spec/tests/JobTypeJobFacet/1.json +9 -0
  102. data/spec/tests/LifecycleStateChangeDatasetFacet/1.json +11 -0
  103. data/spec/tests/NominalTimeRunFacet/1.json +8 -0
  104. data/spec/tests/OutputStatisticsOutputDatasetFacet/1.json +9 -0
  105. data/spec/tests/OwnershipDatasetFacet/1.json +11 -0
  106. data/spec/tests/OwnershipJobFacet/1.json +11 -0
  107. data/spec/tests/ParentRunFacet/1.json +13 -0
  108. data/spec/tests/ProcessingEngineRunFacet/1.json +9 -0
  109. data/spec/tests/SQLJobFacet/1.json +7 -0
  110. data/spec/tests/SchemaDatasetFacet/1.json +92 -0
  111. data/spec/tests/SourceCodeJobFacet/1.json +8 -0
  112. data/spec/tests/SourceCodeLocationJobFacet/1.json +8 -0
  113. data/spec/tests/StorageDatasetFacet/1.json +8 -0
  114. data/spec/tests/SymlinksDatasetFacet/1.json +13 -0
  115. data/spec/tests/example_full_event.json +24 -0
  116. data/test/helper.rb +8 -0
  117. data/test/plugin/test_parser_openlineage.rb +141 -0
  118. metadata +298 -0
@@ -0,0 +1,304 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openlineage.io/spec/2-0-2/OpenLineage.json",
4
+ "$defs": {
5
+ "BaseEvent": {
6
+ "type": "object",
7
+ "properties": {
8
+ "eventTime": {
9
+ "description": "the time the event occurred at",
10
+ "type": "string",
11
+ "format": "date-time"
12
+ },
13
+ "producer": {
14
+ "description": "URI identifying the producer of this metadata. For example this could be a git url with a given tag or sha",
15
+ "type": "string",
16
+ "format": "uri",
17
+ "example": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client"
18
+ },
19
+ "schemaURL": {
20
+ "description": "The JSON Pointer (https://tools.ietf.org/html/rfc6901) URL to the corresponding version of the schema definition for this RunEvent",
21
+ "type": "string",
22
+ "format": "uri",
23
+ "example": "https://openlineage.io/spec/0-0-1/OpenLineage.json"
24
+ }
25
+ },
26
+ "required": ["eventTime", "producer", "schemaURL"]
27
+ },
28
+ "RunEvent": {
29
+ "allOf": [
30
+ { "$ref": "#/$defs/BaseEvent" },
31
+ {
32
+ "type": "object",
33
+ "properties": {
34
+ "eventType": {
35
+ "description": "the current transition of the run state. It is required to issue 1 START event and 1 of [ COMPLETE, ABORT, FAIL ] event per run. Additional events with OTHER eventType can be added to the same run. For example to send additional metadata after the run is complete",
36
+ "type": "string",
37
+ "enum": ["START", "RUNNING", "COMPLETE", "ABORT", "FAIL", "OTHER"],
38
+ "example": "START|RUNNING|COMPLETE|ABORT|FAIL|OTHER"
39
+ },
40
+ "run": {
41
+ "$ref": "#/$defs/Run"
42
+ },
43
+ "job": {
44
+ "$ref": "#/$defs/Job"
45
+ },
46
+ "inputs": {
47
+ "description": "The set of **input** datasets.",
48
+ "type": "array",
49
+ "items": {
50
+ "$ref": "#/$defs/InputDataset"
51
+ }
52
+ },
53
+ "outputs": {
54
+ "description": "The set of **output** datasets.",
55
+ "type": "array",
56
+ "items": {
57
+ "$ref": "#/$defs/OutputDataset"
58
+ }
59
+ }
60
+ },
61
+ "required": ["run", "job"]
62
+ }
63
+ ]
64
+ },
65
+ "DatasetEvent": {
66
+ "allOf": [
67
+ { "$ref": "#/$defs/BaseEvent" },
68
+ {
69
+ "type": "object",
70
+ "properties": {
71
+ "dataset": {
72
+ "$ref": "#/$defs/StaticDataset"
73
+ }
74
+ },
75
+ "required": ["dataset"],
76
+ "not": { "required": ["job", "run"] }
77
+ }
78
+ ]
79
+ },
80
+ "JobEvent": {
81
+ "allOf": [
82
+ { "$ref": "#/$defs/BaseEvent" },
83
+ {
84
+ "type": "object",
85
+ "properties": {
86
+ "job": {
87
+ "$ref": "#/$defs/Job"
88
+ },
89
+ "inputs": {
90
+ "description": "The set of **input** datasets.",
91
+ "type": "array",
92
+ "items": {
93
+ "$ref": "#/$defs/InputDataset"
94
+ }
95
+ },
96
+ "outputs": {
97
+ "description": "The set of **output** datasets.",
98
+ "type": "array",
99
+ "items": {
100
+ "$ref": "#/$defs/OutputDataset"
101
+ }
102
+ }
103
+ },
104
+ "required": ["job"],
105
+ "not": { "required": ["run"] }
106
+ }
107
+ ]
108
+ },
109
+ "Run": {
110
+ "type": "object",
111
+ "properties": {
112
+ "runId": {
113
+ "description": "The globally unique ID of the run associated with the job.",
114
+ "type": "string",
115
+ "format": "uuid"
116
+ },
117
+ "facets": {
118
+ "description": "The run facets.",
119
+ "type": "object",
120
+ "anyOf": [
121
+ {
122
+ "type": "object",
123
+ "additionalProperties": { "$ref": "#/$defs/RunFacet" }
124
+ }
125
+ ]
126
+ }
127
+ },
128
+ "required": ["runId"]
129
+ },
130
+ "RunFacet": {
131
+ "description": "A Run Facet",
132
+ "type": "object",
133
+ "allOf": [{ "$ref": "#/$defs/BaseFacet" }]
134
+ },
135
+ "Job": {
136
+ "type": "object",
137
+ "properties": {
138
+ "namespace": {
139
+ "description": "The namespace containing that job",
140
+ "type": "string",
141
+ "example": "my-scheduler-namespace"
142
+ },
143
+ "name": {
144
+ "description": "The unique name for that job within that namespace",
145
+ "type": "string",
146
+ "example": "myjob.mytask"
147
+ },
148
+ "facets": {
149
+ "description": "The job facets.",
150
+ "type": "object",
151
+ "anyOf": [
152
+ {
153
+ "type": "object",
154
+ "additionalProperties": { "$ref": "#/$defs/JobFacet" }
155
+ }
156
+ ]
157
+ }
158
+ },
159
+ "required": ["namespace", "name"]
160
+ },
161
+ "JobFacet": {
162
+ "description": "A Job Facet",
163
+ "type": "object",
164
+ "allOf": [
165
+ { "$ref": "#/$defs/BaseFacet" },
166
+ {
167
+ "type": "object",
168
+ "properties": {
169
+ "_deleted": {
170
+ "description": "set to true to delete a facet",
171
+ "type": "boolean"
172
+ }
173
+ }
174
+ }
175
+ ]
176
+ },
177
+ "InputDataset": {
178
+ "description": "An input dataset",
179
+ "type": "object",
180
+ "allOf": [
181
+ { "$ref": "#/$defs/Dataset" },
182
+ {
183
+ "type": "object",
184
+ "properties": {
185
+ "inputFacets": {
186
+ "description": "The input facets for this dataset.",
187
+ "type": "object",
188
+ "anyOf": [
189
+ {
190
+ "type": "object",
191
+ "additionalProperties": {
192
+ "$ref": "#/$defs/InputDatasetFacet"
193
+ }
194
+ }
195
+ ]
196
+ }
197
+ }
198
+ }
199
+ ]
200
+ },
201
+ "InputDatasetFacet": {
202
+ "description": "An Input Dataset Facet",
203
+ "type": "object",
204
+ "allOf": [{ "$ref": "#/$defs/BaseFacet" }]
205
+ },
206
+ "OutputDataset": {
207
+ "description": "An output dataset",
208
+ "type": "object",
209
+ "allOf": [
210
+ { "$ref": "#/$defs/Dataset" },
211
+ {
212
+ "type": "object",
213
+ "properties": {
214
+ "outputFacets": {
215
+ "description": "The output facets for this dataset",
216
+ "type": "object",
217
+ "anyOf": [
218
+ {
219
+ "type": "object",
220
+ "additionalProperties": {
221
+ "$ref": "#/$defs/OutputDatasetFacet"
222
+ }
223
+ }
224
+ ]
225
+ }
226
+ }
227
+ }
228
+ ]
229
+ },
230
+ "OutputDatasetFacet": {
231
+ "description": "An Output Dataset Facet",
232
+ "type": "object",
233
+ "allOf": [{ "$ref": "#/$defs/BaseFacet" }]
234
+ },
235
+ "Dataset": {
236
+ "type": "object",
237
+ "properties": {
238
+ "namespace": {
239
+ "description": "The namespace containing that dataset",
240
+ "type": "string",
241
+ "example": "my-datasource-namespace"
242
+ },
243
+ "name": {
244
+ "description": "The unique name for that dataset within that namespace",
245
+ "type": "string",
246
+ "example": "instance.schema.table"
247
+ },
248
+ "facets": {
249
+ "description": "The facets for this dataset",
250
+ "type": "object",
251
+ "anyOf": [
252
+ {
253
+ "type": "object",
254
+ "additionalProperties": { "$ref": "#/$defs/DatasetFacet" }
255
+ }
256
+ ]
257
+ }
258
+ },
259
+ "required": ["namespace", "name"]
260
+ },
261
+ "StaticDataset": {
262
+ "description": "A Dataset sent within static metadata events",
263
+ "type": "object",
264
+ "allOf": [{ "$ref": "#/$defs/Dataset" }]
265
+ },
266
+ "DatasetFacet": {
267
+ "description": "A Dataset Facet",
268
+ "type": "object",
269
+ "allOf": [
270
+ { "$ref": "#/$defs/BaseFacet" },
271
+ {
272
+ "type": "object",
273
+ "properties": {
274
+ "_deleted": {
275
+ "description": "set to true to delete a facet",
276
+ "type": "boolean"
277
+ }
278
+ }
279
+ }
280
+ ]
281
+ },
282
+ "BaseFacet": {
283
+ "description": "all fields of the base facet are prefixed with _ to avoid name conflicts in facets",
284
+ "type": "object",
285
+ "properties": {
286
+ "_producer": {
287
+ "description": "URI identifying the producer of this metadata. For example this could be a git url with a given tag or sha",
288
+ "type": "string",
289
+ "format": "uri",
290
+ "example": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client"
291
+ },
292
+ "_schemaURL": {
293
+ "description": "The JSON Pointer (https://tools.ietf.org/html/rfc6901) URL to the corresponding version of the schema definition for this facet",
294
+ "type": "string",
295
+ "format": "uri",
296
+ "example": "https://openlineage.io/spec/1-0-2/OpenLineage.json#/$defs/BaseFacet"
297
+ }
298
+ },
299
+ "additionalProperties": true,
300
+ "required": ["_producer", "_schemaURL"]
301
+ }
302
+ },
303
+ "oneOf": [{ "$ref": "#/$defs/RunEvent" }, { "$ref": "#/$defs/DatasetEvent" }, { "$ref": "#/$defs/JobEvent" }]
304
+ }
@@ -0,0 +1,179 @@
1
+ # OpenLineage Spec
2
+
3
+ ## Specification
4
+
5
+ The specification for OpenLineage is formalized as a JsonSchema [OpenLineage.json](OpenLineage.json). An OpenAPI spec is
6
+ also provided for HTTP-based implementations: [OpenLineage.yml](OpenLineage.yml) The documentation is published at:
7
+ https://openlineage.github.io/ It allows extensions to the spec using `Custom Facets` as described in this document.
8
+
9
+ ## Core concepts
10
+
11
+ ### Core Lineage Model
12
+
13
+ ![Open Lineage model](OpenLineageModel.svg)
14
+
15
+ - **Run Event**: an event describing an observed state of a job run. Sending at least a START event and a
16
+ COMPLETE/FAIL/ABORT event is required. Additional events are optional.
17
+
18
+ - **Job**: a process definition that consumes and produces datasets (defined as its inputs and outputs). It is
19
+ [identified by a unique name within a namespace](Naming.md#Jobs) (which is assigned to the scheduler starting the
20
+ jobs). The _Job_ evolves over time, and this change is captured when the job runs.
21
+
22
+ - **Dataset**: an abstract representation of data. It has a
23
+ [unique name within the datasource namespace](Naming.md#Datasets) derived from its physical location
24
+ (db.host.database.schema.table, for example). Typically, a _Dataset_ changes when a job writing to it completes.
25
+ Similarly to the _Job_ and _Run_ distinction, metadata that is more static from run to run is captured in a
26
+ DatasetFacet (for example, the schema that does not change every run), but what changes every _Run_ is captured as an
27
+ _InputFacet_ or an _OutputFacet_ (for example, what subset of the data set was read or written, such as a time
28
+ partition).
29
+
30
+ - **Run**: An instance of a running job with a start and completion (or failure) time. A run is identified by a globally
31
+ unique ID relative to its job definition. A run ID **must** be a
32
+ [UUID](https://datatracker.ietf.org/doc/html/rfc4122).
33
+
34
+ - **Facet**: A piece of metadata attached to one of the entities defined above.
35
+
36
+ Example: Here is an example of a simple start run event not adding any facet information:
37
+
38
+ ```
39
+ {
40
+ "eventType": "START",
41
+ "eventTime": "2020-12-09T23:37:31.081Z",
42
+ "run": {
43
+ "runId": "3b452093-782c-4ef2-9c0c-aafe2aa6f34d",
44
+ },
45
+ "job": {
46
+ "namespace": "my-scheduler-namespace",
47
+ "name": "myjob.mytask",
48
+ },
49
+ "inputs": [
50
+ {
51
+ "namespace": "my-datasource-namespace",
52
+ "name": "instance.schema.table",
53
+ }
54
+ ],
55
+ "outputs": [
56
+ {
57
+ "namespace": "my-datasource-namespace",
58
+ "name": "instance.schema.output_table",
59
+ }
60
+ ],
61
+ "producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
62
+ "schemaURL": "https://openlineage.io/spec/1-0-0/OpenLineage.json#/definitions/RunEvent"
63
+ }
64
+ ```
65
+
66
+ ### Lifecycle
67
+
68
+ The OpenLineage API defines events to capture the lifecycle of a _Run_ for a given _Job_. When a _job_ is being _run_,
69
+ we capture metadata by sending run events when the state of the job transitions to a different state. We might observe
70
+ different aspects of the job run at different stages. This means that different metadata might be collected in each
71
+ event during the lifecycle of a run. All metadata is additive. For example, if more inputs or outputs are detected as
72
+ the job is running, we might send additional events specifically for those datasets without re-emitting previously
73
+ observed inputs or outputs. Example:
74
+
75
+ - When the run starts, we collect the following Metadata:
76
+ - Run ID
77
+ - Job ID
78
+ - eventType: START
79
+ - event time
80
+ - source location and version (e.g., git sha)
81
+ - If known: Job inputs and outputs (input schema, etc.)
82
+ - When the run completes:
83
+ - Run ID
84
+ - Job ID
85
+ - eventType: COMPLETE
86
+ - event time
87
+ - Output datasets schema (and other metadata).
88
+
89
+ ### Facets
90
+
91
+ Facets are pieces of metadata that can be attached to the core entities:
92
+
93
+ - Run
94
+ - Job
95
+ - Dataset (Inputs or Outputs)
96
+
97
+ A facet is an atomic piece of metadata identified by its name. This means that emitting a new facet with the same name
98
+ for the same entity replaces the previous facet instance for that entity entirely. It is defined as a JSON object that
99
+ can be either part of the spec or custom facets defined in a different project.
100
+
101
+ Custom facets must use a distinct prefix named after the project defining them to avoid collision with standard facets
102
+ defined in the [OpenLineage.json](OpenLineage.json) spec. They have a \_schemaURL field pointing to the corresponding
103
+ version of the facet schema (as a JSONPointer: [$ref URL location](https://swagger.io/docs/specification/using-ref/) ).
104
+
105
+ Example:
106
+ https://raw.githubusercontent.com/OpenLineage/OpenLineage/main/spec/OpenLineage.json#/definitions/MyCustomJobFacet
107
+
108
+ The versioned URL must be an immutable pointer to the version of the facet schema. For example, it should include a tag
109
+ of a git sha and not a branch name. This should also be a canonical URL. There should be only one URL used for a given
110
+ version of a schema.
111
+
112
+ Custom facets can be promoted to the standard by including them in the spec.
113
+
114
+ #### Custom Facet Naming
115
+
116
+ Naming of custom facets should follow the pattern `{prefix}{name}{entity}Facet` PascalCased.
117
+ The prefix must be a distinct identifier named after the project defining them to avoid collision with standard facets
118
+ defined in the [OpenLineage.json](OpenLineage.json) spec. The entity is the core entity for which the facet is attached.
119
+
120
+ When attached to a core entity, the key should follow the pattern `{prefix}_{name}`, where both prefix and name are in
121
+ snakeCase.
122
+
123
+ An example of a valid name is `BigQueryStatisticsJobFacet` and key is `bigQuery_statistics`.
124
+
125
+ ### Standard Facets
126
+
127
+ #### Run Facets
128
+
129
+ - **nominalTime**: Captures the time this run is scheduled for. This is a typical usage for a time-based scheduled job.
130
+ The job has a nominal schedule time that will be different from the actual time at which it is running.
131
+
132
+ - **parent**: Captures the parent job and run when the run has been spawned from a parent run. For example, in the case
133
+ of Airflow, there is often a run for a DAG that then spawns runs for individual tasks that refer to the parent run as
134
+ the DAG run. Similarly, when a SparkOperator starts a Spark job, this creates a separate run that refers to the task
135
+ run as its parent.
136
+
137
+ - **errorMessage**: Captures the error message, programming language - and optionally stack trace - when a run fails.
138
+
139
+ #### Job Facets
140
+
141
+ - **sourceCodeLocation**: Captures the source code location and version (e.g., git sha) of the job.
142
+
143
+ - **sourceCode**: Captures the language (e.g., Python) and actual source code of the job.
144
+
145
+ - **sql**: Capture the SQL query if the job is a SQL query.
146
+
147
+ - **ownership**: Captures the owners of the job
148
+
149
+ #### Dataset Facets
150
+
151
+ - **schema**: Captures the schema of the dataset
152
+
153
+ - **dataSource**: Captures the Database instance containing the dataset (e.g., Database schema, Object store bucket,
154
+ etc.)
155
+
156
+ - **lifecycleStateChange**: Captures the lifecycle states of the dataset (alter, create, drop, overwrite, rename,
157
+ truncate, etc.).
158
+
159
+ - **version**: Captures the dataset version when versioning is defined by the database (e.g., Iceberg snapshot ID)
160
+
161
+ - [**columnLineage**](facets/ColumnLineageDatasetFacet.md): Captures the column-level lineage
162
+
163
+ - **ownership**: Captures the owners of the dataset
164
+
165
+ #### Input Dataset Facets
166
+
167
+ - **dataQualityMetrics**: Captures dataset-level and column-level data quality metrics when scanning a dataset with a
168
+ DataQuality library (row count, byte size, null count, distinct count, average, min, max, quantiles).
169
+
170
+ - **dataQualityAssertions**: Captures the result of running data tests on a dataset or its columns.
171
+
172
+ #### Output Dataset Facets
173
+
174
+ - **outputStatistics**: Captures the size of the output written to a dataset (row count and byte size).
175
+
176
+ ---
177
+
178
+ SPDX-License-Identifier: Apache-2.0\
179
+ Copyright 2018-2024 contributors to the OpenLineage project
@@ -0,0 +1,27 @@
1
+ openapi: 3.0.2
2
+ info:
3
+ title: OpenLineage
4
+ version: 0.0.1
5
+ description: OpenLineage is an open source **lineage and metadata collection API** for the data ecosystem.
6
+ license:
7
+ name: Apache 2.0
8
+ url: http://www.apache.org/licenses/LICENSE-2.0.html
9
+ paths:
10
+ /lineage:
11
+ post:
12
+ summary: Send an event related to the state of a run
13
+ description: Updates a run state for a job.
14
+ operationId: postRunEvent
15
+ tags:
16
+ - OpenLineage
17
+ requestBody:
18
+ content:
19
+ application/json:
20
+ schema:
21
+ oneOf:
22
+ - $ref: "OpenLineage.json#/$defs/RunEvent"
23
+ - $ref: "OpenLineage.json#/$defs/DatasetEvent"
24
+ - $ref: "OpenLineage.json#/$defs/JobEvent"
25
+ responses:
26
+ "200":
27
+ description: OK
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:lucid="lucid" width="940" height="600"><g transform="translate(-300 -100)" lucid:page-tab-id="0_0"><path d="M0 0h1760v1360H0z" fill="#fff"/><path d="M320 326c0-3.3 2.7-6 6-6h188c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6H326c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><use xlink:href="#a" transform="matrix(1,0,0,1,325,325) translate(2.6851851851851904 17.77777777777778)"/><use xlink:href="#b" transform="matrix(1,0,0,1,325,325) translate(51.88271604938272 17.77777777777778)"/><use xlink:href="#c" transform="matrix(1,0,0,1,325,325) translate(112.25308641975309 17.77777777777778)"/><use xlink:href="#d" transform="matrix(1,0,0,1,325,325) translate(0 44.44444444444444)"/><use xlink:href="#e" transform="matrix(1,0,0,1,325,325) translate(0 71.11111111111111)"/><use xlink:href="#f" transform="matrix(1,0,0,1,325,325) translate(60.49382716049383 71.11111111111111)"/><path d="M680 326c0-3.3 2.7-6 6-6h188c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6H686c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><use xlink:href="#g" transform="matrix(1,0,0,1,685,325) translate(75.30864197530865 17.77777777777778)"/><use xlink:href="#h" transform="matrix(1,0,0,1,685,325) translate(0 44.44444444444444)"/><use xlink:href="#i" transform="matrix(1,0,0,1,685,325) translate(0 71.11111111111111)"/><use xlink:href="#j" transform="matrix(1,0,0,1,685,325) translate(35.74074074074074 71.11111111111111)"/><path d="M680 526c0-3.3 2.7-6 6-6h188c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6H686c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><use xlink:href="#k" transform="matrix(1,0,0,1,685,525) translate(54.96913580246913 17.77777777777778)"/><use xlink:href="#h" transform="matrix(1,0,0,1,685,525) translate(0 44.44444444444444)"/><use xlink:href="#l" transform="matrix(1,0,0,1,685,525) translate(0 71.11111111111111)"/><use xlink:href="#j" transform="matrix(1,0,0,1,685,525) translate(79.01234567901234 71.11111111111111)"/><path d="M1020 326c0-3.3 2.7-6 6-6h188c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6h-188c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><use xlink:href="#m" transform="matrix(1,0,0,1,1025,325) translate(43.27160493827161 78.71527777777777)"/><use xlink:href="#n" transform="matrix(1,0,0,1,1025,325) translate(88.82716049382717 78.71527777777777)"/><path d="M1020 526c0-3.3 2.7-6 6-6h188c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6h-188c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><use xlink:href="#o" transform="matrix(1,0,0,1,1025,525) translate(22.9320987654321 78.71527777777777)"/><use xlink:href="#n" transform="matrix(1,0,0,1,1025,525) translate(109.16666666666667 78.71527777777777)"/><path d="M1020 126c0-3.3 2.7-6 6-6h188c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6h-188c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><use xlink:href="#a" transform="matrix(1,0,0,1,1025,125) translate(41.45061728395062 78.71527777777777)"/><use xlink:href="#n" transform="matrix(1,0,0,1,1025,125) translate(90.64814814814815 78.71527777777777)"/><path d="M680 126c0-3.3 2.7-6 6-6h188c3.3 0 6 2.7 6 6v148c0 3.3-2.7 6-6 6H686c-3.3 0-6-2.7-6-6z" stroke="#5e5e5e" stroke-width="3" fill="#fff"/><use xlink:href="#p" transform="matrix(1,0,0,1,685,125) translate(73.48765432098766 17.77777777777778)"/><use xlink:href="#q" transform="matrix(1,0,0,1,685,125) translate(0 44.44444444444444)"/><use xlink:href="#r" transform="matrix(1,0,0,1,685,125) translate(38.20987654320988 44.44444444444444)"/><path d="M522.5 400H594c3.3 0 6-2.7 6-6V216.67c0-3.32 2.7-6 6-6h54" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M522.53 401h-1.03v-2h1.03z" fill="#5e5e5e"/><path d="M675.26 210.67L661 215.3v-9.27z" stroke="#5e5e5e" stroke-width="2" fill="#5e5e5e"/><use xlink:href="#s" transform="matrix(1,0,0,1,612.395061728395,185.33333333333331) translate(0 14.222222222222223)"/><path d="M522.5 400H660" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M522.53 401h-1.03v-2h1.03z" fill="#5e5e5e"/><path d="M675.26 400L661 404.64v-9.28z" stroke="#5e5e5e" stroke-width="2" fill="#5e5e5e"/><use xlink:href="#t" transform="matrix(1,0,0,1,620.0493827160494,374.66666666666663) translate(0 14.222222222222223)"/><path d="M522.5 400H594c3.3 0 6 2.7 6 6v188c0 3.3 2.7 6 6 6h54" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M522.53 401h-1.03v-2h1.03z" fill="#5e5e5e"/><path d="M675.26 600L661 604.64v-9.28z" stroke="#5e5e5e" stroke-width="2" fill="#5e5e5e"/><g><use xlink:href="#u" transform="matrix(1,0,0,1,538.9135802469136,604) translate(0 14.222222222222223)"/><use xlink:href="#v" transform="matrix(1,0,0,1,538.9135802469136,604) translate(58.074074074074076 14.222222222222223)"/><use xlink:href="#w" transform="matrix(1,0,0,1,538.9135802469136,604) translate(67.95061728395062 14.222222222222223)"/></g><path d="M912.25 200h105.25" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M882.9 200l14.86-14.85L912.9 200l-15.14 14.85z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M1018.5 201h-1.03v-2h1.03z" fill="#5e5e5e"/><g><use xlink:href="#x" transform="matrix(1,0,0,1,934.3703703703703,174.66666666666666) translate(0 14.222222222222223)"/></g><path d="M912.25 400h105.25" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M882.9 400l14.86-14.85L912.9 400l-15.14 14.85z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M1018.5 401h-1.03v-2h1.03z" fill="#5e5e5e"/><g><use xlink:href="#x" transform="matrix(1,0,0,1,935.7037037037037,374.66666666666663) translate(0 14.222222222222223)"/></g><path d="M912.25 600h105.25" stroke="#5e5e5e" stroke-width="2" fill="none"/><path d="M882.9 600l14.86-14.85L912.9 600l-15.14 14.85z" stroke="#5e5e5e" stroke-width="2" fill="#fff"/><path d="M1018.5 601h-1.03v-2h1.03z" fill="#5e5e5e"/><g><use xlink:href="#x" transform="matrix(1,0,0,1,937.037037037037,574.6666666666667) translate(0 14.222222222222223)"/></g><defs><path fill="#333" d="M240-174c0 40-23 61-54 70L253 0h-59l-57-94H76V0H24v-248c93 4 217-23 216 74zM76-134c48-2 112 12 112-38 0-48-66-32-112-35v73" id="y"/><path fill="#333" d="M85 4C-2 5 27-109 22-190h50c7 57-23 150 33 157 60-5 35-97 40-157h50l1 190h-47c-2-12 1-28-3-38-12 25-28 42-61 42" id="z"/><path fill="#333" d="M135-194c87-1 58 113 63 194h-50c-7-57 23-157-34-157-59 0-34 97-39 157H25l-1-190h47c2 12-1 28 3 38 12-26 28-41 61-42" id="A"/><g id="a"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.50617283950617,0)" xlink:href="#A"/></g><path fill="#333" d="M169-182c-1-43-94-46-97-3 18 66 151 10 154 114 3 95-165 93-204 36-6-8-10-19-12-30l50-8c3 46 112 56 116 5-17-69-150-10-154-114-4-87 153-88 188-35 5 8 8 18 10 28" id="B"/><path fill="#333" d="M115-3C79 11 28 4 28-45v-112H4v-33h27l15-45h31v45h36v33H77v99c-1 23 16 31 38 25v30" id="C"/><path fill="#333" d="M133-34C117-15 103 5 69 4 32 3 11-16 11-54c-1-60 55-63 116-61 1-26-3-47-28-47-18 1-26 9-28 27l-52-2c7-38 36-58 82-57s74 22 75 68l1 82c-1 14 12 18 25 15v27c-30 8-71 5-69-32zm-48 3c29 0 43-24 42-57-32 0-66-3-65 30 0 17 8 27 23 27" id="D"/><path fill="#333" d="M185-48c-13 30-37 53-82 52C43 2 14-33 14-96s30-98 90-98c62 0 83 45 84 108H66c0 31 8 55 39 56 18 0 30-7 34-22zm-45-69c5-46-57-63-70-21-2 6-4 13-4 21h74" id="E"/><g id="b"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,22.160493827160494,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,41.85185185185185,0)" xlink:href="#E"/></g><path fill="#333" d="M238-95c0 69-44 99-111 99C63 4 22-25 22-93v-155h51v151c-1 38 19 59 55 60 90 1 49-130 58-211h52v153" id="F"/><path fill="#333" d="M135-194c53 0 70 44 70 98 0 56-19 98-73 100-31 1-45-17-59-34 3 33 2 69 2 105H25l-1-265h48c2 10 0 23 3 31 11-24 29-35 60-35zM114-30c33 0 39-31 40-66 0-38-9-64-40-64-56 0-55 130 0 130" id="G"/><path fill="#333" d="M88-194c31-1 46 15 58 34l-1-101h50l1 261h-48c-2-10 0-23-3-31C134-8 116 4 84 4 32 4 16-41 15-95c0-56 19-97 73-99zm17 164c33 0 40-30 41-66 1-37-9-64-41-64s-38 30-39 65c0 43 13 65 39 65" id="H"/><g id="c"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#F"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#G"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.50617283950617,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.02469135802469,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.37037037037037,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,62.716049382716044,0)" xlink:href="#E"/></g><path fill="#333" d="M59-47c-2 24 18 29 38 22v24C64 9 27 4 27-40v-127H5v-23h24l9-43h21v43h35v23H59v120" id="I"/><path fill="#333" d="M114-163C36-179 61-72 57 0H25l-1-190h30c1 12-1 29 2 39 6-27 23-49 58-41v29" id="J"/><path fill="#333" d="M141-36C126-15 110 5 73 4 37 3 15-17 15-53c-1-64 63-63 125-63 3-35-9-54-41-54-24 1-41 7-42 31l-33-3c5-37 33-52 76-52 45 0 72 20 72 64v82c-1 20 7 32 28 27v20c-31 9-61-2-59-35zM48-53c0 20 12 33 32 33 41-3 63-29 60-74-43 2-92-5-92 41" id="K"/><path fill="#333" d="M117-194c89-4 53 116 60 194h-32v-121c0-31-8-49-39-48C34-167 62-67 57 0H25l-1-190h30c1 10-1 24 2 32 11-22 29-35 61-36" id="L"/><path fill="#333" d="M135-143c-3-34-86-38-87 0 15 53 115 12 119 90S17 21 10-45l28-5c4 36 97 45 98 0-10-56-113-15-118-90-4-57 82-63 122-42 12 7 21 19 24 35" id="M"/><path fill="#333" d="M24-231v-30h32v30H24zM24 0v-190h32V0H24" id="N"/><path fill="#333" d="M100-194c62-1 85 37 85 99 1 63-27 99-86 99S16-35 15-95c0-66 28-99 85-99zM99-20c44 1 53-31 53-75 0-43-8-75-51-75s-53 32-53 75 10 74 51 75" id="O"/><g id="d"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#I"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#J"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518519,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.864197530864196,0)" xlink:href="#L"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.20987654320987,0)" xlink:href="#M"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.32098765432099,0)" xlink:href="#N"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.19753086419753,0)" xlink:href="#I"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.370370370370374,0)" xlink:href="#N"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.24691358024691,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,77.5925925925926,0)" xlink:href="#L"/></g><path fill="#333" d="M100-194c63 0 86 42 84 106H49c0 40 14 67 53 68 26 1 43-12 49-29l28 8c-11 28-37 45-77 45C44 4 14-33 15-96c1-61 26-98 85-98zm52 81c6-60-76-77-97-28-3 7-6 17-6 28h103" id="P"/><path fill="#333" d="M108 0H70L1-190h34L89-25l56-165h34" id="Q"/><g id="e"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#P"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#Q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.45679012345679,0)" xlink:href="#P"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#L"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.148148148148145,0)" xlink:href="#I"/></g><path fill="#333" d="M210-169c-67 3-38 105-44 169h-31v-121c0-29-5-50-35-48C34-165 62-65 56 0H25l-1-190h30c1 10-1 24 2 32 10-44 99-50 107 0 11-21 27-35 58-36 85-2 47 119 55 194h-31v-121c0-29-5-49-35-48" id="R"/><g id="f"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#I"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#N"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.049382716049383,0)" xlink:href="#R"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.50617283950617,0)" xlink:href="#P"/></g><path fill="#333" d="M176-78C186 10 51 31 16-35c-5-9-9-19-11-32l52-8c4 21 12 37 35 38 23 0 32-16 32-40v-130H75v-41h101v170" id="S"/><path fill="#333" d="M110-194c64 0 96 36 96 99 0 64-35 99-97 99-61 0-95-36-95-99 0-62 34-99 96-99zm-1 164c35 0 45-28 45-65 0-40-10-65-43-65-34 0-45 26-45 65 0 36 10 65 43 65" id="T"/><path fill="#333" d="M135-194c52 0 70 43 70 98 0 56-19 99-73 100-30 1-46-15-58-35L72 0H24l1-261h50v104c11-23 29-37 60-37zM114-30c31 0 40-27 40-66 0-37-7-63-39-63s-41 28-41 65c0 36 8 64 40 64" id="U"/><g id="g"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#S"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#T"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.864197530864196,0)" xlink:href="#U"/></g><path fill="#333" d="M115-194c55 1 70 41 70 98S169 2 115 4C84 4 66-9 55-30l1 105H24l-1-265h31l2 30c10-21 28-34 59-34zm-8 174c40 0 45-34 45-75s-6-73-45-74c-42 0-51 32-51 76 0 43 10 73 51 73" id="V"/><path fill="#333" d="M96-169c-40 0-48 33-48 73s9 75 48 75c24 0 41-14 43-38l32 2c-6 37-31 61-74 61-59 0-76-41-82-99-10-93 101-131 147-64 4 7 5 14 7 22l-32 3c-4-21-16-35-41-35" id="W"/><g id="h"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#L"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#R"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#P"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049382,0)" xlink:href="#M"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,66.60493827160494,0)" xlink:href="#V"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,78.95061728395062,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,91.2962962962963,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,102.40740740740742,0)" xlink:href="#P"/></g><path fill="#333" d="M24-231v-30h32v30H24zM-9 49c24 4 33-6 33-30v-209h32V24c2 40-23 58-65 49V49" id="X"/><path fill="#333" d="M115-194c53 0 69 39 70 98 0 66-23 100-70 100C84 3 66-7 56-30L54 0H23l1-261h32v101c10-23 28-34 59-34zm-8 174c40 0 45-34 45-75 0-40-5-75-45-74-42 0-51 32-51 76 0 43 10 73 51 73" id="Y"/><g id="i"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#X"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,4.876543209876543,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.22222222222222,0)" xlink:href="#Y"/></g><g id="j"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#L"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#R"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#P"/></g><path fill="#333" d="M24-248c120-7 223 5 221 122C244-46 201 0 124 0H24v-248zM76-40c74 7 117-18 117-86 0-67-45-88-117-82v168" id="Z"/><path fill="#333" d="M137-138c1-29-70-34-71-4 15 46 118 7 119 86 1 83-164 76-172 9l43-7c4 19 20 25 44 25 33 8 57-30 24-41C81-84 22-81 20-136c-2-80 154-74 161-7" id="aa"/><g id="k"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.67901234567901,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.02469135802469,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.37037037037037,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.71604938271605,0)" xlink:href="#C"/></g><path fill="#333" d="M85-194c31 0 48 13 60 33l-1-100h32l1 261h-30c-2-10 0-23-3-31C134-8 116 4 85 4 32 4 16-35 15-94c0-66 23-100 70-100zm9 24c-40 0-46 34-46 75 0 40 6 74 45 74 42 0 51-32 51-76 0-42-9-74-50-73" id="ab"/><g id="l"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#I"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.864197530864196,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.20987654320987,0)" xlink:href="#M"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.32098765432099,0)" xlink:href="#P"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,66.66666666666667,0)" xlink:href="#I"/></g><g id="m"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#S"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#T"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.864197530864196,0)" xlink:href="#U"/></g><path fill="#333" d="M76-208v77h127v40H76V0H24v-248h183v40H76" id="ac"/><path fill="#333" d="M190-63c-7 42-38 67-86 67-59 0-84-38-90-98-12-110 154-137 174-36l-49 2c-2-19-15-32-35-32-30 0-35 28-38 64-6 74 65 87 74 30" id="ad"/><g id="n"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ac"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518517,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,25.864197530864196,0)" xlink:href="#ad"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.20987654320987,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,50.55555555555555,0)" xlink:href="#C"/></g><g id="o"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#Z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.67901234567901,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.02469135802469,0)" xlink:href="#aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.37037037037037,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.71604938271605,0)" xlink:href="#C"/></g><g id="p"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.50617283950617,0)" xlink:href="#A"/></g><path fill="#333" d="M84 4C-5 8 30-112 23-190h32v120c0 31 7 50 39 49 72-2 45-101 50-169h31l1 190h-30c-1-10 1-25-2-33-11 22-28 36-60 37" id="ae"/><g id="q"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#J"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,7.345679012345679,0)" xlink:href="#ae"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,19.691358024691358,0)" xlink:href="#L"/></g><g id="r"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#N"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,4.876543209876543,0)" xlink:href="#ab"/></g><path fill="#333" d="M135-150c-39-12-60 13-60 57V0H25l-1-190h47c2 13-1 29 3 40 6-28 27-53 61-41v41" id="af"/><g id="s"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#af"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,6.913580246913581,0)" xlink:href="#z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,17.728395061728396,0)" xlink:href="#A"/></g><path fill="#333" d="M25-224v-37h50v37H25zM75 22c2 45-34 59-81 51V38c22 5 31-5 31-27v-201h50V22" id="ag"/><g id="t"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#ag"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,4.938271604938272,0)" xlink:href="#T"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,15.753086419753087,0)" xlink:href="#U"/></g><path fill="#333" d="M24 0v-248h52V0H24" id="ah"/><g id="u"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#ah"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,4.938271604938272,0)" xlink:href="#A"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,15.753086419753087,0)" xlink:href="#G"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,26.567901234567902,0)" xlink:href="#z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,37.382716049382715,0)" xlink:href="#C"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,43.25925925925926,0)" xlink:href="#aa"/></g><path fill="#333" d="M4 7l51-268h42L46 7H4" id="ai"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#ai" id="v"/><g id="w"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#T"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,10.814814814814815,0)" xlink:href="#z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,21.62962962962963,0)" xlink:href="#C"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,27.506172839506174,0)" xlink:href="#G"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,38.32098765432099,0)" xlink:href="#z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,49.135802469135804,0)" xlink:href="#C"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,55.01234567901235,0)" xlink:href="#aa"/></g><path fill="#333" d="M121-226c-27-7-43 5-38 36h38v33H83V0H34v-157H6v-33h28c-9-59 32-81 87-68v32" id="aj"/><g id="x"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#aj"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,5.8765432098765435,0)" xlink:href="#D"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,15.753086419753087,0)" xlink:href="#ad"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,25.629629629629633,0)" xlink:href="#E"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,35.50617283950618,0)" xlink:href="#C"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,41.38271604938272,0)" xlink:href="#aa"/></g></defs></g></svg>
@@ -0,0 +1,49 @@
1
+ # Versioning
2
+
3
+ ## Context
4
+
5
+ The OpenLineage spec gets versioned and published.
6
+
7
+ Requirements:
8
+
9
+ - The OpenLineage spec and related libraries are in the OpenLineage repo.
10
+ - The OpenLineage spec version changes only when the spec itself changes.
11
+ - The libraries in the repo change more frequently than the spec (including when the spec changes).
12
+ - We want to version the OpenLineage spec independently of the API spec.
13
+ - The mechanism to version and publish the OpenLineage core spec applies to publishing custom facets.
14
+
15
+ ## Mechanism
16
+
17
+ - The spec defines its current version using the `“$id”` field:
18
+ - See:
19
+ - [json schema core doc](https://json-schema.org/draft/2020-12/json-schema-core.html#rfc.section.8.2.1)
20
+ - [Json schema spec $id](https://json-schema.org/draft/2019-09/schema)
21
+ - [also on github](https://github.com/json-schema-org/json-schema-spec/blob/draft-next/meta/core.json)
22
+ - Example: `"$id": "https://openlineage.io/spec/1-0-0/OpenLineage.json"` The URL in $id is resolvable and returns that
23
+ version of the spec. We use github pages to publish the spec to openlineage.io
24
+ - The $id urls uses a SEMVER compliant version, following the
25
+ [SCHEMAVER semantics](https://docs.snowplowanalytics.com/docs/pipeline-components-and-applications/iglu/common-architecture/schemaver/)
26
+ MODEL-REVISION-ADDITION
27
+ - MODEL when you make a breaking schema change which will prevent interaction with any historical data
28
+ - REVISION when you introduce a schema change which may prevent interaction with some historical data
29
+ - ADDITION when you make a schema change that is compatible with all historical data
30
+
31
+ ## Implementation Plan
32
+
33
+ - CI verifies that:
34
+ - The $id field has the right domain prefix.
35
+ - The version changes when the spec changes: When resolving “$id”, the build fails if the spec is not exactly the
36
+ same.
37
+ - The version does not change when the spec does not change. We can verify that the current version of the spec is not
38
+ already published with a different version.
39
+ - Libraries are generating events with the current version.
40
+ - The spec is backward-compatible (only add optional fields) and consistent with the versioning semantics.
41
+ - git pre commit: Increments the versions automatically when the spec changes.
42
+ - Spec publication:
43
+ - CI publishes to github pages when the $id changes on main (when this particular URL does not exist yet).
44
+ - CI tags main with OpenLineage.json-{version}.
45
+
46
+ ---
47
+
48
+ SPDX-License-Identifier: Apache-2.0\
49
+ Copyright 2018-2024 contributors to the OpenLineage project