From 56df90ef3621e78b2d804ae43b0e70e69fe1654b Mon Sep 17 00:00:00 2001 From: Jay Kothari Date: Mon, 5 Aug 2024 06:25:24 +0530 Subject: [PATCH 01/14] basic setup --- inference-gateway/src/events_reporter.rs | 120 +++++++++++++++++++++++ inference-gateway/src/lib.rs | 1 + 2 files changed, 121 insertions(+) create mode 100644 inference-gateway/src/events_reporter.rs diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs new file mode 100644 index 000000000..02df49234 --- /dev/null +++ b/inference-gateway/src/events_reporter.rs @@ -0,0 +1,120 @@ +use anyhow::Context; +use log::info; +use pgmq::PGMQueueExt; +use serde::{Deserialize, Serialize}; +use sqlx::{Pool, Postgres}; +use std::{env, time::Duration}; +use tokio::time::interval; + +pub fn split_events(events: Message, max_size: usize) -> Vec { + let mut result = Vec::new(); + let mut chunk = Vec::new(); + + for item in metrics.result.into_iter() { + if chunk.len() == max_size { + result.push(DataPlaneMetrics { + name: metrics.name.clone(), + result: chunk, + }); + chunk = Vec::new(); + } + chunk.push(item); + } + + if !chunk.is_empty() { + result.push(DataPlaneMetrics { + name: metrics.name.clone(), + result: chunk, + }); + } + + result +} + +pub async fn get_usage( + dbclient: &Pool, + start_time: String, + end_time: String, +) -> Vec { + let rows = sqlx::query!( + " + SELECT + organization_id, + instance_id, + prompt_tokens, + completion_tokens + FROM inference.requests + WHERE + completed_at >= $1 AND completed_at < $2 + GROUP BY organization_id, instance_id; + ", + start_time, + end_time + ) + .fetch_all(dbclient) + .await?; + + Ok(rows) +} + +pub async fn events_reporter() -> Results<()> { + const BATCH_SIZE: usize = 1000; + + let pg_conn_url = env::var("POSTGRES_QUEUE_CONNECTION") + .with_context(|| "POSTGRES_QUEUE_CONNECTION must be set")?; + + let queue = PGMQueueExt::new(pg_conn_url, 5).await?; + + // TODO: Need to set this env variable + let metrics_events_queue = + env::var("BILLING_EVENTS_QUEUE").expect("BILLING_EVENTS_QUEUE must be set"); + + queue.init().await?; + queue.create(&metrics_events_queue).await?; + + let mut sync_interval = interval(Duration::from_secs(60)); + + loop { + sync_interval.tick().await; + + let events = get_usage('t', "2024-07-01".to_string(), "2024-06-01".to_string()); + + let metrics_to_send = split_events(events, BATCH_SIZE); + let batches = metrics_to_send.len(); + + info!( + "Split metrics into {} chunks, each with {} results", + batches, BATCH_SIZE + ); + + let mut i = 1; + for event in &metrics_to_send { + queue.send(&metrics_events_queue, event).await?; + info!("Enqueued batch {}/{} to PGMQ", i, batches); + i += 1; + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct Message { + pub id: String, + pub message: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct Events { + pub idempotency_key: String, + pub organization_id: String, + pub instance_id: String, + pub payload: Payload, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct Payload { + pub completed_at: String, // Note sure if this is the best type for timestamps + pub duration_ms: i32, // We may not need for orb, but never hurts to have more information + pub model: String, + pub prompt_tokens: String, + pub completion_tokens: String, +} diff --git a/inference-gateway/src/lib.rs b/inference-gateway/src/lib.rs index 6b6d24bff..c55225c4f 100644 --- a/inference-gateway/src/lib.rs +++ b/inference-gateway/src/lib.rs @@ -2,5 +2,6 @@ pub mod authorization; pub mod config; pub mod db; pub mod errors; +pub mod events_reporter; pub mod routes; pub mod server; From 62ad277427adf722312a0c0c5e600b0f06e78282 Mon Sep 17 00:00:00 2001 From: Jay Kothari Date: Mon, 5 Aug 2024 08:11:29 +0530 Subject: [PATCH 02/14] finish up --- ...b8737f4fe288a063571044afb745e889b2242.json | 59 ++++++++++ inference-gateway/Cargo.lock | 31 ++++++ inference-gateway/Cargo.toml | 3 + inference-gateway/src/events_reporter.rs | 104 +++++++++++------- 4 files changed, 158 insertions(+), 39 deletions(-) create mode 100644 inference-gateway/.sqlx/query-a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242.json diff --git a/inference-gateway/.sqlx/query-a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242.json b/inference-gateway/.sqlx/query-a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242.json new file mode 100644 index 000000000..09311049a --- /dev/null +++ b/inference-gateway/.sqlx/query-a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242.json @@ -0,0 +1,59 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n organization_id,\n instance_id,\n duration_ms,\n prompt_tokens,\n completion_tokens,\n model,\n completed_at\n FROM inference.requests\n WHERE\n completed_at >= $1 AND completed_at < $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "organization_id", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "instance_id", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "duration_ms", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "prompt_tokens", + "type_info": "Int4" + }, + { + "ordinal": 4, + "name": "completion_tokens", + "type_info": "Int4" + }, + { + "ordinal": 5, + "name": "model", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "completed_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Timestamptz", + "Timestamptz" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + false + ] + }, + "hash": "a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242" +} diff --git a/inference-gateway/Cargo.lock b/inference-gateway/Cargo.lock index a11d33731..c229c63eb 100644 --- a/inference-gateway/Cargo.lock +++ b/inference-gateway/Cargo.lock @@ -470,7 +470,10 @@ checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", + "serde", + "wasm-bindgen", "windows-targets 0.52.5", ] @@ -847,8 +850,10 @@ dependencies = [ "actix-service", "actix-web", "anyhow", + "chrono", "env_logger", "log", + "pgmq", "rand", "reqwest", "serde", @@ -857,6 +862,7 @@ dependencies = [ "thiserror", "tokio", "url", + "uuid", ] [[package]] @@ -1518,6 +1524,22 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pgmq" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f730831e2479ec2a67eb59c01b43565a77ba7b97f14a3c6bd4c5351ff3dab88" +dependencies = [ + "chrono", + "log", + "serde", + "serde_json", + "sqlx", + "thiserror", + "tokio", + "url", +] + [[package]] name = "pin-project" version = "1.1.5" @@ -2520,6 +2542,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +dependencies = [ + "getrandom", +] + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/inference-gateway/Cargo.toml b/inference-gateway/Cargo.toml index a6861381d..f4234998c 100644 --- a/inference-gateway/Cargo.toml +++ b/inference-gateway/Cargo.toml @@ -9,6 +9,7 @@ actix-cors = "0.7.0" actix-rt = "2.10.0" actix-web = "4.5.1" anyhow = "1.0.86" +chrono = "0.4.29" env_logger = "0.11.3" log = "0.4.21" reqwest = { version = "0.12.4", features = ["json"] } @@ -18,6 +19,8 @@ sqlx = { version = "0.7.4", features = [ "runtime-tokio-native-tls", "postgres" thiserror = "1.0.60" tokio = { version = "1", features = ["full"] } url = "2.5.0" +uuid = { version = "1.10.0", features = ["v4"] } +pgmq = "0.28.2" [dev-dependencies] actix-http = "3.6.0" diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index 02df49234..568bad5ae 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -1,67 +1,78 @@ -use anyhow::Context; +use anyhow::{Context, Result}; +use chrono::{DateTime, Utc}; use log::info; use pgmq::PGMQueueExt; use serde::{Deserialize, Serialize}; use sqlx::{Pool, Postgres}; use std::{env, time::Duration}; use tokio::time::interval; - -pub fn split_events(events: Message, max_size: usize) -> Vec { - let mut result = Vec::new(); - let mut chunk = Vec::new(); - - for item in metrics.result.into_iter() { - if chunk.len() == max_size { - result.push(DataPlaneMetrics { - name: metrics.name.clone(), - result: chunk, - }); - chunk = Vec::new(); - } - chunk.push(item); - } - - if !chunk.is_empty() { - result.push(DataPlaneMetrics { - name: metrics.name.clone(), - result: chunk, - }); - } - - result +use uuid::Uuid; + +use crate::db::connect; +use crate::errors::DatabaseError; + +pub fn split_events(events: Vec, max_size: usize) -> Vec { + events + .chunks(max_size) + .map(|chunk| Message { + id: Uuid::new_v4().to_string(), + message: chunk.to_vec(), + }) + .collect() } pub async fn get_usage( dbclient: &Pool, - start_time: String, - end_time: String, -) -> Vec { - let rows = sqlx::query!( - " + start_time: DateTime, + end_time: DateTime, +) -> Result, DatabaseError> { + let rows = sqlx::query_as!( + UsageData, + r#" SELECT organization_id, instance_id, + duration_ms, prompt_tokens, - completion_tokens + completion_tokens, + model, + completed_at FROM inference.requests WHERE completed_at >= $1 AND completed_at < $2 - GROUP BY organization_id, instance_id; - ", + "#, start_time, end_time ) .fetch_all(dbclient) .await?; - Ok(rows) + Ok(rows_to_events(rows)) } -pub async fn events_reporter() -> Results<()> { +pub fn rows_to_events(rows: Vec) -> Vec { + rows.into_iter() + .map(|row| Events { + idempotency_key: Uuid::new_v4().to_string(), + organization_id: row.organization_id, + instance_id: row.instance_id, + payload: Payload { + completed_at: row.completed_at.to_string(), + duration_ms: row.duration_ms, + model: row.model, + prompt_tokens: row.prompt_tokens.to_string(), + completion_tokens: row.completion_tokens.to_string(), + }, + }) + .collect() +} + +pub async fn events_reporter() -> Result<()> { const BATCH_SIZE: usize = 1000; let pg_conn_url = env::var("POSTGRES_QUEUE_CONNECTION") .with_context(|| "POSTGRES_QUEUE_CONNECTION must be set")?; + let dbclient = connect(&pg_conn_url, 5).await?; let queue = PGMQueueExt::new(pg_conn_url, 5).await?; @@ -72,12 +83,15 @@ pub async fn events_reporter() -> Results<()> { queue.init().await?; queue.create(&metrics_events_queue).await?; - let mut sync_interval = interval(Duration::from_secs(60)); + let mut sync_interval = interval(Duration::from_secs(3600)); loop { sync_interval.tick().await; - let events = get_usage('t', "2024-07-01".to_string(), "2024-06-01".to_string()); + let end_time = Utc::now(); + let start_time = end_time - chrono::Duration::hours(1); + // TODO: Get the correct postgres connection URL + let events = get_usage(&dbclient, start_time, end_time).await?; let metrics_to_send = split_events(events, BATCH_SIZE); let batches = metrics_to_send.len(); @@ -112,9 +126,21 @@ pub struct Events { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct Payload { - pub completed_at: String, // Note sure if this is the best type for timestamps - pub duration_ms: i32, // We may not need for orb, but never hurts to have more information + pub completed_at: String, + pub duration_ms: i32, pub model: String, pub prompt_tokens: String, pub completion_tokens: String, } + +pub struct UsageData { + organization_id: String, + instance_id: String, + duration_ms: i32, + prompt_tokens: i32, + completion_tokens: i32, + model: String, + completed_at: DateTime, +} + +//TODO: Add unit tests From 9ccedf53c4eecf05b885ca48e0f6dc99801593fa Mon Sep 17 00:00:00 2001 From: Jay Kothari Date: Thu, 8 Aug 2024 18:04:11 +0530 Subject: [PATCH 03/14] update idempotency key --- inference-gateway/src/events_reporter.rs | 35 +++++++++++++++--------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index 568bad5ae..7b44adeb6 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -33,13 +33,14 @@ pub async fn get_usage( organization_id, instance_id, duration_ms, - prompt_tokens, - completion_tokens, + SUM(prompt_tokens) as prompt_tokens, + SUM(completion_tokens) as completion_tokens, model, completed_at FROM inference.requests WHERE completed_at >= $1 AND completed_at < $2 + GROUP BY organization_id, instance_id "#, start_time, end_time @@ -52,17 +53,25 @@ pub async fn get_usage( pub fn rows_to_events(rows: Vec) -> Vec { rows.into_iter() - .map(|row| Events { - idempotency_key: Uuid::new_v4().to_string(), - organization_id: row.organization_id, - instance_id: row.instance_id, - payload: Payload { - completed_at: row.completed_at.to_string(), - duration_ms: row.duration_ms, - model: row.model, - prompt_tokens: row.prompt_tokens.to_string(), - completion_tokens: row.completion_tokens.to_string(), - }, + .map(|row|{ + // Parse the completed_at string into a DateTime and convert to hour + let completed_at = DateTime::parse_from_rfc3339(&row.completed_at) + .expect("Failed to parse completed_at") + .with_timezone(&Utc) + .format("%Y%m%d%H").to_string(); + + Events { + idempotency_key: format!("{}-{}-{}", row.instance_id, row.model, timestamp_to_hour);, + organization_id: row.organization_id, + instance_id: row.instance_id, + payload: Payload { + completed_at: row.completed_at.to_string(), + duration_ms: row.duration_ms, + model: row.model, + prompt_tokens: row.prompt_tokens.to_string(), + completion_tokens: row.completion_tokens.to_string(), + }, + } }) .collect() } From fb85d9acdce931cd3954a64e717dd2dd4facd8e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Tue, 20 Aug 2024 17:34:38 -0300 Subject: [PATCH 04/14] Fix idempotency key --- inference-gateway/src/events_reporter.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index 7b44adeb6..92471bc4b 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -53,15 +53,16 @@ pub async fn get_usage( pub fn rows_to_events(rows: Vec) -> Vec { rows.into_iter() - .map(|row|{ + .map(|row| { // Parse the completed_at string into a DateTime and convert to hour - let completed_at = DateTime::parse_from_rfc3339(&row.completed_at) - .expect("Failed to parse completed_at") + let completed_at = row + .completed_at .with_timezone(&Utc) - .format("%Y%m%d%H").to_string(); + .format("%Y%m%d%H") + .to_string(); Events { - idempotency_key: format!("{}-{}-{}", row.instance_id, row.model, timestamp_to_hour);, + idempotency_key: format!("{}-{}-{}", row.instance_id, row.model, completed_at), organization_id: row.organization_id, instance_id: row.instance_id, payload: Payload { From 351dd8939aac4267631f68b9bfdb4d3c41b20448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Wed, 21 Aug 2024 01:12:35 -0300 Subject: [PATCH 05/14] Update `UsageDate` query, get PR building --- ...f991767d0aa339aa0dc5ecc09a2299e41ed1.json} | 32 ++++++-------- inference-gateway/src/events_reporter.rs | 44 ++++++++++--------- 2 files changed, 36 insertions(+), 40 deletions(-) rename inference-gateway/.sqlx/{query-a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242.json => query-6f665448b46642d95ae519fc0ca7f991767d0aa339aa0dc5ecc09a2299e41ed1.json} (56%) diff --git a/inference-gateway/.sqlx/query-a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242.json b/inference-gateway/.sqlx/query-6f665448b46642d95ae519fc0ca7f991767d0aa339aa0dc5ecc09a2299e41ed1.json similarity index 56% rename from inference-gateway/.sqlx/query-a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242.json rename to inference-gateway/.sqlx/query-6f665448b46642d95ae519fc0ca7f991767d0aa339aa0dc5ecc09a2299e41ed1.json index 09311049a..940b69a56 100644 --- a/inference-gateway/.sqlx/query-a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242.json +++ b/inference-gateway/.sqlx/query-6f665448b46642d95ae519fc0ca7f991767d0aa339aa0dc5ecc09a2299e41ed1.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n organization_id,\n instance_id,\n duration_ms,\n prompt_tokens,\n completion_tokens,\n model,\n completed_at\n FROM inference.requests\n WHERE\n completed_at >= $1 AND completed_at < $2\n ", + "query": "\n SELECT\n organization_id,\n instance_id,\n model,\n MAX(completed_at) AS completed_at,\n SUM(prompt_tokens) AS prompt_tokens,\n SUM(completion_tokens) AS completion_tokens\n FROM\n inference.requests\n WHERE\n completed_at >= $1\n AND completed_at <= $2\n GROUP BY\n organization_id,\n instance_id,\n model\n ", "describe": { "columns": [ { @@ -15,28 +15,23 @@ }, { "ordinal": 2, - "name": "duration_ms", - "type_info": "Int4" + "name": "model", + "type_info": "Text" }, { "ordinal": 3, - "name": "prompt_tokens", - "type_info": "Int4" + "name": "completed_at", + "type_info": "Timestamptz" }, { "ordinal": 4, - "name": "completion_tokens", - "type_info": "Int4" + "name": "prompt_tokens", + "type_info": "Int8" }, { "ordinal": 5, - "name": "model", - "type_info": "Text" - }, - { - "ordinal": 6, - "name": "completed_at", - "type_info": "Timestamptz" + "name": "completion_tokens", + "type_info": "Int8" } ], "parameters": { @@ -49,11 +44,10 @@ false, false, false, - false, - false, - false, - false + null, + null, + null ] }, - "hash": "a2dbe8ada1c4213490f83bd7b23b8737f4fe288a063571044afb745e889b2242" + "hash": "6f665448b46642d95ae519fc0ca7f991767d0aa339aa0dc5ecc09a2299e41ed1" } diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index 92471bc4b..aa0a17830 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -30,17 +30,21 @@ pub async fn get_usage( UsageData, r#" SELECT - organization_id, - instance_id, - duration_ms, - SUM(prompt_tokens) as prompt_tokens, - SUM(completion_tokens) as completion_tokens, - model, - completed_at - FROM inference.requests - WHERE - completed_at >= $1 AND completed_at < $2 - GROUP BY organization_id, instance_id + organization_id, + instance_id, + model, + MAX(completed_at) AS completed_at, + SUM(prompt_tokens) AS prompt_tokens, + SUM(completion_tokens) AS completion_tokens + FROM + inference.requests + WHERE + completed_at >= $1 + AND completed_at <= $2 + GROUP BY + organization_id, + instance_id, + model "#, start_time, end_time @@ -57,6 +61,7 @@ pub fn rows_to_events(rows: Vec) -> Vec { // Parse the completed_at string into a DateTime and convert to hour let completed_at = row .completed_at + .unwrap() .with_timezone(&Utc) .format("%Y%m%d%H") .to_string(); @@ -66,11 +71,10 @@ pub fn rows_to_events(rows: Vec) -> Vec { organization_id: row.organization_id, instance_id: row.instance_id, payload: Payload { - completed_at: row.completed_at.to_string(), - duration_ms: row.duration_ms, + completed_at: row.completed_at.unwrap_or_default().to_string(), model: row.model, - prompt_tokens: row.prompt_tokens.to_string(), - completion_tokens: row.completion_tokens.to_string(), + prompt_tokens: row.prompt_tokens.unwrap_or(0).to_string(), + completion_tokens: row.completion_tokens.unwrap_or(0).to_string(), }, } }) @@ -137,20 +141,18 @@ pub struct Events { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct Payload { pub completed_at: String, - pub duration_ms: i32, pub model: String, pub prompt_tokens: String, pub completion_tokens: String, } -pub struct UsageData { +struct UsageData { organization_id: String, instance_id: String, - duration_ms: i32, - prompt_tokens: i32, - completion_tokens: i32, + prompt_tokens: Option, + completion_tokens: Option, model: String, - completed_at: DateTime, + completed_at: Option>, } //TODO: Add unit tests From 9d2aec3809c064872010a11e2c7fcd63a3052b4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:20:32 -0300 Subject: [PATCH 06/14] WIP daemon --- inference-gateway/Cargo.toml | 4 ++++ inference-gateway/src/daemon.rs | 12 ++++++++++++ inference-gateway/src/events_reporter.rs | 6 ++++-- inference-gateway/src/lib.rs | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 inference-gateway/src/daemon.rs diff --git a/inference-gateway/Cargo.toml b/inference-gateway/Cargo.toml index f4234998c..534958032 100644 --- a/inference-gateway/Cargo.toml +++ b/inference-gateway/Cargo.toml @@ -4,6 +4,10 @@ version = "0.1.0" edition = "2021" publish = false +[[bin]] +name = "gateway-daemon" +path = "src/daemon.rs" + [dependencies] actix-cors = "0.7.0" actix-rt = "2.10.0" diff --git a/inference-gateway/src/daemon.rs b/inference-gateway/src/daemon.rs new file mode 100644 index 000000000..9983632d0 --- /dev/null +++ b/inference-gateway/src/daemon.rs @@ -0,0 +1,12 @@ +//! Custom entrypoint for background running services + +use std::sync::Arc; +use tokio::sync::Mutex; + +#[tokio::main] +async fn main() { + let background_threads: Arc>>> = + Arc::new(Mutex::new(Vec::new())); + + +} \ No newline at end of file diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index aa0a17830..15fba5788 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -55,7 +55,7 @@ pub async fn get_usage( Ok(rows_to_events(rows)) } -pub fn rows_to_events(rows: Vec) -> Vec { +fn rows_to_events(rows: Vec) -> Vec { rows.into_iter() .map(|row| { // Parse the completed_at string into a DateTime and convert to hour @@ -83,6 +83,8 @@ pub fn rows_to_events(rows: Vec) -> Vec { pub async fn events_reporter() -> Result<()> { const BATCH_SIZE: usize = 1000; + // Run once per hour + const SYNC_PERIOD: Duration = Duration::from_secs(60 * 60); let pg_conn_url = env::var("POSTGRES_QUEUE_CONNECTION") .with_context(|| "POSTGRES_QUEUE_CONNECTION must be set")?; @@ -97,7 +99,7 @@ pub async fn events_reporter() -> Result<()> { queue.init().await?; queue.create(&metrics_events_queue).await?; - let mut sync_interval = interval(Duration::from_secs(3600)); + let mut sync_interval = interval(SYNC_PERIOD); loop { sync_interval.tick().await; diff --git a/inference-gateway/src/lib.rs b/inference-gateway/src/lib.rs index c55225c4f..75f44ac9b 100644 --- a/inference-gateway/src/lib.rs +++ b/inference-gateway/src/lib.rs @@ -4,4 +4,4 @@ pub mod db; pub mod errors; pub mod events_reporter; pub mod routes; -pub mod server; +pub mod server; \ No newline at end of file From ba34db7bd542b441b4e05afbaa020f7a4f6b446c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:08:34 -0300 Subject: [PATCH 07/14] Add watermark, divide into hourly chunks --- ...ef1e43a453a5968008de3dc841412108aa2b7.json | 20 +++ ...40829182243_billing.reporter_watermark.sql | 6 + inference-gateway/src/daemon.rs | 4 +- inference-gateway/src/events_reporter.rs | 127 +++++++++++++++++- inference-gateway/src/lib.rs | 2 +- 5 files changed, 152 insertions(+), 7 deletions(-) create mode 100644 inference-gateway/.sqlx/query-19dfb5233dddcc014bcc597b1e1ef1e43a453a5968008de3dc841412108aa2b7.json create mode 100644 inference-gateway/migrations/20240829182243_billing.reporter_watermark.sql diff --git a/inference-gateway/.sqlx/query-19dfb5233dddcc014bcc597b1e1ef1e43a453a5968008de3dc841412108aa2b7.json b/inference-gateway/.sqlx/query-19dfb5233dddcc014bcc597b1e1ef1e43a453a5968008de3dc841412108aa2b7.json new file mode 100644 index 000000000..839c59bcf --- /dev/null +++ b/inference-gateway/.sqlx/query-19dfb5233dddcc014bcc597b1e1ef1e43a453a5968008de3dc841412108aa2b7.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT last_reported_at FROM billing.reporter_watermark LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "last_reported_at", + "type_info": "Timestamp" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false + ] + }, + "hash": "19dfb5233dddcc014bcc597b1e1ef1e43a453a5968008de3dc841412108aa2b7" +} diff --git a/inference-gateway/migrations/20240829182243_billing.reporter_watermark.sql b/inference-gateway/migrations/20240829182243_billing.reporter_watermark.sql new file mode 100644 index 000000000..2e727ce8a --- /dev/null +++ b/inference-gateway/migrations/20240829182243_billing.reporter_watermark.sql @@ -0,0 +1,6 @@ +CREATE SCHEMA IF NOT EXISTS billing; + +CREATE TABLE billing.reporter_watermark ( + -- Timestamp in which the reporter last ran successfully + last_reported_at timestamp with time zone NOT NULL +); diff --git a/inference-gateway/src/daemon.rs b/inference-gateway/src/daemon.rs index 9983632d0..d642b5849 100644 --- a/inference-gateway/src/daemon.rs +++ b/inference-gateway/src/daemon.rs @@ -7,6 +7,4 @@ use tokio::sync::Mutex; async fn main() { let background_threads: Arc>>> = Arc::new(Mutex::new(Vec::new())); - - -} \ No newline at end of file +} diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index 15fba5788..98bdf51a0 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -1,9 +1,9 @@ use anyhow::{Context, Result}; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, Datelike, Duration as ChronoDuration, TimeZone, Timelike, Utc}; use log::info; use pgmq::PGMQueueExt; use serde::{Deserialize, Serialize}; -use sqlx::{Pool, Postgres}; +use sqlx::{PgPool, Pool, Postgres}; use std::{env, time::Duration}; use tokio::time::interval; use uuid::Uuid; @@ -81,6 +81,47 @@ fn rows_to_events(rows: Vec) -> Vec { .collect() } +async fn get_reporter_watermark(conn: &PgPool) -> Result> { + sqlx::query_as!( + ReporterWatermark, + "SELECT last_reported_at FROM billing.reporter_watermark LIMIT 1" + ) + .fetch_optional(conn) + .await + .map_err(Into::into) +} + +fn start_of_the_hour(datetime: DateTime) -> DateTime { + // Safe unwrap since, according to chrono docs, Utc will never have double mappings + Utc.with_ymd_and_hms( + datetime.year(), + datetime.month(), + datetime.day(), + datetime.hour(), + 0, + 0, + ) + .unwrap() +} + +fn get_hourly_chunks( + last_reported_at: DateTime, + now: DateTime, +) -> Vec<(DateTime, DateTime)> { + let last_complete_hour = start_of_the_hour(now); + + let mut chunks = Vec::new(); + let mut chunk_start = start_of_the_hour(last_reported_at); + + while chunk_start < last_complete_hour { + let chunk_end = chunk_start + ChronoDuration::hours(1) - ChronoDuration::nanoseconds(1); + chunks.push((chunk_start, chunk_end)); + chunk_start = chunk_start + ChronoDuration::hours(1); + } + + chunks +} + pub async fn events_reporter() -> Result<()> { const BATCH_SIZE: usize = 1000; // Run once per hour @@ -101,6 +142,11 @@ pub async fn events_reporter() -> Result<()> { let mut sync_interval = interval(SYNC_PERIOD); + let last_reported_at = get_reporter_watermark(&dbclient) + .await? + .map(|watermark| watermark.last_reported_at) + .unwrap_or(Utc::now() - Duration::from_secs(60 * 60)); + loop { sync_interval.tick().await; @@ -157,4 +203,79 @@ struct UsageData { completed_at: Option>, } -//TODO: Add unit tests +#[derive(sqlx::FromRow, Debug)] +struct ReporterWatermark { + last_reported_at: DateTime, +} + +#[cfg(test)] +mod tests { + use chrono::{DateTime, Duration, FixedOffset, TimeZone, Timelike, Utc}; + + use crate::events_reporter::start_of_the_hour; + + use super::get_hourly_chunks; + + #[test] + fn test_start_of_hour_middle_of_hour() { + // Middle of the hour + let input = Utc.with_ymd_and_hms(2023, 5, 10, 15, 30, 45).unwrap(); + let expected = Utc.with_ymd_and_hms(2023, 5, 10, 15, 0, 0).unwrap(); + assert_eq!(start_of_the_hour(input), expected); + + // Already at start of the hour + let input = Utc.with_ymd_and_hms(2023, 5, 10, 15, 0, 0).unwrap(); + let expected = Utc.with_ymd_and_hms(2023, 5, 10, 15, 0, 0).unwrap(); + assert_eq!(start_of_the_hour(input), expected); + + // End of the hour + let input = Utc.with_ymd_and_hms(2023, 5, 10, 15, 59, 59).unwrap(); + let expected = Utc.with_ymd_and_hms(2023, 5, 10, 15, 0, 0).unwrap(); + assert_eq!(start_of_the_hour(input), expected); + + // Midnight + let input = Utc.with_ymd_and_hms(2023, 5, 10, 0, 30, 0).unwrap(); + let expected = Utc.with_ymd_and_hms(2023, 5, 10, 0, 0, 0).unwrap(); + assert_eq!(start_of_the_hour(input), expected); + + // Different timezone (EST) + let est = FixedOffset::west_opt(5 * 3600).unwrap(); // UTC-5 + let input_est = est.with_ymd_and_hms(2023, 5, 10, 10, 30, 0).unwrap(); + let input_utc: DateTime = input_est.with_timezone(&Utc); + let expected = Utc.with_ymd_and_hms(2023, 5, 10, 15, 0, 0).unwrap(); + assert_eq!(start_of_the_hour(input_utc), expected); + } + + #[test] + fn test_generate_hourly_chunks() { + // Mock current time as 2023-05-10 15:40:00 UTC + let now = Utc.with_ymd_and_hms(2023, 5, 10, 15, 40, 0).unwrap(); + + // Set last_reported_at to 2023-05-10 12:20:00 UTC + let last_reported_at = Utc.with_ymd_and_hms(2023, 5, 10, 12, 20, 0).unwrap(); + + // Generate chunks + let chunks = get_hourly_chunks(last_reported_at, now); + + // Expected chunks + let expected_chunks = vec![ + // 2023-05-10 12:00:00 UTC to 2023-05-10 12:59:59 UTC + ( + Utc.with_ymd_and_hms(2023, 5, 10, 12, 0, 0).unwrap(), + Utc.with_ymd_and_hms(2023, 5, 10, 12, 59, 59).unwrap().with_nanosecond(999999999).unwrap(), + ), + // 2023-05-10 13:00:00 UTC to 2023-05-10 13:59:59 UTC + ( + Utc.with_ymd_and_hms(2023, 5, 10, 13, 0, 0).unwrap(), + Utc.with_ymd_and_hms(2023, 5, 10, 13, 59, 59).unwrap().with_nanosecond(999999999).unwrap(), + ), + // 2023-05-10 14:00:00 UTC to 2023-05-10 14:59:59 UTC + ( + Utc.with_ymd_and_hms(2023, 5, 10, 14, 0, 0).unwrap(), + Utc.with_ymd_and_hms(2023, 5, 10, 14, 59, 59).unwrap().with_nanosecond(999999999).unwrap(), + ), + ]; + + assert_eq!(chunks, expected_chunks); + } +} diff --git a/inference-gateway/src/lib.rs b/inference-gateway/src/lib.rs index 75f44ac9b..c55225c4f 100644 --- a/inference-gateway/src/lib.rs +++ b/inference-gateway/src/lib.rs @@ -4,4 +4,4 @@ pub mod db; pub mod errors; pub mod events_reporter; pub mod routes; -pub mod server; \ No newline at end of file +pub mod server; From 53c4b50474fb9848b0340f1796506b0873663175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Fri, 30 Aug 2024 02:11:50 -0300 Subject: [PATCH 08/14] Get request chunks for each hour, enqueue them --- inference-gateway/src/events_reporter.rs | 72 ++++++++++++++++-------- 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index 98bdf51a0..8e5f1fb55 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -123,7 +123,6 @@ fn get_hourly_chunks( } pub async fn events_reporter() -> Result<()> { - const BATCH_SIZE: usize = 1000; // Run once per hour const SYNC_PERIOD: Duration = Duration::from_secs(60 * 60); @@ -142,36 +141,50 @@ pub async fn events_reporter() -> Result<()> { let mut sync_interval = interval(SYNC_PERIOD); - let last_reported_at = get_reporter_watermark(&dbclient) - .await? - .map(|watermark| watermark.last_reported_at) - .unwrap_or(Utc::now() - Duration::from_secs(60 * 60)); - loop { sync_interval.tick().await; - let end_time = Utc::now(); - let start_time = end_time - chrono::Duration::hours(1); - // TODO: Get the correct postgres connection URL - let events = get_usage(&dbclient, start_time, end_time).await?; - - let metrics_to_send = split_events(events, BATCH_SIZE); - let batches = metrics_to_send.len(); + let last_reported_at = get_reporter_watermark(&dbclient) + .await? + .map(|watermark| watermark.last_reported_at) + .unwrap_or(Utc::now() - Duration::from_secs(60 * 60)); + let now = Utc::now(); - info!( - "Split metrics into {} chunks, each with {} results", - batches, BATCH_SIZE - ); + let chunks = get_hourly_chunks(last_reported_at, now); - let mut i = 1; - for event in &metrics_to_send { - queue.send(&metrics_events_queue, event).await?; - info!("Enqueued batch {}/{} to PGMQ", i, batches); - i += 1; + for (start_time, end_time) in chunks { + enqueue_event(&dbclient, &queue, &metrics_events_queue, start_time, end_time).await?; } } } +async fn enqueue_event( + pool: &Pool, + queue: &PGMQueueExt, + metrics_events_queue: &str, + start_time: DateTime, + end_time: DateTime +) -> Result<(), anyhow::Error> { + const BATCH_SIZE: usize = 1000; + + let events = get_usage(pool, start_time, end_time).await?; + let metrics_to_send = split_events(events, BATCH_SIZE); + let batches = metrics_to_send.len(); + info!( + "Split metrics into {} chunks, each with {} results", + batches, BATCH_SIZE + ); + let mut i = 1; + + for event in &metrics_to_send { + queue.send(metrics_events_queue, event).await?; + info!("Enqueued batch {}/{} for {} to PGMQ", i, batches, start_time.format("%Y-%m-%d %H:%M:%S %Z")); + i += 1; + } + + Ok(()) +} + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct Message { pub id: String, @@ -262,17 +275,26 @@ mod tests { // 2023-05-10 12:00:00 UTC to 2023-05-10 12:59:59 UTC ( Utc.with_ymd_and_hms(2023, 5, 10, 12, 0, 0).unwrap(), - Utc.with_ymd_and_hms(2023, 5, 10, 12, 59, 59).unwrap().with_nanosecond(999999999).unwrap(), + Utc.with_ymd_and_hms(2023, 5, 10, 12, 59, 59) + .unwrap() + .with_nanosecond(999999999) + .unwrap(), ), // 2023-05-10 13:00:00 UTC to 2023-05-10 13:59:59 UTC ( Utc.with_ymd_and_hms(2023, 5, 10, 13, 0, 0).unwrap(), - Utc.with_ymd_and_hms(2023, 5, 10, 13, 59, 59).unwrap().with_nanosecond(999999999).unwrap(), + Utc.with_ymd_and_hms(2023, 5, 10, 13, 59, 59) + .unwrap() + .with_nanosecond(999999999) + .unwrap(), ), // 2023-05-10 14:00:00 UTC to 2023-05-10 14:59:59 UTC ( Utc.with_ymd_and_hms(2023, 5, 10, 14, 0, 0).unwrap(), - Utc.with_ymd_and_hms(2023, 5, 10, 14, 59, 59).unwrap().with_nanosecond(999999999).unwrap(), + Utc.with_ymd_and_hms(2023, 5, 10, 14, 59, 59) + .unwrap() + .with_nanosecond(999999999) + .unwrap(), ), ]; From db06a0ca4065b075d17a215b37a161a3e00995bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Thu, 5 Sep 2024 23:42:57 -0300 Subject: [PATCH 09/14] Add WIP events_reporter --- ...ef1e43a453a5968008de3dc841412108aa2b7.json | 2 +- inference-gateway/Makefile | 3 + inference-gateway/src/config.rs | 4 ++ inference-gateway/src/daemon.rs | 68 ++++++++++++++++++- inference-gateway/src/events_reporter.rs | 20 ++++-- 5 files changed, 91 insertions(+), 6 deletions(-) diff --git a/inference-gateway/.sqlx/query-19dfb5233dddcc014bcc597b1e1ef1e43a453a5968008de3dc841412108aa2b7.json b/inference-gateway/.sqlx/query-19dfb5233dddcc014bcc597b1e1ef1e43a453a5968008de3dc841412108aa2b7.json index 839c59bcf..0cfe6a7a5 100644 --- a/inference-gateway/.sqlx/query-19dfb5233dddcc014bcc597b1e1ef1e43a453a5968008de3dc841412108aa2b7.json +++ b/inference-gateway/.sqlx/query-19dfb5233dddcc014bcc597b1e1ef1e43a453a5968008de3dc841412108aa2b7.json @@ -6,7 +6,7 @@ { "ordinal": 0, "name": "last_reported_at", - "type_info": "Timestamp" + "type_info": "Timestamptz" } ], "parameters": { diff --git a/inference-gateway/Makefile b/inference-gateway/Makefile index 20747e599..9bb793f51 100644 --- a/inference-gateway/Makefile +++ b/inference-gateway/Makefile @@ -9,6 +9,9 @@ fmt: cargo fmt --all cargo clippy +prepare: + cargo sqlx prepare + check: cargo fmt --all --check cargo clippy diff --git a/inference-gateway/src/config.rs b/inference-gateway/src/config.rs index ab884e5b4..734823ac0 100644 --- a/inference-gateway/src/config.rs +++ b/inference-gateway/src/config.rs @@ -18,6 +18,7 @@ pub struct Config { pub org_auth_enabled: bool, /// Interval to refresh the billing authorization cache pub org_auth_cache_refresh_interval_sec: u64, + pub run_billing_reporter: bool, } impl Config { @@ -43,6 +44,9 @@ impl Config { ) .parse() .expect("ORG_AUTH_CACHE_REFRESH_INTERVAL_SEC must be an integer"), + run_billing_reporter: from_env_default("RUN_BILLING_REPORTER", "false") + .parse() + .unwrap(), } } } diff --git a/inference-gateway/src/daemon.rs b/inference-gateway/src/daemon.rs index d642b5849..8432e6ec2 100644 --- a/inference-gateway/src/daemon.rs +++ b/inference-gateway/src/daemon.rs @@ -1,10 +1,76 @@ //! Custom entrypoint for background running services +use actix_web::{get, web, App, HttpResponse, HttpServer, Responder}; +use gateway::config::Config; +use gateway::events_reporter::run_events_reporter; +use gateway::{db, events_reporter}; +use log::info; +use sqlx::PgPool; use std::sync::Arc; +use std::time::Duration; use tokio::sync::Mutex; #[tokio::main] -async fn main() { +async fn main() -> Result<(), Box> { + let cfg = Config::new().await; + let pool: PgPool = db::connect(&cfg.pg_conn_str, cfg.server_workers as u32) + .await + .expect("Failed to connect to database"); + let background_threads: Arc>>> = Arc::new(Mutex::new(Vec::new())); + + let mut background_threads_guard = background_threads.lock().await; + + if cfg.run_billing_reporter { + info!("Spawning AI billing reporter thread"); + + background_threads_guard.push(tokio::spawn(async { + if let Err(err) = run_events_reporter().await { + log::error!("Tembo AI billing reporter error: {err}"); + log::info!("Restarting Tembo AI billing reporter in 30 sec"); + tokio::time::sleep(Duration::from_secs(30)).await; + } + })); + } + + std::mem::drop(background_threads_guard); + + let server_port = std::env::var("PORT") + .unwrap_or_else(|_| String::from("8080")) + .parse::() + .unwrap_or(8080); + + info!( + "Starting Tembo AI Billing actix-web server on http://0.0.0.0:{}", + server_port + ); + + let _ = HttpServer::new(move || { + App::new() + .app_data(web::Data::new(background_threads.clone())) + .service(web::scope("/health").service(background_threads_running)) + }) + .workers(4) + .bind(("0.0.0.0", server_port))? + .run() + .await; + + Ok(()) +} + +#[get("/lively")] +pub async fn background_threads_running( + background_threads: web::Data>>>>, +) -> impl Responder { + let background_threads = background_threads.lock().await; + + for thread in background_threads.iter() { + if thread.is_finished() { + return HttpResponse::InternalServerError() + .body("One or more background tasks are not running."); + } + } + + HttpResponse::Ok().json("ok") } diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index 8e5f1fb55..13c6a220a 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -122,7 +122,7 @@ fn get_hourly_chunks( chunks } -pub async fn events_reporter() -> Result<()> { +pub async fn run_events_reporter() -> Result<()> { // Run once per hour const SYNC_PERIOD: Duration = Duration::from_secs(60 * 60); @@ -153,7 +153,14 @@ pub async fn events_reporter() -> Result<()> { let chunks = get_hourly_chunks(last_reported_at, now); for (start_time, end_time) in chunks { - enqueue_event(&dbclient, &queue, &metrics_events_queue, start_time, end_time).await?; + enqueue_event( + &dbclient, + &queue, + &metrics_events_queue, + start_time, + end_time, + ) + .await?; } } } @@ -163,7 +170,7 @@ async fn enqueue_event( queue: &PGMQueueExt, metrics_events_queue: &str, start_time: DateTime, - end_time: DateTime + end_time: DateTime, ) -> Result<(), anyhow::Error> { const BATCH_SIZE: usize = 1000; @@ -178,7 +185,12 @@ async fn enqueue_event( for event in &metrics_to_send { queue.send(metrics_events_queue, event).await?; - info!("Enqueued batch {}/{} for {} to PGMQ", i, batches, start_time.format("%Y-%m-%d %H:%M:%S %Z")); + info!( + "Enqueued batch {}/{} for {} to PGMQ", + i, + batches, + start_time.format("%Y-%m-%d %H:%M:%S %Z") + ); i += 1; } From 73ddc58d9432cfca23b8029cdf2013619eaeaedd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:12:04 -0300 Subject: [PATCH 10/14] Pass queue as argument --- inference-gateway/src/events_reporter.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index 13c6a220a..c29545939 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -122,15 +122,11 @@ fn get_hourly_chunks( chunks } -pub async fn run_events_reporter() -> Result<()> { +pub async fn run_events_reporter(pool: PgPool) -> Result<()> { // Run once per hour const SYNC_PERIOD: Duration = Duration::from_secs(60 * 60); - let pg_conn_url = env::var("POSTGRES_QUEUE_CONNECTION") - .with_context(|| "POSTGRES_QUEUE_CONNECTION must be set")?; - let dbclient = connect(&pg_conn_url, 5).await?; - - let queue = PGMQueueExt::new(pg_conn_url, 5).await?; + // let queue = PGMQueueExt::new(pg_conn_url, 5).await?; // TODO: Need to set this env variable let metrics_events_queue = From 5563e78465836d21c3fa8b5adf5d8420ac361950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Wed, 11 Sep 2024 18:58:37 -0300 Subject: [PATCH 11/14] Use the correct billing queue, solve pgmq build error --- inference-gateway/Cargo.lock | 811 +++++++++++++---------- inference-gateway/Cargo.toml | 4 +- inference-gateway/src/daemon.rs | 19 +- inference-gateway/src/events_reporter.rs | 30 +- 4 files changed, 465 insertions(+), 399 deletions(-) diff --git a/inference-gateway/Cargo.lock b/inference-gateway/Cargo.lock index 748fef2d8..5e40b16fa 100644 --- a/inference-gateway/Cargo.lock +++ b/inference-gateway/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.5.0", + "bitflags", "bytes", "futures-core", "futures-sink", @@ -36,17 +36,17 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.6.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d223b13fd481fc0d1f83bb12659ae774d9e3601814c68a0bc539731698cca743" +checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", "ahash", - "base64 0.21.7", - "bitflags 2.5.0", + "base64", + "bitflags", "brotli", "bytes", "bytestring", @@ -80,18 +80,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.63", + "syn", ] [[package]] name = "actix-router" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22475596539443685426b6bdadb926ad0ecaefdfc5fb05e5e3441f15463c511" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" dependencies = [ "bytestring", + "cfg-if", "http 0.2.12", "regex", + "regex-lite", "serde", "tracing", ] @@ -109,9 +111,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" +checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" dependencies = [ "actix-rt", "actix-service", @@ -147,9 +149,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.5.1" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a6556ddebb638c2358714d853257ed226ece6023ef9364f23f0c70737ea984" +checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" dependencies = [ "actix-codec", "actix-http", @@ -169,6 +171,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", + "impl-more", "itoa", "language-tags", "log", @@ -176,6 +179,7 @@ dependencies = [ "once_cell", "pin-project-lite", "regex", + "regex-lite", "serde", "serde_json", "serde_urlencoded", @@ -187,30 +191,30 @@ dependencies = [ [[package]] name = "actix-web-codegen" -version = "4.2.2" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.63", + "syn", ] [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" @@ -272,9 +276,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -287,33 +291,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -321,9 +325,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356" [[package]] name = "atoi" @@ -334,6 +338,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.3.0" @@ -342,25 +352,19 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -375,15 +379,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -399,9 +397,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.5.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -410,9 +408,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -432,9 +430,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "bytestring" @@ -447,9 +445,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.16" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" +checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" dependencies = [ "jobserver", "libc", @@ -474,14 +472,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "concurrent-queue" @@ -527,15 +525,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -557,9 +555,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -575,9 +573,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crypto-common" @@ -611,15 +609,15 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn", ] [[package]] @@ -642,9 +640,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" dependencies = [ "serde", ] @@ -660,9 +658,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ "log", "regex", @@ -670,9 +668,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" dependencies = [ "anstream", "anstyle", @@ -721,21 +719,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "finl_unicode" -version = "1.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", "miniz_oxide", @@ -749,7 +741,7 @@ checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", - "spin 0.9.8", + "spin", ] [[package]] @@ -902,9 +894,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "h2" @@ -927,15 +919,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http 1.1.0", "indexmap", "slab", @@ -1032,9 +1024,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http 1.1.0", @@ -1042,12 +1034,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http 1.1.0", "http-body", "pin-project-lite", @@ -1055,9 +1047,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1073,14 +1065,14 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.4", + "h2 0.4.6", "http 1.1.0", "http-body", "httparse", @@ -1091,6 +1083,23 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.6.0" @@ -1109,9 +1118,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" dependencies = [ "bytes", "futures-channel", @@ -1160,11 +1169,17 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "impl-more" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" + [[package]] name = "indexmap" -version = "2.2.6" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown", @@ -1172,24 +1187,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" @@ -1199,18 +1205,18 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -1223,18 +1229,18 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] name = "libc" -version = "0.2.154" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libm" @@ -1255,9 +1261,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "local-channel" @@ -1288,9 +1294,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "md-5" @@ -1304,9 +1310,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1322,32 +1328,32 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", "log", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1422,21 +1428,11 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "object" -version = "0.32.2" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] @@ -1449,11 +1445,11 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.5.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -1470,7 +1466,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn", ] [[package]] @@ -1481,9 +1477,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -1493,15 +1489,15 @@ dependencies = [ [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1515,9 +1511,9 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.1", + "redox_syscall", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -1543,9 +1539,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pgmq" -version = "0.28.2" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f730831e2479ec2a67eb59c01b43565a77ba7b97f14a3c6bd4c5351ff3dab88" +checksum = "69d264c88419c1e1021c2175f93e3072743a8caa02d62e9d565f4f9472106c4a" dependencies = [ "chrono", "log", @@ -1574,7 +1570,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn", ] [[package]] @@ -1624,24 +1620,27 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -1678,27 +1677,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "bitflags 2.5.0", + "bitflags", ] [[package]] name = "regex" -version = "1.10.4" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -1708,37 +1698,44 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.4", + "h2 0.4.6", "http 1.1.0", "http-body", "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", "hyper-util", "ipnet", @@ -1762,7 +1759,22 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "windows-registry", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", ] [[package]] @@ -1793,41 +1805,65 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags 2.5.0", + "bitflags", "errno", "libc", "linux-raw-sys", "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.23.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ - "base64 0.22.1", + "base64", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] [[package]] name = "ryu" @@ -1837,11 +1873,11 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1852,11 +1888,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.5.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -1865,9 +1901,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -1881,31 +1917,32 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.202" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn", ] [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -1997,12 +2034,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -2024,11 +2055,10 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ - "itertools", "nom", "unicode_categories", ] @@ -2097,7 +2127,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.63", + "syn", ] [[package]] @@ -2120,7 +2150,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.63", + "syn", "tempfile", "tokio", "url", @@ -2133,8 +2163,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" dependencies = [ "atoi", - "base64 0.22.1", - "bitflags 2.5.0", + "base64", + "bitflags", "byteorder", "bytes", "chrono", @@ -2176,8 +2206,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ "atoi", - "base64 0.22.1", - "bitflags 2.5.0", + "base64", + "bitflags", "byteorder", "chrono", "crc", @@ -2234,26 +2264,26 @@ dependencies = [ [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -2261,38 +2291,30 @@ dependencies = [ ] [[package]] -name = "syn" -version = "2.0.63" +name = "sync_wrapper" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "futures-core", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -2300,34 +2322,35 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.60" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn", ] [[package]] @@ -2363,9 +2386,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -2378,32 +2401,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn", ] [[package]] @@ -2416,11 +2438,22 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -2429,9 +2462,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -2453,20 +2486,19 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -2488,7 +2520,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn", ] [[package]] @@ -2520,9 +2552,9 @@ checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -2533,17 +2565,29 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" + [[package]] name = "unicode_categories" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -2552,9 +2596,9 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" @@ -2573,9 +2617,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" @@ -2600,34 +2644,35 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.63", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -2637,9 +2682,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2647,28 +2692,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -2676,11 +2721,11 @@ dependencies = [ [[package]] name = "whoami" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.4.1", + "redox_syscall", "wasite", ] @@ -2690,7 +2735,37 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -2708,7 +2783,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -2728,18 +2812,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -2750,9 +2834,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -2762,9 +2846,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -2774,15 +2858,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -2792,9 +2876,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -2804,9 +2888,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -2816,9 +2900,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -2828,69 +2912,60 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zstd" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.1.0" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.10+zstd.1.5.6" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", diff --git a/inference-gateway/Cargo.toml b/inference-gateway/Cargo.toml index a5e18ba56..40aa82e35 100644 --- a/inference-gateway/Cargo.toml +++ b/inference-gateway/Cargo.toml @@ -19,12 +19,12 @@ log = "0.4.21" reqwest = { version = "0.12.4", features = ["json"] } serde = { version = "1.0.202", features = ["derive"] } serde_json = "1.0.117" -sqlx = { version = "0.8", features = [ "runtime-tokio-native-tls", "postgres", "chrono", "json"] } +sqlx = { version = "0.8.2", default-features = false, features = [ "runtime-tokio-native-tls", "postgres", "chrono", "json"] } thiserror = "1.0.60" tokio = { version = "1", features = ["full"] } url = "2.5.0" uuid = { version = "1.10.0", features = ["v4"] } -pgmq = "0.28.2" +pgmq = "0.29.2" [dev-dependencies] actix-http = "3.6.0" diff --git a/inference-gateway/src/daemon.rs b/inference-gateway/src/daemon.rs index 8432e6ec2..47749509a 100644 --- a/inference-gateway/src/daemon.rs +++ b/inference-gateway/src/daemon.rs @@ -3,9 +3,7 @@ use actix_web::{get, web, App, HttpResponse, HttpServer, Responder}; use gateway::config::Config; use gateway::events_reporter::run_events_reporter; -use gateway::{db, events_reporter}; use log::info; -use sqlx::PgPool; use std::sync::Arc; use std::time::Duration; use tokio::sync::Mutex; @@ -13,9 +11,6 @@ use tokio::sync::Mutex; #[tokio::main] async fn main() -> Result<(), Box> { let cfg = Config::new().await; - let pool: PgPool = db::connect(&cfg.pg_conn_str, cfg.server_workers as u32) - .await - .expect("Failed to connect to database"); let background_threads: Arc>>> = Arc::new(Mutex::new(Vec::new())); @@ -25,11 +20,15 @@ async fn main() -> Result<(), Box> { if cfg.run_billing_reporter { info!("Spawning AI billing reporter thread"); - background_threads_guard.push(tokio::spawn(async { - if let Err(err) = run_events_reporter().await { - log::error!("Tembo AI billing reporter error: {err}"); - log::info!("Restarting Tembo AI billing reporter in 30 sec"); - tokio::time::sleep(Duration::from_secs(30)).await; + let pg_conn = cfg.pg_conn_str.clone(); + + background_threads_guard.push(tokio::spawn(async move { + loop { + if let Err(err) = run_events_reporter(pg_conn.clone()).await { + log::error!("Tembo AI billing reporter error: {err}"); + log::info!("Restarting Tembo AI billing reporter in 30 sec"); + tokio::time::sleep(Duration::from_secs(30)).await; + } } })); } diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index c29545939..5ff7a9d55 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -1,14 +1,14 @@ -use anyhow::{Context, Result}; +use anyhow::Result; use chrono::{DateTime, Datelike, Duration as ChronoDuration, TimeZone, Timelike, Utc}; use log::info; use pgmq::PGMQueueExt; use serde::{Deserialize, Serialize}; use sqlx::{PgPool, Pool, Postgres}; -use std::{env, time::Duration}; +use std::time::Duration; use tokio::time::interval; use uuid::Uuid; -use crate::db::connect; +use crate::db::{self}; use crate::errors::DatabaseError; pub fn split_events(events: Vec, max_size: usize) -> Vec { @@ -122,25 +122,24 @@ fn get_hourly_chunks( chunks } -pub async fn run_events_reporter(pool: PgPool) -> Result<()> { +pub async fn run_events_reporter(pg_conn: String) -> Result<()> { // Run once per hour const SYNC_PERIOD: Duration = Duration::from_secs(60 * 60); + const BILLING_QUEUE: &str = "billing_aws_data_1_use1"; - // let queue = PGMQueueExt::new(pg_conn_url, 5).await?; + let pool = db::connect(&pg_conn, 2).await?; - // TODO: Need to set this env variable - let metrics_events_queue = - env::var("BILLING_EVENTS_QUEUE").expect("BILLING_EVENTS_QUEUE must be set"); + let queue = PGMQueueExt::new(pg_conn, 2).await?; queue.init().await?; - queue.create(&metrics_events_queue).await?; + queue.create("").await?; let mut sync_interval = interval(SYNC_PERIOD); loop { sync_interval.tick().await; - let last_reported_at = get_reporter_watermark(&dbclient) + let last_reported_at = get_reporter_watermark(&pool) .await? .map(|watermark| watermark.last_reported_at) .unwrap_or(Utc::now() - Duration::from_secs(60 * 60)); @@ -149,14 +148,7 @@ pub async fn run_events_reporter(pool: PgPool) -> Result<()> { let chunks = get_hourly_chunks(last_reported_at, now); for (start_time, end_time) in chunks { - enqueue_event( - &dbclient, - &queue, - &metrics_events_queue, - start_time, - end_time, - ) - .await?; + enqueue_event(&pool, &queue, BILLING_QUEUE, start_time, end_time).await?; } } } @@ -231,7 +223,7 @@ struct ReporterWatermark { #[cfg(test)] mod tests { - use chrono::{DateTime, Duration, FixedOffset, TimeZone, Timelike, Utc}; + use chrono::{DateTime, FixedOffset, TimeZone, Timelike, Utc}; use crate::events_reporter::start_of_the_hour; From 367979cd52add47ebc9549e46883bfcb2088c47d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Thu, 12 Sep 2024 15:48:44 -0300 Subject: [PATCH 12/14] CI: install `pgmq` --- inference-gateway/docker/Dockerfile.postgres | 1 + 1 file changed, 1 insertion(+) diff --git a/inference-gateway/docker/Dockerfile.postgres b/inference-gateway/docker/Dockerfile.postgres index 8b6bb48f8..d64e25f6e 100644 --- a/inference-gateway/docker/Dockerfile.postgres +++ b/inference-gateway/docker/Dockerfile.postgres @@ -4,6 +4,7 @@ RUN trunk install pg_timeseries --version 0.1.5 RUN trunk install pg_cron --version 1.6.2 RUN trunk install pg_partman --version 5.0.1 RUN trunk install postgres_fdw --version 1.1.0 +RUN trunk install pgmq --version 1.3.3 USER root From 4e3a77c8326a0e97d70c026f66b16ff9c263e02f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Thu, 12 Sep 2024 16:11:26 -0300 Subject: [PATCH 13/14] Add migration to `create extension pgmq` --- .../migrations/20240912191100_create-extension-pgmq.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 inference-gateway/migrations/20240912191100_create-extension-pgmq.sql diff --git a/inference-gateway/migrations/20240912191100_create-extension-pgmq.sql b/inference-gateway/migrations/20240912191100_create-extension-pgmq.sql new file mode 100644 index 000000000..5a55d4c72 --- /dev/null +++ b/inference-gateway/migrations/20240912191100_create-extension-pgmq.sql @@ -0,0 +1 @@ +CREATE EXTENSION IF NOT EXISTS pgmq CASCADE; \ No newline at end of file From ec58e5aabeb5e5b12e99464ed0a708baff4cbf44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Miguel?= <36349314+vrmiguel@users.noreply.github.com> Date: Thu, 12 Sep 2024 16:28:52 -0300 Subject: [PATCH 14/14] Fix wrong argument to queue.create --- inference-gateway/src/events_reporter.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inference-gateway/src/events_reporter.rs b/inference-gateway/src/events_reporter.rs index 5ff7a9d55..a12582fda 100644 --- a/inference-gateway/src/events_reporter.rs +++ b/inference-gateway/src/events_reporter.rs @@ -132,7 +132,7 @@ pub async fn run_events_reporter(pg_conn: String) -> Result<()> { let queue = PGMQueueExt::new(pg_conn, 2).await?; queue.init().await?; - queue.create("").await?; + queue.create(BILLING_QUEUE).await?; let mut sync_interval = interval(SYNC_PERIOD);