5
5
use anyhow:: { anyhow, Context } ;
6
6
use async_trait:: async_trait;
7
7
use chrono:: Utc ;
8
- use slog:: { info, Logger } ;
8
+ use slog:: { info, warn , Logger } ;
9
9
use std:: sync:: Arc ;
10
10
use tokio:: task:: JoinHandle ;
11
11
@@ -24,6 +24,7 @@ use mithril_common::{
24
24
use crate :: {
25
25
artifact_builder:: ArtifactBuilder ,
26
26
database:: { record:: SignedEntityRecord , repository:: SignedEntityStorer } ,
27
+ MetricsService ,
27
28
} ;
28
29
29
30
/// ArtifactBuilder Service trait
@@ -88,13 +89,25 @@ pub struct MithrilSignedEntityService {
88
89
signed_entity_type_lock : Arc < SignedEntityTypeLock > ,
89
90
cardano_stake_distribution_artifact_builder :
90
91
Arc < dyn ArtifactBuilder < Epoch , CardanoStakeDistribution > > ,
92
+ metrics_service : Arc < MetricsService > ,
91
93
logger : Logger ,
92
94
}
93
95
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].
96
110
pub fn new (
97
- signed_entity_storer : Arc < dyn SignedEntityStorer > ,
98
111
mithril_stake_distribution_artifact_builder : Arc <
99
112
dyn ArtifactBuilder < Epoch , MithrilStakeDistribution > ,
100
113
> ,
@@ -104,19 +117,40 @@ impl MithrilSignedEntityService {
104
117
cardano_transactions_artifact_builder : Arc <
105
118
dyn ArtifactBuilder < BlockNumber , CardanoTransactionsSnapshot > ,
106
119
> ,
107
- signed_entity_type_lock : Arc < SignedEntityTypeLock > ,
108
120
cardano_stake_distribution_artifact_builder : Arc <
109
121
dyn ArtifactBuilder < Epoch , CardanoStakeDistribution > ,
110
122
> ,
111
- logger : Logger ,
112
123
) -> Self {
113
124
Self {
114
- signed_entity_storer,
115
125
mithril_stake_distribution_artifact_builder,
116
126
cardano_immutable_files_full_artifact_builder,
117
127
cardano_transactions_artifact_builder,
118
- signed_entity_type_lock,
119
128
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,
120
154
logger : logger. new_with_component_name :: < Self > ( ) ,
121
155
}
122
156
}
@@ -161,6 +195,9 @@ impl MithrilSignedEntityService {
161
195
"Signed Entity Service can not store signed entity with type: '{signed_entity_type}'"
162
196
)
163
197
} ) ?;
198
+
199
+ self . increment_artifact_total_produced_metric_since_startup ( signed_entity_type) ;
200
+
164
201
Ok ( ( ) )
165
202
}
166
203
@@ -233,6 +270,32 @@ impl MithrilSignedEntityService {
233
270
)
234
271
} )
235
272
}
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
+ }
236
299
}
237
300
238
301
#[ async_trait]
@@ -276,7 +339,7 @@ impl SignedEntityService for MithrilSignedEntityService {
276
339
277
340
result. with_context ( || format ! (
278
341
"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 ) )
280
343
} ) )
281
344
}
282
345
@@ -400,6 +463,7 @@ mod tests {
400
463
signable_builder,
401
464
test_utils:: fake_data,
402
465
} ;
466
+ use mithril_metric:: CounterValue ;
403
467
use serde:: { de:: DeserializeOwned , Serialize } ;
404
468
use std:: sync:: atomic:: AtomicBool ;
405
469
@@ -472,13 +536,17 @@ mod tests {
472
536
}
473
537
474
538
fn build_artifact_builder_service ( self ) -> MithrilSignedEntityService {
475
- MithrilSignedEntityService :: new (
476
- Arc :: new ( self . mock_signed_entity_storer ) ,
539
+ let dependencies = SignedEntityServiceArtifactsDependencies :: new (
477
540
Arc :: new ( self . mock_mithril_stake_distribution_artifact_builder ) ,
478
541
Arc :: new ( self . mock_cardano_immutable_files_full_artifact_builder ) ,
479
542
Arc :: new ( self . mock_cardano_transactions_artifact_builder ) ,
480
- Arc :: new ( SignedEntityTypeLock :: default ( ) ) ,
481
543
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 ( ) ) ,
482
550
TestLogger :: stdout ( ) ,
483
551
)
484
552
}
@@ -524,13 +592,17 @@ mod tests {
524
592
. withf ( move |signed_entity| signed_entity. artifact == signed_entity_artifact)
525
593
. return_once ( |_| Ok ( ( ) ) ) ;
526
594
527
- MithrilSignedEntityService :: new (
528
- Arc :: new ( self . mock_signed_entity_storer ) ,
595
+ let dependencies = SignedEntityServiceArtifactsDependencies :: new (
529
596
Arc :: new ( self . mock_mithril_stake_distribution_artifact_builder ) ,
530
597
Arc :: new ( cardano_immutable_files_full_long_artifact_builder) ,
531
598
Arc :: new ( self . mock_cardano_transactions_artifact_builder ) ,
532
- Arc :: new ( SignedEntityTypeLock :: default ( ) ) ,
533
599
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 ( ) ) ,
534
606
TestLogger :: stdout ( ) ,
535
607
)
536
608
}
@@ -569,6 +641,29 @@ mod tests {
569
641
}
570
642
}
571
643
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
+
572
667
#[ tokio:: test]
573
668
async fn build_mithril_stake_distribution_artifact_when_given_mithril_stake_distribution_entity_type (
574
669
) {
@@ -776,10 +871,23 @@ mod tests {
776
871
) ;
777
872
let error_message_str = error_message. as_str ( ) ;
778
873
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
+
779
879
artifact_builder_service
780
- . create_artifact_task ( signed_entity_type, & certificate)
880
+ . create_artifact_task ( signed_entity_type. clone ( ) , & certificate)
781
881
. await
782
882
. 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
+ )
783
891
}
784
892
785
893
#[ tokio:: test]
@@ -943,4 +1051,76 @@ mod tests {
943
1051
944
1052
atomic_stop. swap ( true , Ordering :: Relaxed ) ;
945
1053
}
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
+ }
946
1126
}
0 commit comments