The project depends on docker-compose
to orchestrate the containers.
-
Download
ca.pem
,service.cert
,service.key
from the Aiven Kafka console. -
Copy those files into the
collector/
andsink/
dirs. -
Create a
collector/.env
file with the necessary config for the collector according to the template below:TAKEHOME_KAFKA_HOST= TAKEHOME_KAFKA_PORT= TAKEHOME_KAFKA_CA=</rel/path/to/ca.pem> TAKEHOME_KAFKA_CERT=</rel/path/to/service.cert> TAKEHOME_KAFKA_KEY=</rel/path/to/service.key> TAKEHOME_KAFKA_TOPIC=
-
Create a
sink/.env
file with the necessary config for the sink according to the template below:TAKEHOME_PG_HOST= TAKEHOME_PG_PORT= TAKEHOME_PG_DATABASE= TAKEHOME_PG_USER= TAKEHOME_PG_PASSWORD= TAKEHOME_KAFKA_URI=<service uri as host:port> TAKEHOME_KAFKA_CA=</rel/path/to/ca.pem> TAKEHOME_KAFKA_CERT=</rel/path/to/service.cert> TAKEHOME_KAFKA_KEY=</rel/path/to/service.key> TAKEHOME_KAFKA_TOPIC= TAKEHOME_CONSUMER_INTERVAL=3.0
-
make build
to build the Docker images. -
make up
to start the collector and sink
- Couldn't get
statsd
to work -- so no monitoring for now. - Not enough time to write proper tests, except for one end-to-end test as a catch-all.
- The timestamp stored in Postgres per metric should reflect the time of sampling, but figuring out the proper mapping between Python and Postgres data types felt like it wasn't worth wasting time on for the purposes of the exercise. As is, the timestamp reflects the time of insert instead.
- General cleanup is needed (obsolete dependencies in requirements.txt, better logging with timestamps)
- Health checks do not provide HTTP endpoint.
- The OS metrics chosen do not reflect real production needs. The collector only samples cpu, memory and disk utilization metrics.
- Service initialization is inconsistent for the collector and sink. One is configured with CLI flags, the other directly with envvars. Ideally I would have fixed that.