@@ -2,6 +2,7 @@ mod client;
22mod config;
33
44use crate :: client:: runtime_status:: TaurusRuntimeStatusService ;
5+ use crate :: client:: runtime_usage:: TaurusRuntimeUsageService ;
56use crate :: config:: Config ;
67use code0_flow:: flow_service:: FlowUpdateService ;
78
@@ -11,16 +12,20 @@ use futures_lite::StreamExt;
1112use log:: error;
1213use prost:: Message ;
1314use std:: collections:: HashMap ;
15+ use std:: time:: { Instant , SystemTime , UNIX_EPOCH } ;
1416use taurus_core:: context:: context:: Context ;
1517use taurus_core:: context:: executor:: Executor ;
1618use taurus_core:: context:: registry:: FunctionStore ;
1719use taurus_core:: context:: signal:: Signal ;
1820use tokio:: signal;
1921use tonic_health:: pb:: health_server:: HealthServer ;
2022use tucana:: shared:: value:: Kind ;
21- use tucana:: shared:: { ExecutionFlow , NodeFunction , RuntimeFeature , Translation , Value } ;
23+ use tucana:: shared:: {
24+ ExecutionFlow , NodeFunction , RuntimeFeature , RuntimeUsage , Translation , Value ,
25+ } ;
2226
23- fn handle_message ( flow : ExecutionFlow , store : & FunctionStore ) -> Signal {
27+ fn handle_message ( flow : ExecutionFlow , store : & FunctionStore ) -> ( Signal , RuntimeUsage ) {
28+ let start = Instant :: now ( ) ;
2429 let mut context = Context :: default ( ) ;
2530
2631 let node_functions: HashMap < i64 , NodeFunction > = flow
@@ -29,7 +34,17 @@ fn handle_message(flow: ExecutionFlow, store: &FunctionStore) -> Signal {
2934 . map ( |node| ( node. database_id , node) )
3035 . collect ( ) ;
3136
32- Executor :: new ( store, node_functions) . execute ( flow. starting_node_id , & mut context, true )
37+ let signal =
38+ Executor :: new ( store, node_functions) . execute ( flow. starting_node_id , & mut context, true ) ;
39+ let duration_millis = start. elapsed ( ) . as_millis ( ) as i64 ;
40+
41+ (
42+ signal,
43+ RuntimeUsage {
44+ flow_id : flow. flow_id ,
45+ duration : duration_millis,
46+ } ,
47+ )
3348}
3449
3550#[ tokio:: main]
@@ -43,6 +58,7 @@ async fn main() {
4358 let config = Config :: new ( ) ;
4459 let store = FunctionStore :: default ( ) ;
4560 let mut runtime_status_service: Option < TaurusRuntimeStatusService > = None ;
61+ let mut runtime_usage_service: Option < TaurusRuntimeUsageService > = None ;
4662
4763 let client = match async_nats:: connect ( config. nats_url . clone ( ) ) . await {
4864 Ok ( client) => {
@@ -92,6 +108,9 @@ async fn main() {
92108 . send ( )
93109 . await ;
94110
111+ let usage_service = TaurusRuntimeUsageService :: from_url ( config. aquila_url . clone ( ) ) . await ;
112+ runtime_usage_service = Some ( usage_service) ;
113+
95114 let status_service = TaurusRuntimeStatusService :: from_url (
96115 config. aquila_url . clone ( ) ,
97116 "taurus" . into ( ) ,
@@ -143,7 +162,8 @@ async fn main() {
143162 } ;
144163
145164 let flow_id = flow. flow_id ;
146- let value = match handle_message ( flow, & store) {
165+ let result = handle_message ( flow, & store) ;
166+ let value = match result. 0 {
147167 Signal :: Failure ( error) => {
148168 log:: error!(
149169 "RuntimeError occurred, execution failed because: {:?}" ,
@@ -180,6 +200,10 @@ async fn main() {
180200 Err ( err) => log:: error!( "Failed to send response: {:?}" , err) ,
181201 }
182202 }
203+
204+ if let Some ( usage_service) = & runtime_usage_service {
205+ usage_service. update_runtime_usage ( result. 1 ) . await ;
206+ }
183207 }
184208
185209 log:: info!( "NATS worker loop ended" ) ;
0 commit comments