Kafka
Test data in Kafka topics. Kafka support is currently considered experimental.
1. Install
uv tool install --python python3.11 --upgrade 'datacontract-cli[kafka]'
No Java runtime is needed: the topic is consumed and decoded in Python, and the checks run in DuckDB. See Installation for pip, pipx, and Docker.
2. Authenticate
Create a .env file in your working directory (or export the variables):
# .env
DATACONTRACT_KAFKA_SASL_USERNAME=mykey
DATACONTRACT_KAFKA_SASL_PASSWORD=mysecret
If no username/password is set, the CLI connects without authentication (e.g. a local broker).
If the topic is Avro-encoded through the Confluent Schema Registry, add the registry as well, so the messages are decoded with the schema they were actually written with:
DATACONTRACT_KAFKA_SCHEMA_REGISTRY_URL=https://psrc-12345.eu-central-1.aws.confluent.cloud
DATACONTRACT_KAFKA_SCHEMA_REGISTRY_USERNAME=myregistrykey
DATACONTRACT_KAFKA_SCHEMA_REGISTRY_PASSWORD=myregistrysecret
3. Create a contract for your topic
If you have an Avro schema for the topic (e.g. from a schema registry), import it:
datacontract import avro --source orders.avsc --output datacontract.yaml
Then add a servers entry pointing at your broker and topic:
servers:
- server: production
type: kafka
host: abc-12345.eu-central-1.aws.confluent.cloud:9092
topic: my-topic-name
format: json # or avro
4. Test the actual data
datacontract test datacontract.yaml
Testing datacontract.yaml
Server: production (type=kafka, format=json, host=abc-12345.eu-central-1.aws.confluent.cloud:9092)
╭────────┬─────────────────────────────────────────────────┬─────────────────┬─────────╮
│ Result │ Check │ Field │ Details │
├────────┼─────────────────────────────────────────────────┼─────────────────┼─────────┤
│ passed │ Check that field 'order_id' is present │ orders.order_id │ │
│ passed │ Check that field order_id has no missing values │ orders.order_id │ │
│ ... │ │ │ │
╰────────┴─────────────────────────────────────────────────┴─────────────────┴─────────╯
🟢 data contract is valid. Run 24 checks. Took 8.4 seconds.
5. Let it catch a violation
The contract becomes valuable when it detects drift. Tighten an expectation — for example, mark a field as required: true or restrict a field to its allowed values. Run datacontract test datacontract.yaml again: every violation is listed as an error, and the command exits with code 1 — ready for CI/CD and scheduled runs so you catch drift before your consumers do.
Reference
All authentication options (SASL mechanisms) and the Avro data type mappings: Kafka Reference.
Troubleshooting
- Authentication failures against Confluent Cloud — use an API key/secret as
SASL_USERNAME/SASL_PASSWORDwith the defaultPLAINmechanism. - The test reads no messages — the check consumes the topic from the beginning; verify the topic name in the
serversblock and that the topic contains messages in the declaredformat. - The test runs out of memory on a large topic — every message is held in memory. Set
DATACONTRACT_KAFKA_MAX_MESSAGESto check a sample of the topic instead; the run then reports that it read only part of it. Cannot decode the Avro messages of the topic— the schema used for decoding is not the one the messages were written with. For a topic produced through the Confluent Schema Registry, setDATACONTRACT_KAFKA_SCHEMA_REGISTRY_URL; otherwise re-import the contract from the topic's Avro schema withdatacontract import avro.