55use anyhow:: { anyhow, Context } ;
66use async_trait:: async_trait;
77use chrono:: Utc ;
8- use slog:: { info, Logger } ;
8+ use slog:: { info, warn , Logger } ;
99use std:: sync:: Arc ;
1010use tokio:: task:: JoinHandle ;
1111
@@ -24,6 +24,7 @@ use mithril_common::{
2424use crate :: {
2525 artifact_builder:: ArtifactBuilder ,
2626 database:: { record:: SignedEntityRecord , repository:: SignedEntityStorer } ,
27+ MetricsService ,
2728} ;
2829
2930/// ArtifactBuilder Service trait
@@ -88,13 +89,25 @@ pub struct MithrilSignedEntityService {
8889 signed_entity_type_lock : Arc < SignedEntityTypeLock > ,
8990 cardano_stake_distribution_artifact_builder :
9091 Arc < dyn ArtifactBuilder < Epoch , CardanoStakeDistribution > > ,
92+ metrics_service : Arc < MetricsService > ,
9193 logger : Logger ,
9294}
9395
94- impl MithrilSignedEntityService {
95- /// MithrilSignedEntityService factory
96+ /// ArtifactsBuilder dependencies required by the [MithrilSignedEntityService].
97+ pub struct SignedEntityServiceArtifactsDependencies {
98+ mithril_stake_distribution_artifact_builder :
99+ Arc < dyn ArtifactBuilder < Epoch , MithrilStakeDistribution > > ,
100+ cardano_immutable_files_full_artifact_builder :
101+ Arc < dyn ArtifactBuilder < CardanoDbBeacon , Snapshot > > ,
102+ cardano_transactions_artifact_builder :
103+ Arc < dyn ArtifactBuilder < BlockNumber , CardanoTransactionsSnapshot > > ,
104+ cardano_stake_distribution_artifact_builder :
105+ Arc < dyn ArtifactBuilder < Epoch , CardanoStakeDistribution > > ,
106+ }
107+
108+ impl SignedEntityServiceArtifactsDependencies {
109+ /// Create a new instance of [SignedEntityServiceArtifactsDependencies].
96110 pub fn new (
97- signed_entity_storer : Arc < dyn SignedEntityStorer > ,
98111 mithril_stake_distribution_artifact_builder : Arc <
99112 dyn ArtifactBuilder < Epoch , MithrilStakeDistribution > ,
100113 > ,
@@ -104,19 +117,40 @@ impl MithrilSignedEntityService {
104117 cardano_transactions_artifact_builder : Arc <
105118 dyn ArtifactBuilder < BlockNumber , CardanoTransactionsSnapshot > ,
106119 > ,
107- signed_entity_type_lock : Arc < SignedEntityTypeLock > ,
108120 cardano_stake_distribution_artifact_builder : Arc <
109121 dyn ArtifactBuilder < Epoch , CardanoStakeDistribution > ,
110122 > ,
111- logger : Logger ,
112123 ) -> Self {
113124 Self {
114- signed_entity_storer,
115125 mithril_stake_distribution_artifact_builder,
116126 cardano_immutable_files_full_artifact_builder,
117127 cardano_transactions_artifact_builder,
118- signed_entity_type_lock,
119128 cardano_stake_distribution_artifact_builder,
129+ }
130+ }
131+ }
132+
133+ impl MithrilSignedEntityService {
134+ /// MithrilSignedEntityService factory
135+ pub fn new (
136+ signed_entity_storer : Arc < dyn SignedEntityStorer > ,
137+ dependencies : SignedEntityServiceArtifactsDependencies ,
138+ signed_entity_type_lock : Arc < SignedEntityTypeLock > ,
139+ metrics_service : Arc < MetricsService > ,
140+ logger : Logger ,
141+ ) -> Self {
142+ Self {
143+ signed_entity_storer,
144+ mithril_stake_distribution_artifact_builder : dependencies
145+ . mithril_stake_distribution_artifact_builder ,
146+ cardano_immutable_files_full_artifact_builder : dependencies
147+ . cardano_immutable_files_full_artifact_builder ,
148+ cardano_transactions_artifact_builder : dependencies
149+ . cardano_transactions_artifact_builder ,
150+ cardano_stake_distribution_artifact_builder : dependencies
151+ . cardano_stake_distribution_artifact_builder ,
152+ signed_entity_type_lock,
153+ metrics_service,
120154 logger : logger. new_with_component_name :: < Self > ( ) ,
121155 }
122156 }
@@ -161,6 +195,9 @@ impl MithrilSignedEntityService {
161195 "Signed Entity Service can not store signed entity with type: '{signed_entity_type}'"
162196 )
163197 } ) ?;
198+
199+ self . increment_artifact_total_produced_metric_since_startup ( signed_entity_type) ;
200+
164201 Ok ( ( ) )
165202 }
166203
@@ -233,6 +270,32 @@ impl MithrilSignedEntityService {
233270 )
234271 } )
235272 }
273+
274+ fn increment_artifact_total_produced_metric_since_startup (
275+ & self ,
276+ signed_entity_type : SignedEntityType ,
277+ ) {
278+ let metrics = self . metrics_service . clone ( ) ;
279+ let metric_counter = match signed_entity_type {
280+ SignedEntityType :: MithrilStakeDistribution ( _) => {
281+ metrics. get_artifact_mithril_stake_distribution_total_produced_since_startup ( )
282+ }
283+ SignedEntityType :: CardanoImmutableFilesFull ( _) => {
284+ metrics. get_artifact_cardano_db_total_produced_since_startup ( )
285+ }
286+ SignedEntityType :: CardanoStakeDistribution ( _) => {
287+ metrics. get_artifact_cardano_stake_distribution_total_produced_since_startup ( )
288+ }
289+ SignedEntityType :: CardanoTransactions ( _, _) => {
290+ metrics. get_artifact_cardano_transaction_total_produced_since_startup ( )
291+ }
292+ SignedEntityType :: CardanoDatabase ( _) => {
293+ metrics. get_artifact_cardano_database_total_produced_since_startup ( )
294+ }
295+ } ;
296+
297+ metric_counter. increment ( ) ;
298+ }
236299}
237300
238301#[ async_trait]
@@ -276,7 +339,7 @@ impl SignedEntityService for MithrilSignedEntityService {
276339
277340 result. with_context ( || format ! (
278341 "Signed Entity Service can not store signed entity with type: '{signed_entity_type}'"
279- ) ) ?
342+ ) ) ?. inspect_err ( |e| warn ! ( service . logger , "Error while creating artifact" ; "error" => ?e ) )
280343 } ) )
281344 }
282345
@@ -400,6 +463,7 @@ mod tests {
400463 signable_builder,
401464 test_utils:: fake_data,
402465 } ;
466+ use mithril_metric:: CounterValue ;
403467 use serde:: { de:: DeserializeOwned , Serialize } ;
404468 use std:: sync:: atomic:: AtomicBool ;
405469
@@ -472,13 +536,17 @@ mod tests {
472536 }
473537
474538 fn build_artifact_builder_service ( self ) -> MithrilSignedEntityService {
475- MithrilSignedEntityService :: new (
476- Arc :: new ( self . mock_signed_entity_storer ) ,
539+ let dependencies = SignedEntityServiceArtifactsDependencies :: new (
477540 Arc :: new ( self . mock_mithril_stake_distribution_artifact_builder ) ,
478541 Arc :: new ( self . mock_cardano_immutable_files_full_artifact_builder ) ,
479542 Arc :: new ( self . mock_cardano_transactions_artifact_builder ) ,
480- Arc :: new ( SignedEntityTypeLock :: default ( ) ) ,
481543 Arc :: new ( self . mock_cardano_stake_distribution_artifact_builder ) ,
544+ ) ;
545+ MithrilSignedEntityService :: new (
546+ Arc :: new ( self . mock_signed_entity_storer ) ,
547+ dependencies,
548+ Arc :: new ( SignedEntityTypeLock :: default ( ) ) ,
549+ Arc :: new ( MetricsService :: new ( TestLogger :: stdout ( ) ) . unwrap ( ) ) ,
482550 TestLogger :: stdout ( ) ,
483551 )
484552 }
@@ -524,13 +592,17 @@ mod tests {
524592 . withf ( move |signed_entity| signed_entity. artifact == signed_entity_artifact)
525593 . return_once ( |_| Ok ( ( ) ) ) ;
526594
527- MithrilSignedEntityService :: new (
528- Arc :: new ( self . mock_signed_entity_storer ) ,
595+ let dependencies = SignedEntityServiceArtifactsDependencies :: new (
529596 Arc :: new ( self . mock_mithril_stake_distribution_artifact_builder ) ,
530597 Arc :: new ( cardano_immutable_files_full_long_artifact_builder) ,
531598 Arc :: new ( self . mock_cardano_transactions_artifact_builder ) ,
532- Arc :: new ( SignedEntityTypeLock :: default ( ) ) ,
533599 Arc :: new ( self . mock_cardano_stake_distribution_artifact_builder ) ,
600+ ) ;
601+ MithrilSignedEntityService :: new (
602+ Arc :: new ( self . mock_signed_entity_storer ) ,
603+ dependencies,
604+ Arc :: new ( SignedEntityTypeLock :: default ( ) ) ,
605+ Arc :: new ( MetricsService :: new ( TestLogger :: stdout ( ) ) . unwrap ( ) ) ,
534606 TestLogger :: stdout ( ) ,
535607 )
536608 }
@@ -569,6 +641,29 @@ mod tests {
569641 }
570642 }
571643
644+ fn get_artifact_total_produced_metric_since_startup_counter_value (
645+ metrics_service : Arc < MetricsService > ,
646+ signed_entity_type : & SignedEntityType ,
647+ ) -> CounterValue {
648+ match signed_entity_type {
649+ SignedEntityType :: MithrilStakeDistribution ( _) => metrics_service
650+ . get_artifact_mithril_stake_distribution_total_produced_since_startup ( )
651+ . get ( ) ,
652+ SignedEntityType :: CardanoImmutableFilesFull ( _) => metrics_service
653+ . get_artifact_cardano_db_total_produced_since_startup ( )
654+ . get ( ) ,
655+ SignedEntityType :: CardanoStakeDistribution ( _) => metrics_service
656+ . get_artifact_cardano_stake_distribution_total_produced_since_startup ( )
657+ . get ( ) ,
658+ SignedEntityType :: CardanoTransactions ( _, _) => metrics_service
659+ . get_artifact_cardano_transaction_total_produced_since_startup ( )
660+ . get ( ) ,
661+ SignedEntityType :: CardanoDatabase ( _) => metrics_service
662+ . get_artifact_cardano_database_total_produced_since_startup ( )
663+ . get ( ) ,
664+ }
665+ }
666+
572667 #[ tokio:: test]
573668 async fn build_mithril_stake_distribution_artifact_when_given_mithril_stake_distribution_entity_type (
574669 ) {
@@ -776,10 +871,23 @@ mod tests {
776871 ) ;
777872 let error_message_str = error_message. as_str ( ) ;
778873
874+ let initial_counter_value = get_artifact_total_produced_metric_since_startup_counter_value (
875+ artifact_builder_service. metrics_service . clone ( ) ,
876+ & signed_entity_type,
877+ ) ;
878+
779879 artifact_builder_service
780- . create_artifact_task ( signed_entity_type, & certificate)
880+ . create_artifact_task ( signed_entity_type. clone ( ) , & certificate)
781881 . await
782882 . expect ( error_message_str) ;
883+
884+ assert_eq ! (
885+ initial_counter_value + 1 ,
886+ get_artifact_total_produced_metric_since_startup_counter_value(
887+ artifact_builder_service. metrics_service. clone( ) ,
888+ & signed_entity_type,
889+ )
890+ )
783891 }
784892
785893 #[ tokio:: test]
@@ -943,4 +1051,76 @@ mod tests {
9431051
9441052 atomic_stop. swap ( true , Ordering :: Relaxed ) ;
9451053 }
1054+
1055+ #[ tokio:: test]
1056+ async fn metrics_counter_value_is_not_incremented_when_compute_artifact_error ( ) {
1057+ let signed_entity_service = {
1058+ let mut mock_container = MockDependencyInjector :: new ( ) ;
1059+ mock_container
1060+ . mock_cardano_immutable_files_full_artifact_builder
1061+ . expect_compute_artifact ( )
1062+ . returning ( |_, _| Err ( anyhow ! ( "Error while computing artifact" ) ) ) ;
1063+
1064+ mock_container. build_artifact_builder_service ( )
1065+ } ;
1066+
1067+ let signed_entity_type = SignedEntityType :: MithrilStakeDistribution ( Epoch ( 7 ) ) ;
1068+
1069+ let initial_counter_value = get_artifact_total_produced_metric_since_startup_counter_value (
1070+ signed_entity_service. metrics_service . clone ( ) ,
1071+ & signed_entity_type,
1072+ ) ;
1073+
1074+ signed_entity_service
1075+ . create_artifact (
1076+ signed_entity_type. clone ( ) ,
1077+ & fake_data:: certificate ( "hash" . to_string ( ) ) ,
1078+ )
1079+ . await
1080+ . unwrap ( ) ;
1081+
1082+ assert_eq ! (
1083+ initial_counter_value,
1084+ get_artifact_total_produced_metric_since_startup_counter_value(
1085+ signed_entity_service. metrics_service. clone( ) ,
1086+ & signed_entity_type,
1087+ )
1088+ ) ;
1089+ }
1090+
1091+ #[ tokio:: test]
1092+ async fn metrics_counter_value_is_not_incremented_when_store_signed_entity_error ( ) {
1093+ let signed_entity_service = {
1094+ let mut mock_container = MockDependencyInjector :: new ( ) ;
1095+ mock_container
1096+ . mock_signed_entity_storer
1097+ . expect_store_signed_entity ( )
1098+ . returning ( |_| Err ( anyhow ! ( "Error while storing signed entity" ) ) ) ;
1099+
1100+ mock_container. build_artifact_builder_service ( )
1101+ } ;
1102+
1103+ let signed_entity_type = SignedEntityType :: MithrilStakeDistribution ( Epoch ( 7 ) ) ;
1104+
1105+ let initial_counter_value = get_artifact_total_produced_metric_since_startup_counter_value (
1106+ signed_entity_service. metrics_service . clone ( ) ,
1107+ & signed_entity_type,
1108+ ) ;
1109+
1110+ signed_entity_service
1111+ . create_artifact (
1112+ signed_entity_type. clone ( ) ,
1113+ & fake_data:: certificate ( "hash" . to_string ( ) ) ,
1114+ )
1115+ . await
1116+ . unwrap ( ) ;
1117+
1118+ assert_eq ! (
1119+ initial_counter_value,
1120+ get_artifact_total_produced_metric_since_startup_counter_value(
1121+ signed_entity_service. metrics_service. clone( ) ,
1122+ & signed_entity_type,
1123+ )
1124+ ) ;
1125+ }
9461126}
0 commit comments