Skip to content

Commit c27ba75

Browse files
committed
fix: prevent metrics increment on errors in create_artifact and log warnings
Also introduce `SignedEntityServiceArtifactsDependencies` to reduce the number of parameters in `MithrilSignedEntityService` constructor.
1 parent ac1e197 commit c27ba75

File tree

3 files changed

+205
-48
lines changed

3 files changed

+205
-48
lines changed

mithril-aggregator/src/dependency_injection/builder.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ use crate::{
6969
CardanoTransactionsImporter, CertifierService, EpochServiceDependencies, MessageService,
7070
MithrilCertifierService, MithrilEpochService, MithrilMessageService, MithrilProverService,
7171
MithrilSignedEntityService, MithrilStakeDistributionService, ProverService,
72-
SignedEntityService, StakeDistributionService, UpkeepService, UsageReporter,
72+
SignedEntityService, SignedEntityServiceArtifactsDependencies, StakeDistributionService,
73+
UpkeepService, UsageReporter,
7374
},
7475
store::CertificatePendingStorer,
7576
tools::{CExplorerSignerRetriever, GcpFileUploader, GenesisToolsDependency, SignersImporter},
@@ -1207,13 +1208,17 @@ impl DependenciesBuilder {
12071208
let stake_store = self.get_stake_store().await?;
12081209
let cardano_stake_distribution_artifact_builder =
12091210
Arc::new(CardanoStakeDistributionArtifactBuilder::new(stake_store));
1210-
let signed_entity_service = Arc::new(MithrilSignedEntityService::new(
1211-
signed_entity_storer,
1211+
let dependencies = SignedEntityServiceArtifactsDependencies::new(
12121212
mithril_stake_distribution_artifact_builder,
12131213
cardano_immutable_files_full_artifact_builder,
12141214
cardano_transactions_artifact_builder,
1215-
self.get_signed_entity_lock().await?,
12161215
cardano_stake_distribution_artifact_builder,
1216+
);
1217+
let signed_entity_service = Arc::new(MithrilSignedEntityService::new(
1218+
signed_entity_storer,
1219+
dependencies,
1220+
self.get_signed_entity_lock().await?,
1221+
self.get_metrics_service().await?,
12171222
logger,
12181223
));
12191224

mithril-aggregator/src/runtime/runner.rs

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -172,32 +172,6 @@ impl AggregatorRunner {
172172

173173
Ok(unlocked_signed_entities)
174174
}
175-
176-
fn increment_artifact_total_produced_metric_since_startup(
177-
&self,
178-
signed_entity_type: &SignedEntityType,
179-
) {
180-
let metrics = self.dependencies.metrics_service.clone();
181-
let metric_counter = match signed_entity_type {
182-
SignedEntityType::MithrilStakeDistribution(_) => {
183-
metrics.get_artifact_mithril_stake_distribution_total_produced_since_startup()
184-
}
185-
SignedEntityType::CardanoImmutableFilesFull(_) => {
186-
metrics.get_artifact_cardano_db_total_produced_since_startup()
187-
}
188-
SignedEntityType::CardanoStakeDistribution(_) => {
189-
metrics.get_artifact_cardano_stake_distribution_total_produced_since_startup()
190-
}
191-
SignedEntityType::CardanoTransactions(_, _) => {
192-
metrics.get_artifact_cardano_transaction_total_produced_since_startup()
193-
}
194-
SignedEntityType::CardanoDatabase(_) => {
195-
metrics.get_artifact_cardano_database_total_produced_since_startup()
196-
}
197-
};
198-
199-
metric_counter.increment();
200-
}
201175
}
202176

203177
#[cfg_attr(test, mockall::automock)]
@@ -457,8 +431,6 @@ impl AggregatorRunnerTrait for AggregatorRunner {
457431
)
458432
})?;
459433

460-
self.increment_artifact_total_produced_metric_since_startup(signed_entity_type);
461-
462434
Ok(())
463435
}
464436

mithril-aggregator/src/services/signed_entity.rs

Lines changed: 196 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use anyhow::{anyhow, Context};
66
use async_trait::async_trait;
77
use chrono::Utc;
8-
use slog::{info, Logger};
8+
use slog::{info, warn, Logger};
99
use std::sync::Arc;
1010
use tokio::task::JoinHandle;
1111

@@ -24,6 +24,7 @@ use mithril_common::{
2424
use 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

Comments
 (0)