This is an application which
- reads bunch of metrics from your machine/docker-container
- publishes it to Kafka topic
metrics - subscribes to Kafka topic
metrics - reads the information from that topic and writes to postgres
defaultdb.metricson remote server
Simply to make myself aware of the followings in rust-ecosystem:
- Protobuf in rust
- Kafka in rust
- Postgres in rust
-
The application is divided into two sub-parts:
metrics-publisherandmetrics-subscriber. Each of these two subparts is exposed as a command line entry point. -
metrics-publisher:- Launches a async-task to collect metrices to publish data on an tokio::sync::mpsc channel.
- Another async-task listens to this channel and publishes this data to Kafka topic
metrics - The messages are protobuf encoded and are sent out in batches. More details in
data/message.proto - To edit the protobuf-message format, edit the
data/message.protofile and re-generate the definitions using:
make generate-proto -
metrics-subscriber:- Launches a async-task to listen to a Kafka topic
metrics. - Each incoming protobuf-message is deserialized and published on the internal tokio::sync::mpsc channel
- On receiving messages the database async-task writes this to the database.
- Launches a async-task to listen to a Kafka topic
cargo install sqlx-cli
make migrations
There are two methods for the execution - dockerized and local installation. You need to follow until step 5 for both the methods.
The default configuration is in config/env.dev.
-
For local development please run
docker-compose up -d -
This will launch a bunch of docker containers locally, check it by running
docker ps$ docker ps docker ps CONTAINER ID IMAGE COMMAND PORTS NAMES 00886360bf34 timescale/timescaledb:latest-pg11 "docker-entrypoint.s…" 0.0.0.0:5432->5432/tcp timescale-db 0c78b8ad9c6c postgres:11-alpine "docker-entrypoint.s…" 0.0.0.0:54321->5432/tcp pg-docker 6022042c83fe confluentinc/cp-kafka:5.3.1 "/etc/confluent/dock…" 0.0.0.0:9092->9092/tcp kafka -
Run the migration using ( ensure you have
cargo install sqlx-cli)make migrations -
After building the project (
cargo build), you will find a binary insidetarget/debug/kafka-rust-example -
Run the publisher as:
RUST_LOG=info APPLICATION_CONFIG_PATH=./config/env.dev ./target/debug/kafka-rust-example metrics-publisher -
Run the subscriber as:
RUST_LOG=debug APPLICATION_CONFIG_PATH=./config/env.dev ./target/debug/kafka-rust-example metrics-subscriber -
Check rows in DB:
RUST_LOG=info APPLICATION_CONFIG_PATH=./config/env.dev ./target/debug/kafka-rust-example check-db-data
MIT