@duckcodeailabs/dql-openlineage 1.5.2 → 1.6.2
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.
- package/README.md +73 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/manifest-events.d.ts +95 -0
- package/dist/manifest-events.d.ts.map +1 -0
- package/dist/manifest-events.js +175 -0
- package/dist/manifest-events.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -55,3 +55,76 @@ surface to end users. Wrap-mode re-throws *handler* errors after emitting
|
|
|
55
55
|
|
|
56
56
|
Marquez · DataHub · Atlan · Monte Carlo — anything that speaks the OL spec.
|
|
57
57
|
See [docs/architecture/openlineage.md](../../docs/architecture/openlineage.md).
|
|
58
|
+
|
|
59
|
+
## Project snapshot from a compiled manifest
|
|
60
|
+
|
|
61
|
+
Phase 3.2 of the OSS plan: hydrate a Marquez (or any OL receiver) with the
|
|
62
|
+
full lineage graph of a DQL project in one pass — dbt sources → dbt models →
|
|
63
|
+
DataLex contracts → DQL blocks → apps.
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import { buildManifest } from '@duckcodeailabs/dql-core';
|
|
67
|
+
import { createEmitter, emitProjectSnapshot } from '@duckcodeailabs/dql-openlineage';
|
|
68
|
+
|
|
69
|
+
const manifest = buildManifest({ projectRoot: '.' });
|
|
70
|
+
|
|
71
|
+
const emitter = createEmitter({
|
|
72
|
+
url: process.env.OPENLINEAGE_URL, // http://marquez.local:5000/api/v1/lineage
|
|
73
|
+
namespace: 'jaffle-shop',
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const { emitted } = await emitProjectSnapshot(emitter, manifest);
|
|
77
|
+
console.log(`Emitted ${emitted} OpenLineage events.`);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
What `emitProjectSnapshot` does:
|
|
81
|
+
|
|
82
|
+
- Walks every certified block in the manifest (filter via `blockStatuses`).
|
|
83
|
+
- Emits a `START` then `COMPLETE` event per block, sharing one run id.
|
|
84
|
+
- Marks the block's table dependencies, ref dependencies, and any
|
|
85
|
+
`datalex_contract` reference as `inputs`.
|
|
86
|
+
- Marks the block itself as the `output`, attaching:
|
|
87
|
+
- a **schema** facet (one entry per output column from the v2.4
|
|
88
|
+
column-lineage pipeline)
|
|
89
|
+
- a **columnLineage** facet that points each output column at the
|
|
90
|
+
upstream `dbt.<model>` field it derives from
|
|
91
|
+
- **documentation** + **ownership** job facets when the block has them
|
|
92
|
+
|
|
93
|
+
Dataset names use a stable convention so receivers can join graphs across
|
|
94
|
+
runs:
|
|
95
|
+
|
|
96
|
+
| artifact | dataset name |
|
|
97
|
+
|---|---|
|
|
98
|
+
| dbt model | `dbt.<model_name>` |
|
|
99
|
+
| DataLex contract | `datalex.<domain>.<Entity>.<contract_name>` (version stripped — Marquez/DataHub diff version on the lineage facets) |
|
|
100
|
+
| DQL block | `dql.block.<snake_case_name>` |
|
|
101
|
+
|
|
102
|
+
Use `buildEventsFromManifest(manifest, options)` if you need the events as
|
|
103
|
+
an array (tests, audit logs, custom transports).
|
|
104
|
+
|
|
105
|
+
### Marquez quickstart
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
git clone https://github.com/MarquezProject/marquez.git
|
|
109
|
+
cd marquez && ./docker/up.sh
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Then in your DQL project:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
export OPENLINEAGE_URL=http://localhost:5000/api/v1/lineage
|
|
116
|
+
export OPENLINEAGE_NAMESPACE=jaffle-shop
|
|
117
|
+
node -e "
|
|
118
|
+
import('@duckcodeailabs/dql-core').then(async ({ buildManifest }) => {
|
|
119
|
+
const { createEmitter, emitProjectSnapshot } = await import('@duckcodeailabs/dql-openlineage');
|
|
120
|
+
const manifest = buildManifest({ projectRoot: '.' });
|
|
121
|
+
const emitter = createEmitter(); // picks up OPENLINEAGE_URL from env
|
|
122
|
+
const { emitted } = await emitProjectSnapshot(emitter, manifest);
|
|
123
|
+
console.log('Emitted', emitted, 'events.');
|
|
124
|
+
});
|
|
125
|
+
"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Open `http://localhost:3000` (Marquez UI) and you should see your DQL blocks
|
|
129
|
+
with lineage edges into the dbt models they read from and the DataLex
|
|
130
|
+
contracts they implement.
|
package/dist/index.d.ts
CHANGED
|
@@ -52,4 +52,5 @@ export declare class OpenLineageEmitter {
|
|
|
52
52
|
}, handler: () => Promise<T> | T): Promise<T>;
|
|
53
53
|
}
|
|
54
54
|
export declare function createEmitter(cfg?: EmitterConfig): OpenLineageEmitter;
|
|
55
|
+
export { buildEventsFromManifest, datasetNames, emitProjectSnapshot, jobNames, type BuildEventsOptions, type ManifestBlockProjection, type ManifestDataLexContractProjection, type ManifestDbtModelProjection, type ManifestProjection, } from './manifest-events.js';
|
|
55
56
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAErB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,QAAQ,CAClE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,KAAK,GAAG,WAAW,CAAC,CACrD,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,SAAS,CAAC,CAW3C;AAED,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC;IAE5D,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B9E;;;;OAIG;IACG,IAAI,CAAC,CAAC,EACV,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,MAAM,EACb,EAAE,EAAE;QAAE,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,cAAc,EAAE,CAAA;KAAE,EAC7D,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;CAYd;AAED,wBAAgB,aAAa,CAAC,GAAG,GAAE,aAAkB,GAAG,kBAAkB,CAEzE"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAErB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,QAAQ,CAClE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,KAAK,GAAG,WAAW,CAAC,CACrD,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,SAAS,CAAC,CAW3C;AAED,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC;IAE5D,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B9E;;;;OAIG;IACG,IAAI,CAAC,CAAC,EACV,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,MAAM,EACb,EAAE,EAAE;QAAE,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,cAAc,EAAE,CAAA;KAAE,EAC7D,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;CAYd;AAED,wBAAgB,aAAa,CAAC,GAAG,GAAE,aAAkB,GAAG,kBAAkB,CAEzE;AAED,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,mBAAmB,EACnB,QAAQ,EACR,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,iCAAiC,EACtC,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -82,4 +82,5 @@ export class OpenLineageEmitter {
|
|
|
82
82
|
export function createEmitter(cfg = {}) {
|
|
83
83
|
return new OpenLineageEmitter(resolveConfig(cfg));
|
|
84
84
|
}
|
|
85
|
+
export { buildEventsFromManifest, datasetNames, emitProjectSnapshot, jobNames, } from './manifest-events.js';
|
|
85
86
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,EAAE;AACF,mEAAmE;AACnE,2EAA2E;AAC3E,wEAAwE;AACxE,yCAAyC;AACzC,EAAE;AACF,iEAAiE;AAEjE,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AA0CjD,MAAM,QAAQ,GAAG,oCAAoC,CAAC;AACtD,MAAM,UAAU,GACd,0EAA0E,CAAC;AAE7E;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,UAAyB,EAAE;IAGvD,MAAM,GAAG,GAAI,UAAyE,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAC1G,MAAM,QAAQ,GAAG,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAC;IACtD,MAAM,OAAO,GAAG,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IAC9F,OAAO;QACL,OAAO;QACP,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,IAAI,EAAE;QAC7C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,qBAAqB,IAAI,KAAK;QAClE,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,GAAqC;QAArC,QAAG,GAAH,GAAG,CAAkC;IAAG,CAAC;IAEtE,KAAK,CAAC,IAAI,CAAC,KAAmD;QAC5D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;YAAE,OAAO;QAC/C,MAAM,SAAS,GAAiB;YAC9B,GAAG,KAAK;YACR,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,UAAU;SACtB,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAK,UAAU,CAAC,KAAkC,CAAC;QACnF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;gBACxC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;aAChC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,8DAA8D;YAC9D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CACR,GAAe,EACf,KAAa,EACb,EAA6D,EAC7D,OAA6B;QAE7B,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACvH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1H,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACtH,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,MAAqB,EAAE;IACnD,OAAO,IAAI,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build OpenLineage events from a compiled DQL manifest.
|
|
3
|
+
*
|
|
4
|
+
* Turns a `dql compile` artifact into a START/COMPLETE event series that
|
|
5
|
+
* hydrates a Marquez / DataHub / Atlan / Monte Carlo backend with the
|
|
6
|
+
* project's lineage graph: dbt sources → dbt models → DataLex contracts →
|
|
7
|
+
* DQL blocks → apps.
|
|
8
|
+
*
|
|
9
|
+
* Use {@link buildEventsFromManifest} for tests / inspection (returns a
|
|
10
|
+
* pure array of events) and {@link emitProjectSnapshot} to actually POST
|
|
11
|
+
* to the configured backend.
|
|
12
|
+
*/
|
|
13
|
+
import type { LineageEvent, OpenLineageEmitter } from './index.js';
|
|
14
|
+
/**
|
|
15
|
+
* Subset of `@duckcodeailabs/dql-core` `DQLManifest` consumed here. Kept
|
|
16
|
+
* structural to avoid a circular package dep — dql-openlineage stays
|
|
17
|
+
* dependency-free.
|
|
18
|
+
*/
|
|
19
|
+
export interface ManifestProjection {
|
|
20
|
+
blocks?: Record<string, ManifestBlockProjection>;
|
|
21
|
+
/** Optional dbt model index, when the manifest exposes one. */
|
|
22
|
+
dbtModels?: Record<string, ManifestDbtModelProjection>;
|
|
23
|
+
/** Optional DataLex contracts surface (forwarded by the manifest builder). */
|
|
24
|
+
datalexContracts?: ManifestDataLexContractProjection[];
|
|
25
|
+
}
|
|
26
|
+
export interface ManifestBlockProjection {
|
|
27
|
+
name: string;
|
|
28
|
+
status?: string;
|
|
29
|
+
filePath?: string;
|
|
30
|
+
domain?: string;
|
|
31
|
+
owner?: string;
|
|
32
|
+
blockType?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
/** Tables the block reads from (output of the lineage table extractor). */
|
|
35
|
+
tableDependencies?: string[];
|
|
36
|
+
/** Block-to-block ref() edges. */
|
|
37
|
+
refDependencies?: string[];
|
|
38
|
+
/** Optional reference to a DataLex contract id. */
|
|
39
|
+
datalexContract?: string;
|
|
40
|
+
/** Column-level outputs from the v2.4 column-lineage pipeline. */
|
|
41
|
+
outputs?: Array<{
|
|
42
|
+
name: string;
|
|
43
|
+
isAggregate?: boolean;
|
|
44
|
+
aggregateFn?: string;
|
|
45
|
+
sources: Array<{
|
|
46
|
+
table: string;
|
|
47
|
+
column: string;
|
|
48
|
+
}>;
|
|
49
|
+
unresolved?: boolean;
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
52
|
+
export interface ManifestDbtModelProjection {
|
|
53
|
+
name: string;
|
|
54
|
+
schema?: string;
|
|
55
|
+
database?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface ManifestDataLexContractProjection {
|
|
58
|
+
id: string;
|
|
59
|
+
domain?: string;
|
|
60
|
+
entity?: string;
|
|
61
|
+
version?: number;
|
|
62
|
+
}
|
|
63
|
+
export interface BuildEventsOptions {
|
|
64
|
+
/** OpenLineage namespace; defaults to `dql`. Producer-side default. */
|
|
65
|
+
namespace?: string;
|
|
66
|
+
/** ISO-8601 timestamp; defaults to `new Date().toISOString()`. */
|
|
67
|
+
eventTime?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Run id supplier. Defaults to a per-event UUID. Tests pass a counter
|
|
70
|
+
* so output is deterministic.
|
|
71
|
+
*/
|
|
72
|
+
newRunId?: () => string;
|
|
73
|
+
/** Filter blocks by status; defaults to ['certified']. */
|
|
74
|
+
blockStatuses?: string[];
|
|
75
|
+
}
|
|
76
|
+
/** OpenLineage dataset name conventions for DQL artifacts. */
|
|
77
|
+
export declare const datasetNames: {
|
|
78
|
+
dbtModel(modelName: string): string;
|
|
79
|
+
dataLexContract(contractId: string): string;
|
|
80
|
+
dqlBlock(blockName: string): string;
|
|
81
|
+
};
|
|
82
|
+
/** OpenLineage job name conventions. */
|
|
83
|
+
export declare const jobNames: {
|
|
84
|
+
blockRun(blockName: string): string;
|
|
85
|
+
};
|
|
86
|
+
export declare function buildEventsFromManifest(manifest: ManifestProjection, options?: BuildEventsOptions): LineageEvent[];
|
|
87
|
+
/**
|
|
88
|
+
* Emit a complete project snapshot through the supplied emitter. Each
|
|
89
|
+
* certified block produces a START / COMPLETE pair so a backend like
|
|
90
|
+
* Marquez can reconstruct the full lineage graph in one pass.
|
|
91
|
+
*/
|
|
92
|
+
export declare function emitProjectSnapshot(emitter: OpenLineageEmitter, manifest: ManifestProjection, options?: BuildEventsOptions): Promise<{
|
|
93
|
+
emitted: number;
|
|
94
|
+
}>;
|
|
95
|
+
//# sourceMappingURL=manifest-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-events.d.ts","sourceRoot":"","sources":["../src/manifest-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAkB,YAAY,EAAc,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE/F;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACjD,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACvD,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,iCAAiC,EAAE,CAAC;CACxD;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,kCAAkC;IAClC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClD,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;IACxB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,8DAA8D;AAC9D,eAAO,MAAM,YAAY;wBACH,MAAM,GAAG,MAAM;gCAGP,MAAM,GAAG,MAAM;wBAGvB,MAAM,GAAG,MAAM;CAGpC,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,QAAQ;wBACC,MAAM,GAAG,MAAM;CAGpC,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,kBAAuB,GAC/B,YAAY,EAAE,CAyBhB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAa9B"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build OpenLineage events from a compiled DQL manifest.
|
|
3
|
+
*
|
|
4
|
+
* Turns a `dql compile` artifact into a START/COMPLETE event series that
|
|
5
|
+
* hydrates a Marquez / DataHub / Atlan / Monte Carlo backend with the
|
|
6
|
+
* project's lineage graph: dbt sources → dbt models → DataLex contracts →
|
|
7
|
+
* DQL blocks → apps.
|
|
8
|
+
*
|
|
9
|
+
* Use {@link buildEventsFromManifest} for tests / inspection (returns a
|
|
10
|
+
* pure array of events) and {@link emitProjectSnapshot} to actually POST
|
|
11
|
+
* to the configured backend.
|
|
12
|
+
*/
|
|
13
|
+
import { randomUUID } from 'node:crypto';
|
|
14
|
+
/** OpenLineage dataset name conventions for DQL artifacts. */
|
|
15
|
+
export const datasetNames = {
|
|
16
|
+
dbtModel(modelName) {
|
|
17
|
+
return `dbt.${modelName}`;
|
|
18
|
+
},
|
|
19
|
+
dataLexContract(contractId) {
|
|
20
|
+
return `datalex.${contractId}`;
|
|
21
|
+
},
|
|
22
|
+
dqlBlock(blockName) {
|
|
23
|
+
return `dql.block.${blockName.replace(/\s+/g, '_').toLowerCase()}`;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
/** OpenLineage job name conventions. */
|
|
27
|
+
export const jobNames = {
|
|
28
|
+
blockRun(blockName) {
|
|
29
|
+
return `dql.block_run.${blockName.replace(/\s+/g, '_').toLowerCase()}`;
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export function buildEventsFromManifest(manifest, options = {}) {
|
|
33
|
+
const namespace = options.namespace ?? 'dql';
|
|
34
|
+
const eventTime = options.eventTime ?? new Date().toISOString();
|
|
35
|
+
const allowedStatuses = new Set(options.blockStatuses ?? ['certified']);
|
|
36
|
+
const newRunId = options.newRunId ?? randomUUID;
|
|
37
|
+
const events = [];
|
|
38
|
+
const blocks = manifest.blocks ? Object.values(manifest.blocks) : [];
|
|
39
|
+
for (const block of blocks) {
|
|
40
|
+
if (block.status && !allowedStatuses.has(block.status))
|
|
41
|
+
continue;
|
|
42
|
+
const job = {
|
|
43
|
+
namespace,
|
|
44
|
+
name: jobNames.blockRun(block.name),
|
|
45
|
+
facets: blockJobFacets(block),
|
|
46
|
+
};
|
|
47
|
+
const inputs = blockInputs(block, namespace);
|
|
48
|
+
const outputs = blockOutputs(block, namespace);
|
|
49
|
+
const runId = newRunId();
|
|
50
|
+
events.push(makeEvent('START', namespace, eventTime, job, runId, inputs, outputs));
|
|
51
|
+
events.push(makeEvent('COMPLETE', namespace, eventTime, job, runId, inputs, outputs));
|
|
52
|
+
}
|
|
53
|
+
return events;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Emit a complete project snapshot through the supplied emitter. Each
|
|
57
|
+
* certified block produces a START / COMPLETE pair so a backend like
|
|
58
|
+
* Marquez can reconstruct the full lineage graph in one pass.
|
|
59
|
+
*/
|
|
60
|
+
export async function emitProjectSnapshot(emitter, manifest, options = {}) {
|
|
61
|
+
const events = buildEventsFromManifest(manifest, options);
|
|
62
|
+
for (const event of events) {
|
|
63
|
+
await emitter.emit({
|
|
64
|
+
eventType: event.eventType,
|
|
65
|
+
eventTime: event.eventTime,
|
|
66
|
+
job: event.job,
|
|
67
|
+
run: event.run,
|
|
68
|
+
inputs: event.inputs,
|
|
69
|
+
outputs: event.outputs,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return { emitted: events.length };
|
|
73
|
+
}
|
|
74
|
+
function blockJobFacets(block) {
|
|
75
|
+
const facets = {};
|
|
76
|
+
if (block.description) {
|
|
77
|
+
facets.documentation = {
|
|
78
|
+
_producer: 'https://github.com/duckcode-ai/dql',
|
|
79
|
+
_schemaURL: 'https://openlineage.io/spec/facets/1-0-0/DocumentationJobFacet.json',
|
|
80
|
+
description: block.description,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (block.owner) {
|
|
84
|
+
facets.ownership = {
|
|
85
|
+
_producer: 'https://github.com/duckcode-ai/dql',
|
|
86
|
+
_schemaURL: 'https://openlineage.io/spec/facets/1-0-0/OwnershipJobFacet.json',
|
|
87
|
+
owners: [{ name: block.owner }],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return Object.keys(facets).length > 0 ? facets : undefined;
|
|
91
|
+
}
|
|
92
|
+
function blockInputs(block, namespace) {
|
|
93
|
+
const datasets = [];
|
|
94
|
+
const seen = new Set();
|
|
95
|
+
for (const tbl of block.tableDependencies ?? []) {
|
|
96
|
+
if (!tbl)
|
|
97
|
+
continue;
|
|
98
|
+
const name = datasetNames.dbtModel(tbl);
|
|
99
|
+
if (seen.has(name))
|
|
100
|
+
continue;
|
|
101
|
+
seen.add(name);
|
|
102
|
+
datasets.push({ namespace, name });
|
|
103
|
+
}
|
|
104
|
+
for (const ref of block.refDependencies ?? []) {
|
|
105
|
+
if (!ref)
|
|
106
|
+
continue;
|
|
107
|
+
const name = datasetNames.dqlBlock(ref);
|
|
108
|
+
if (seen.has(name))
|
|
109
|
+
continue;
|
|
110
|
+
seen.add(name);
|
|
111
|
+
datasets.push({ namespace, name });
|
|
112
|
+
}
|
|
113
|
+
if (block.datalexContract) {
|
|
114
|
+
const name = datasetNames.dataLexContract(stripContractVersion(block.datalexContract));
|
|
115
|
+
if (!seen.has(name)) {
|
|
116
|
+
seen.add(name);
|
|
117
|
+
datasets.push({ namespace, name });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return datasets;
|
|
121
|
+
}
|
|
122
|
+
function blockOutputs(block, namespace) {
|
|
123
|
+
const datasetName = datasetNames.dqlBlock(block.name);
|
|
124
|
+
const facets = {};
|
|
125
|
+
if (block.outputs && block.outputs.length > 0) {
|
|
126
|
+
facets.schema = {
|
|
127
|
+
_producer: 'https://github.com/duckcode-ai/dql',
|
|
128
|
+
_schemaURL: 'https://openlineage.io/spec/facets/1-0-0/SchemaDatasetFacet.json',
|
|
129
|
+
fields: block.outputs.map((c) => ({ name: c.name })),
|
|
130
|
+
};
|
|
131
|
+
const columnLineage = {};
|
|
132
|
+
for (const col of block.outputs) {
|
|
133
|
+
if (!col.sources || col.sources.length === 0)
|
|
134
|
+
continue;
|
|
135
|
+
columnLineage[col.name] = {
|
|
136
|
+
inputFields: col.sources.map((src) => ({
|
|
137
|
+
namespace,
|
|
138
|
+
name: datasetNames.dbtModel(src.table),
|
|
139
|
+
field: src.column,
|
|
140
|
+
})),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (Object.keys(columnLineage).length > 0) {
|
|
144
|
+
facets.columnLineage = {
|
|
145
|
+
_producer: 'https://github.com/duckcode-ai/dql',
|
|
146
|
+
_schemaURL: 'https://openlineage.io/spec/facets/1-0-0/ColumnLineageDatasetFacet.json',
|
|
147
|
+
fields: columnLineage,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return [
|
|
152
|
+
{
|
|
153
|
+
namespace,
|
|
154
|
+
name: datasetName,
|
|
155
|
+
facets: Object.keys(facets).length > 0 ? facets : undefined,
|
|
156
|
+
},
|
|
157
|
+
];
|
|
158
|
+
}
|
|
159
|
+
function stripContractVersion(ref) {
|
|
160
|
+
const at = ref.indexOf('@');
|
|
161
|
+
return at === -1 ? ref : ref.slice(0, at);
|
|
162
|
+
}
|
|
163
|
+
function makeEvent(eventType, namespace, eventTime, job, runId, inputs, outputs) {
|
|
164
|
+
return {
|
|
165
|
+
eventType,
|
|
166
|
+
eventTime,
|
|
167
|
+
producer: 'https://github.com/duckcode-ai/dql',
|
|
168
|
+
schemaURL: 'https://openlineage.io/spec/2-0-0/OpenLineage.json#/definitions/RunEvent',
|
|
169
|
+
job,
|
|
170
|
+
run: { runId },
|
|
171
|
+
inputs,
|
|
172
|
+
outputs,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=manifest-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-events.js","sourceRoot":"","sources":["../src/manifest-events.ts"],"names":[],"mappings":"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"}
|