|
1 | 1 | use anyhow::Result;
|
2 | 2 | use clap::ValueEnum;
|
3 |
| -use ethereum_types::H256; |
| 3 | +use rdkafka::message::Header; |
| 4 | +use rdkafka::message::OwnedHeaders; |
4 | 5 | use rdkafka::producer::FutureProducer;
|
5 | 6 | use rdkafka::producer::FutureRecord;
|
6 | 7 | use rdkafka::ClientConfig;
|
7 | 8 |
|
8 |
| -use crate::eth::primitives::Hash; |
9 | 9 | use crate::ledger::events::Event;
|
| 10 | +use crate::log_and_err; |
10 | 11 |
|
11 | 12 | #[derive(Clone, serde::Serialize, serde::Deserialize)]
|
12 | 13 | pub struct KafkaConfig {
|
@@ -104,22 +105,24 @@ impl KafkaConnector {
|
104 | 105 | }
|
105 | 106 |
|
106 | 107 | pub async fn send_event<T: Event>(&self, event: T) -> Result<()> {
|
107 |
| - let payload = serde_json::to_string(&event)?; |
| 108 | + // prepare base payload |
| 109 | + let headers = event.event_headers()?; |
| 110 | + let key = event.event_key()?; |
| 111 | + let payload = event.event_payload()?; |
108 | 112 |
|
109 |
| - match self |
110 |
| - .producer |
111 |
| - .send( |
112 |
| - FutureRecord::to(&self.topic).payload(&payload).key(&Hash(H256::random()).to_string()), |
113 |
| - std::time::Duration::from_secs(0), |
114 |
| - ) |
115 |
| - .await |
116 |
| - { |
117 |
| - Ok(_) => { |
118 |
| - tracing::info!(payload = payload, "event sent to kafka"); |
119 |
| - println!("event sent to kafka {:?}", payload); |
120 |
| - Ok(()) |
121 |
| - } |
122 |
| - Err(e) => Err(anyhow::anyhow!("failed to send event to kafka: {:?}", e)), |
| 113 | + // prepare kafka payload |
| 114 | + let mut kafka_headers = OwnedHeaders::new_with_capacity(headers.len()); |
| 115 | + for (key, value) in headers.iter() { |
| 116 | + let header = Header { key, value: Some(value) }; |
| 117 | + kafka_headers = kafka_headers.insert(header); |
123 | 118 | }
|
| 119 | + let kafka_record = FutureRecord::to(&self.topic).payload(&payload).key(&key).headers(kafka_headers); |
| 120 | + |
| 121 | + // publis and handle response |
| 122 | + tracing::info!(%key, %payload, ?headers, "publishing kafka event"); |
| 123 | + if let Err((e, _)) = self.producer.send(kafka_record, std::time::Duration::from_secs(0)).await { |
| 124 | + return log_and_err!(reason = e, "failed to publish kafka event"); |
| 125 | + } |
| 126 | + Ok(()) |
124 | 127 | }
|
125 | 128 | }
|
0 commit comments