Skip to content

Observability Attributes Contract

Version: 0.1.0

This contract defines the OpenTelemetry semantic conventions and OpenLineage attributes used by floe for consistent observability across all pipelines.

floe uses two complementary standards:

  • OpenTelemetry for traces and metrics
  • OpenLineage for data lineage

Both use a consistent set of attributes prefixed with floe.*.

These attributes are set at the resource level and apply to all spans and metrics.

AttributeTypeRequiredDescriptionExample
floe.namespacestringYesLineage namespace"my-project"
floe.product.namestringYesDataProduct name"customer-analytics"
floe.product.versionstringYesDataProduct version"1.0.0"
floe.modestringYesDeployment mode"simple", "centralized", "mesh"
floe.versionstringYesfloe version"0.1.0"

Data Mesh mode only:

AttributeTypeRequiredDescriptionExample
floe.domainstringMesh onlyDomain name"sales"
floe.enterprisestringMesh onlyEnterprise name"acme"
AttributeTypeDescriptionExample
floe.pipeline.run_idstringUnique run identifier"run-abc123"
floe.pipeline.schedulestringCron expression"0 6 * * *"
floe.pipeline.triggerstringHow pipeline was triggered"scheduled", "manual", "sensor"
AttributeTypeDescriptionExample
floe.transform.typestringTransform type"dbt"
floe.transform.modelstringModel name"silver_customers"
floe.transform.layerstringData layer"bronze", "silver", "gold"
floe.transform.materializationstringdbt materialization"table", "view", "incremental"
AttributeTypeDescriptionExample
floe.ingestion.typestringIngestion plugin"dlt"
floe.ingestion.sourcestringSource system"salesforce"
floe.ingestion.destinationstringDestination table"bronze.salesforce_accounts"
floe.ingestion.write_dispositionstringWrite mode"append", "replace", "merge"
AttributeTypeDescriptionExample
floe.quality.test_namestringTest name"not_null"
floe.quality.modelstringModel being tested"silver_customers"
floe.quality.columnstringColumn being tested"customer_id"
floe.quality.resultstringTest result"pass", "fail", "warn"
MetricTypeUnitDescription
floe.pipeline.durationhistogramsecondsPipeline run duration
floe.pipeline.runscountercountNumber of pipeline runs
floe.pipeline.failurescountercountNumber of failed runs
MetricTypeUnitDescription
floe.transform.durationhistogramsecondsTransform execution time
floe.transform.rows_affectedgaugecountRows inserted/updated
floe.transform.bytes_processedgaugebytesData processed
MetricTypeUnitDescription
floe.quality.tests_totalcountercountTotal tests executed
floe.quality.tests_passedcountercountTests passed
floe.quality.tests_failedcountercountTests failed
floe.quality.coveragegaugepercentTest coverage percentage
MetricTypeLabelsDescription
floe.contract.violations_totalcountercontract, type, severityTotal contract violations
floe.contract.check_duration_secondshistogramcontract, check_typeContract check latency
floe.contract.freshness_hoursgaugecontractHours since last data update
floe.contract.availability_upgaugecontract1 if available, 0 if not
floe.contract.quality_scoregaugecontractQuality score 0-100
floe.contract.schema_drift_detectedgaugecontract1 if drift detected, 0 if not

Labels:

LabelDescriptionExample
contractContract name"sales-customers"
typeViolation type"freshness_violation"
severityViolation severity"warning"
check_typeType of check"freshness", "schema_drift", "quality"

The OpenLineage namespace identifies the source of lineage events.

ModeFormatExample
Simple{product_name}my-pipeline
Centralized{product_name}customer-analytics
Mesh{domain}.{product_name}sales.customer-360

Note: When floe is managed by Floe SaaS, the namespace format changes to floe.{tenant_id}.{project_slug} to include tenant context.

ComponentFormatExample
Pipeline job{namespace}.{product_name}sales.customer-360
Transform job{namespace}.{model_name}sales.silver_customers
Ingestion job{namespace}.ingest.{source}sales.ingest.salesforce
{
"floe": {
"_producer": "floe",
"_schemaURL": "https://floe.dev/schemas/facets/floe-facet.json",
"version": "0.1.0",
"mode": "mesh",
"namespace": "sales.customer-360",
"product": {
"name": "customer-360",
"version": "3.2.1"
},
"domain": "sales",
"layer": "gold"
}
}
{
"dataClassification": {
"_producer": "floe",
"_schemaURL": "https://floe.dev/schemas/facets/classification-facet.json",
"columns": [
{
"name": "email",
"classification": "pii",
"pii_type": "email",
"sensitivity": "high"
},
{
"name": "customer_id",
"classification": "identifier"
}
]
}
}
{
"quality": {
"_producer": "floe",
"_schemaURL": "https://floe.dev/schemas/facets/quality-facet.json",
"tests": [
{
"name": "not_null",
"column": "customer_id",
"status": "pass"
},
{
"name": "unique",
"column": "customer_id",
"status": "pass"
}
],
"coverage": 92
}
}

Emitted when a data contract violation is detected by the ContractMonitor. See ADR-0028: Runtime Contract Monitoring.

{
"contractViolation": {
"_producer": "floe",
"_schemaURL": "https://floe.dev/schemas/facets/contract-violation-facet.json",
"contractName": "sales-customer-360-customers",
"contractVersion": "2.1.0",
"violationType": "freshness_violation",
"severity": "warning",
"message": "Data is 8 hours old, SLA is 6 hours",
"element": "updated_at",
"expectedValue": "PT6H",
"actualValue": "PT8H",
"timestamp": "2026-01-03T10:15:00Z"
}
}
FieldTypeDescription
contractNamestringName of the violated contract
contractVersionstringSemantic version of the contract
violationTypeenumType of violation (see below)
severityenuminfo, warning, error, critical
messagestringHuman-readable description
elementstringColumn/field name if applicable
expectedValuestringExpected value from contract
actualValuestringActual value observed
timestampdatetimeWhen violation was detected

Violation Types:

TypeDescription
schema_mismatchActual schema doesn’t match contract
schema_driftSchema changed from contract definition
freshness_violationData older than SLA allows
availability_violationData source unavailable
quality_violationQuality check failed
breaking_changeBreaking schema change detected
deprecation_warningContract is deprecated
deprecation_errorContract is sunset

Emitted on successful contract checks (for completeness in lineage).

{
"contractStatus": {
"_producer": "floe",
"_schemaURL": "https://floe.dev/schemas/facets/contract-status-facet.json",
"contractName": "sales-customer-360-customers",
"contractVersion": "2.1.0",
"checkType": "freshness",
"status": "pass",
"threshold": 6.0,
"actualValue": 2.5,
"checkedAt": "2026-01-03T10:15:00Z"
}
}

Observability is configured in CompiledArtifacts:

{
"observability": {
"traces": true,
"metrics": true,
"lineage": true,
"namespace": "my-project"
}
}

Traces and metrics are exported via OTLP:

# Environment variables
OTEL_EXPORTER_OTLP_ENDPOINT: "http://<platform-otlp-endpoint>:4317"
OTEL_SERVICE_NAME: "floe"
OTEL_RESOURCE_ATTRIBUTES: "floe.namespace=my-project,floe.product.name=customer-analytics"

Lineage events are sent to an OpenLineage-compatible backend:

# Environment variables
OPENLINEAGE_URL: "http://marquez:5000"
OPENLINEAGE_NAMESPACE: "my-project"
Trace: run-abc123
└── floe.pipeline.run (10m 30s)
├── floe.transform.execute: bronze_salesforce_accounts (2m)
│ └── floe.quality.test: not_null (100ms)
├── floe.transform.execute: silver_customers (5m)
│ ├── floe.quality.test: not_null (100ms)
│ ├── floe.quality.test: unique (150ms)
│ └── floe.quality.test: freshness (200ms)
└── floe.transform.execute: gold_revenue (3m)
└── floe.quality.test: not_null (100ms)
{
"eventType": "COMPLETE",
"eventTime": "2026-01-03T10:30:00Z",
"run": {
"runId": "run-abc123"
},
"job": {
"namespace": "sales.customer-360",
"name": "silver_customers"
},
"inputs": [
{
"namespace": "sales.customer-360",
"name": "bronze_salesforce_accounts"
}
],
"outputs": [
{
"namespace": "sales.customer-360",
"name": "silver_customers",
"facets": {
"floe": {
"version": "0.1.0",
"mode": "mesh",
"layer": "silver"
},
"dataClassification": {
"columns": [
{"name": "email", "classification": "pii"}
]
}
}
}
]
}