Kafka
Test data in Kafka topics. Kafka support is currently considered experimental.
1. Install
uv tool install --python python3.11 --upgrade 'datacontract-cli[kafka]'
Kafka checks run on Spark, which requires a Java runtime (JDK 17 or 21) — make sure java is on the path or JAVA_HOME is set. See Installation for pip, pipx, and Docker.
2. Set credentials
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).
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
🟢 data contract is valid. Run 14 checks. Took 12.5 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 scheduling so you catch drift before your consumers do.
Reference
All authentication options (SASL mechanisms) and the Avro data type mappings: Kafka Reference.
Troubleshooting
JAVA_HOME is not set/Unable to locate a Java Runtime— install a JDK (17 or 21) and setJAVA_HOME; the Kafka checks run on Spark.- 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.