OpenLineage
Euno's OpenLineage integration enables seamless ingestion of data lineage events from any system that produces OpenLineage compliant events. This integration automatically processes lineage metadata, table information, and tags to build a comprehensive view of your data pipeline dependencies and transformations.
How It Works
The integration follows these steps:
Provides a secure endpoint Euno generates a unique trigger secret and endpoint URL for receiving OpenLineage events
Accepts OpenLineage Events The integration accepts both single events and arrays of events in standard OpenLineage format via HTTP POST
Processes Lineage and Metadata
Extracts table information from input and output datasets
Creates lineage relationships between input and output tables
Observes the transformation job itself as an OpenLineage Job resource on
COMPLETEevents, with adefinesrelationship to its output tablesProcesses tags and metadata from dataset facets, and job-level metadata from the
euno_jobjob facetValidates naming conventions for supported data warehouses
Supported Data Warehouses
Currently, the Euno's OpenLineage integration supports:
Snowflake - with naming convention:
namespace:
snowflake://org-accountname:
database.schema.table
BigQuery - with naming convention:
namespace:
bigqueryname:
project.dataset.table
For detailed naming conventions, see the OpenLineage Naming Specification.
Setting up Euno's OpenLineage Integration
Step 1: Configure New OpenLineage Source in Euno
Access the Sources Page
Navigate to the Sources page in the Euno application
Click on the Add New Source button
Select OpenLineage from the available integrations
Step 2: General Configuration
Name: Enter a descriptive name for your OpenLineage source (e.g., "Data Pipeline Lineage")
Configuration Details:
OpenLineage integration requires minimal configuration as it's a push-based integration
No schedule configuration is needed since events are pushed in real-time
Step 3: Resource Retention
OpenLineage POSTs are incremental events, not complete snapshots of every known job and dataset. Euno therefore keeps previously observed OpenLineage resources when later POSTs omit them. Automatic source-run cleanup is not available for this integration; use explicit resource invalidation when a job or dataset is intentionally retired.
Step 4: Save Configuration
Click the Save button, and Euno will generate a trigger secret. Copy and save this secret securely as it will not be displayed again.
Step 5: Get the Upload Endpoint
Click "Reset Trigger Key" to get the endpoint URL
Copy the provided endpoint URL where you'll send OpenLineage events
Use the trigger secret from Step 4 as the Bearer token in your Authorization header
Sending OpenLineage Events
Example: Single Event with Lineage and Tags
Here's a complete example of an OpenLineage event with input/output lineage and tags:
cURL Command Examples
Single Event Upload
Multiple Events Upload
Upload from File
A 200 response means the run was accepted for asynchronous processing. If Euno returns 503, retry the same submission with exponential backoff.
Job Resources and the euno_job Facet
On every COMPLETE event, Euno observes the transformation process itself as an OpenLineage Job resource (openlineage_job), in addition to the input and output tables:
Identity: the job is keyed by the exact, case-sensitive pair (
job.namespace,job.name), not byrun.runId. Euno hashes an unambiguous encoding of that pair intoopenlineage.job.{identity_digest}, so dots, punctuation, and case remain identity-significant.Defines relationship: the job gets a
definesrelationship to the output table URIs of itsCOMPLETEevents. Output tables accumulate across both batched and separate POSTs, including concurrent pushes, so sending one event per request produces the same relationships as sending an array. A POST with no observable outputs leaves the job's previousdefinesuntouched. OpenLineage events never remove an earlier output implicitly; retire stale relationships through explicit resource invalidation.Shared table ownership: OpenLineage does not overwrite a table's single-valued
defined_byproperty. The job'sdefinesrelationship and the table's inversehas definerrelationship preserve exact OpenLineage provenance alongside dbt or other definers.Events of other types (
START,RUNNING,FAIL, etc.) still observe tables and lineage, but do not observe the job and do not setdefines.
Job-Level Metadata with the euno_job Facet
Producers can attach a custom job facet named euno_job to send job-level metadata for Euno to ingest. Like every OpenLineage custom facet, it must include these BaseFacet fields:
_producer: a URI that identifies the producer implementation._schemaURL: the corresponding versioned facet schema. Becauseeuno_jobuses the extensible BaseFacet contract, set this tohttps://openlineage.io/spec/2-0-2/OpenLineage.json#/$defs/BaseFacet.
The Euno-specific fields below are optional and map 1:1 onto Euno properties:
euno_job field
Type
Euno property
Fallback when omitted
name
string
name (display name)
job.name
subtype
string
subtype
—
description
string
description
documentation.description facet
raw_code
string
raw_code
sql.query facet
tags
array of strings
tags
—
external_links
array of {"url": string, "label": string}
external_links
—
native_owners
array of owner objects (name, display_name, email, id, native_user_type)
native_owners
—
The job's identity always comes from job.namespace + job.name — euno_job.name only changes the display name. For a newly observed job, Euno uses job.name when the custom facet does not provide a name. That fallback does not replace a custom display name from an earlier event or POST. A later explicit euno_job.name does replace the stored display name.
Malformed optional fields are skipped without failing the event: the job is still observed with its identity and defines relationship, and the skipped fields are reported in the run report. For tags, external_links, and native_owners, valid list entries are retained when sibling entries are malformed, and the run report identifies the dropped zero-based indexes. A native owner must provide at least one non-empty name, display_name, email, or id.
Example: COMPLETE Event with the euno_job Facet
This event observes the raw_data.public.customer_events and analytics.public.customer_analytics tables, lineage between them, and the OpenLineage Job resource openlineage.job.fece0f925338e641b174a10f6681ed0579e4b3fb877b6711ce2e88131634b9b2 that defines the output table.
What Gets Observed in Euno
When OpenLineage events are processed, Euno observes:
Table Resources
Tables from both inputs and outputs with properties:
name: Table namedatabase: Database nameschema: Schema namedatabase_technology:snowflakeorbigquerytype:tablemeta: see belowtags: see below
Job Resources
OpenLineage Jobs from
COMPLETEevents with properties:name: Display name (fromeuno_job.name, orjob.name)type:openlineage_jobsubtype,description,raw_code,tags,external_links,native_owners: from theeuno_jobfacet (see above)defines: the output tables of the job'sCOMPLETEevents
Relationships
openlineage_job
defines
table
Created for observable outputs of COMPLETE events; tables expose the inverse has definer relationship.
table
has upstream
table
Output tables depend on the input tables of the same event.
Tags and Metadata
Tags with values (e.g.,
{"key": "environment", "value": "prod"}) become meta propertiesTags without values (e.g.,
{"key": "pii"}) become simple tags
Generating a new trigger secret: If you need to rotate the secret, go to the Sources page and click on the three-dot menu next to your OpenLineage source. Select "Reset Trigger Key" to generate a new trigger secret and endpoint URL.
Last updated