Skip to content

Commit b02cf89

Browse files
committed
fully split service/instance metric classes & usages
1 parent b30a394 commit b02cf89

File tree

17 files changed

+127
-126
lines changed

17 files changed

+127
-126
lines changed

Diff for: src/bin/cratesfyi.rs

+12-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use docs_rs::utils::{
1616
};
1717
use docs_rs::{
1818
start_background_metrics_webserver, start_web_server, BuildQueue, Config, Context, Index,
19-
Metrics, PackageKind, RustwideBuilder, Storage,
19+
InstanceMetrics, PackageKind, RustwideBuilder, ServiceMetrics, Storage,
2020
};
2121
use humantime::Duration;
2222
use once_cell::sync::OnceCell;
@@ -712,7 +712,8 @@ struct BinContext {
712712
cdn: OnceCell<Arc<CdnBackend>>,
713713
config: OnceCell<Arc<Config>>,
714714
pool: OnceCell<Pool>,
715-
metrics: OnceCell<Arc<Metrics>>,
715+
service_metrics: OnceCell<Arc<ServiceMetrics>>,
716+
instance_metrics: OnceCell<Arc<InstanceMetrics>>,
716717
index: OnceCell<Arc<Index>>,
717718
repository_stats_updater: OnceCell<Arc<RepositoryStatsUpdater>>,
718719
runtime: OnceCell<Arc<Runtime>>,
@@ -726,7 +727,8 @@ impl BinContext {
726727
cdn: OnceCell::new(),
727728
config: OnceCell::new(),
728729
pool: OnceCell::new(),
729-
metrics: OnceCell::new(),
730+
service_metrics: OnceCell::new(),
731+
instance_metrics: OnceCell::new(),
730732
index: OnceCell::new(),
731733
repository_stats_updater: OnceCell::new(),
732734
runtime: OnceCell::new(),
@@ -753,13 +755,13 @@ impl Context for BinContext {
753755
lazy! {
754756
fn build_queue(self) -> BuildQueue = BuildQueue::new(
755757
self.pool()?,
756-
self.metrics()?,
758+
self.instance_metrics()?,
757759
self.config()?,
758760
self.storage()?,
759761
);
760762
fn storage(self) -> Storage = Storage::new(
761763
self.pool()?,
762-
self.metrics()?,
764+
self.instance_metrics()?,
763765
self.config()?,
764766
self.runtime()?,
765767
)?;
@@ -768,7 +770,8 @@ impl Context for BinContext {
768770
&self.runtime()?,
769771
);
770772
fn config(self) -> Config = Config::from_env()?;
771-
fn metrics(self) -> Metrics = Metrics::new()?;
773+
fn service_metrics(self) -> ServiceMetrics = ServiceMetrics::new()?;
774+
fn instance_metrics(self) -> InstanceMetrics = InstanceMetrics::new()?;
772775
fn runtime(self) -> Runtime = {
773776
Builder::new_multi_thread()
774777
.enable_all()
@@ -793,7 +796,9 @@ impl Context for BinContext {
793796
fn pool(&self) -> Result<Pool> {
794797
Ok(self
795798
.pool
796-
.get_or_try_init::<_, Error>(|| Ok(Pool::new(&*self.config()?, self.metrics()?)?))?
799+
.get_or_try_init::<_, Error>(|| {
800+
Ok(Pool::new(&*self.config()?, self.instance_metrics()?)?)
801+
})?
797802
.clone())
798803
}
799804
}

Diff for: src/build_queue.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::docbuilder::PackageKind;
44
use crate::error::Result;
55
use crate::storage::Storage;
66
use crate::utils::{get_config, get_crate_priority, report_error, retry, set_config, ConfigName};
7-
use crate::{Config, Index, Metrics, RustwideBuilder};
7+
use crate::{Config, Index, InstanceMetrics, RustwideBuilder};
88
use anyhow::Context;
99
use fn_error_context::context;
1010

@@ -28,14 +28,14 @@ pub struct BuildQueue {
2828
config: Arc<Config>,
2929
storage: Arc<Storage>,
3030
pub(crate) db: Pool,
31-
metrics: Arc<Metrics>,
31+
metrics: Arc<InstanceMetrics>,
3232
max_attempts: i32,
3333
}
3434

3535
impl BuildQueue {
3636
pub fn new(
3737
db: Pool,
38-
metrics: Arc<Metrics>,
38+
metrics: Arc<InstanceMetrics>,
3939
config: Arc<Config>,
4040
storage: Arc<Storage>,
4141
) -> Self {
@@ -204,7 +204,7 @@ impl BuildQueue {
204204
to_process.name, to_process.version
205205
)
206206
});
207-
self.metrics.instance.total_builds.inc();
207+
self.metrics.total_builds.inc();
208208
if let Err(err) =
209209
cdn::queue_crate_invalidation(&mut transaction, &self.config, &to_process.name)
210210
{
@@ -225,7 +225,7 @@ impl BuildQueue {
225225
.get(0);
226226

227227
if attempt >= self.max_attempts {
228-
self.metrics.instance.failed_builds.inc();
228+
self.metrics.failed_builds.inc();
229229
}
230230

231231
report_error(&e);
@@ -320,7 +320,7 @@ impl BuildQueue {
320320
"{}-{} added into build queue",
321321
release.name, release.version
322322
);
323-
self.metrics.instance.queued_builds.inc();
323+
self.metrics.queued_builds.inc();
324324
crates_added += 1;
325325
}
326326
Err(err) => report_error(&err),
@@ -600,9 +600,9 @@ mod tests {
600600
assert!(!called, "there were still items in the queue");
601601

602602
// Ensure metrics were recorded correctly
603-
let metrics = env.metrics();
604-
assert_eq!(metrics.instance.total_builds.get(), 9);
605-
assert_eq!(metrics.instance.failed_builds.get(), 1);
603+
let metrics = env.instance_metrics();
604+
assert_eq!(metrics.total_builds.get(), 9);
605+
assert_eq!(metrics.failed_builds.get(), 1);
606606

607607
// no invalidations were run since we don't have a distribution id configured
608608
assert!(cdn::queued_or_active_crate_invalidations(&mut *env.db().conn())?.is_empty());

Diff for: src/cdn.rs

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{metrics::duration_to_seconds, utils::report_error, Config, Metrics};
1+
use crate::{metrics::duration_to_seconds, utils::report_error, Config, InstanceMetrics};
22
use anyhow::{anyhow, bail, Context, Error, Result};
33
use aws_sdk_cloudfront::{
44
config::{retry::RetryConfig, Region},
@@ -303,7 +303,7 @@ impl CdnBackend {
303303
#[instrument(skip(conn))]
304304
pub(crate) fn handle_queued_invalidation_requests(
305305
cdn: &CdnBackend,
306-
metrics: &Metrics,
306+
metrics: &InstanceMetrics,
307307
conn: &mut impl postgres::GenericClient,
308308
distribution_id: &str,
309309
) -> Result<()> {
@@ -363,7 +363,6 @@ pub(crate) fn handle_queued_invalidation_requests(
363363
if let Ok(duration) = (now - row.get::<_, DateTime<Utc>>(0)).to_std() {
364364
// This can only fail when the duration is negative, which can't happen anyways
365365
metrics
366-
.instance
367366
.cdn_invalidation_time
368367
.with_label_values(&[distribution_id])
369368
.observe(duration_to_seconds(duration));
@@ -401,7 +400,6 @@ pub(crate) fn handle_queued_invalidation_requests(
401400
if let Ok(duration) = (now - row.get::<_, DateTime<Utc>>("queued")).to_std() {
402401
// This can only fail when the duration is negative, which can't happen anyways
403402
metrics
404-
.instance
405403
.cdn_queue_time
406404
.with_label_values(&[distribution_id])
407405
.observe(duration_to_seconds(duration));
@@ -709,13 +707,13 @@ mod tests {
709707
// now handle the queued invalidations
710708
handle_queued_invalidation_requests(
711709
&env.cdn(),
712-
&env.metrics(),
710+
&env.instance_metrics(),
713711
&mut *conn,
714712
"distribution_id_web",
715713
)?;
716714
handle_queued_invalidation_requests(
717715
&env.cdn(),
718-
&env.metrics(),
716+
&env.instance_metrics(),
719717
&mut *conn,
720718
"distribution_id_static",
721719
)?;
@@ -743,13 +741,13 @@ mod tests {
743741
// now handle again
744742
handle_queued_invalidation_requests(
745743
&env.cdn(),
746-
&env.metrics(),
744+
&env.instance_metrics(),
747745
&mut *conn,
748746
"distribution_id_web",
749747
)?;
750748
handle_queued_invalidation_requests(
751749
&env.cdn(),
752-
&env.metrics(),
750+
&env.instance_metrics(),
753751
&mut *conn,
754752
"distribution_id_static",
755753
)?;
@@ -808,7 +806,7 @@ mod tests {
808806
// handle the queued invalidations
809807
handle_queued_invalidation_requests(
810808
&env.cdn(),
811-
&env.metrics(),
809+
&env.instance_metrics(),
812810
&mut *conn,
813811
"distribution_id_web",
814812
)?;
@@ -862,7 +860,7 @@ mod tests {
862860
// handle the queued invalidations
863861
handle_queued_invalidation_requests(
864862
&env.cdn(),
865-
&env.metrics(),
863+
&env.instance_metrics(),
866864
&mut *conn,
867865
"distribution_id_web",
868866
)?;
@@ -888,7 +886,7 @@ mod tests {
888886
// now handle again
889887
handle_queued_invalidation_requests(
890888
&env.cdn(),
891-
&env.metrics(),
889+
&env.instance_metrics(),
892890
&mut *conn,
893891
"distribution_id_web",
894892
)?;
@@ -923,7 +921,7 @@ mod tests {
923921
// run the handler
924922
handle_queued_invalidation_requests(
925923
&env.cdn(),
926-
&env.metrics(),
924+
&env.instance_metrics(),
927925
&mut *conn,
928926
"distribution_id_web",
929927
)?;

Diff for: src/context.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::cdn::CdnBackend;
22
use crate::db::Pool;
33
use crate::error::Result;
44
use crate::repositories::RepositoryStatsUpdater;
5-
use crate::{BuildQueue, Config, Index, Metrics, Storage};
5+
use crate::{BuildQueue, Config, Index, InstanceMetrics, ServiceMetrics, Storage};
66
use std::sync::Arc;
77
use tokio::runtime::Runtime;
88

@@ -12,7 +12,8 @@ pub trait Context {
1212
fn storage(&self) -> Result<Arc<Storage>>;
1313
fn cdn(&self) -> Result<Arc<CdnBackend>>;
1414
fn pool(&self) -> Result<Pool>;
15-
fn metrics(&self) -> Result<Arc<Metrics>>;
15+
fn service_metrics(&self) -> Result<Arc<ServiceMetrics>>;
16+
fn instance_metrics(&self) -> Result<Arc<InstanceMetrics>>;
1617
fn index(&self) -> Result<Arc<Index>>;
1718
fn repository_stats_updater(&self) -> Result<Arc<RepositoryStatsUpdater>>;
1819
fn runtime(&self) -> Result<Arc<Runtime>>;

Diff for: src/db/pool.rs

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::metrics::Metrics;
1+
use crate::metrics::InstanceMetrics;
22
use crate::Config;
33
use postgres::{Client, NoTls};
44
use r2d2_postgres::PostgresConnectionManager;
@@ -15,12 +15,12 @@ pub struct Pool {
1515
pool: Arc<std::sync::Mutex<Option<r2d2::Pool<PostgresConnectionManager<NoTls>>>>>,
1616
#[cfg(not(test))]
1717
pool: r2d2::Pool<PostgresConnectionManager<NoTls>>,
18-
metrics: Arc<Metrics>,
18+
metrics: Arc<InstanceMetrics>,
1919
max_size: u32,
2020
}
2121

2222
impl Pool {
23-
pub fn new(config: &Config, metrics: Arc<Metrics>) -> Result<Pool, PoolError> {
23+
pub fn new(config: &Config, metrics: Arc<InstanceMetrics>) -> Result<Pool, PoolError> {
2424
debug!(
2525
"creating database pool (if this hangs, consider running `docker-compose up -d db s3`)"
2626
);
@@ -30,13 +30,17 @@ impl Pool {
3030
#[cfg(test)]
3131
pub(crate) fn new_with_schema(
3232
config: &Config,
33-
metrics: Arc<Metrics>,
33+
metrics: Arc<InstanceMetrics>,
3434
schema: &str,
3535
) -> Result<Pool, PoolError> {
3636
Self::new_inner(config, metrics, schema)
3737
}
3838

39-
fn new_inner(config: &Config, metrics: Arc<Metrics>, schema: &str) -> Result<Pool, PoolError> {
39+
fn new_inner(
40+
config: &Config,
41+
metrics: Arc<InstanceMetrics>,
42+
schema: &str,
43+
) -> Result<Pool, PoolError> {
4044
let url = config
4145
.database_url
4246
.parse()
@@ -77,7 +81,7 @@ impl Pool {
7781
match self.with_pool(|p| p.get()) {
7882
Ok(conn) => Ok(conn),
7983
Err(err) => {
80-
self.metrics.instance.failed_db_connections.inc();
84+
self.metrics.failed_db_connections.inc();
8185
Err(PoolError::ClientError(err))
8286
}
8387
}

Diff for: src/docbuilder/rustwide_builder.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::utils::{
1313
};
1414
use crate::RUSTDOC_STATIC_STORAGE_PREFIX;
1515
use crate::{db::blacklist::is_blacklisted, utils::MetadataPackage};
16-
use crate::{Config, Context, Index, Metrics, Storage};
16+
use crate::{Config, Context, Index, InstanceMetrics, Storage};
1717
use anyhow::{anyhow, bail, Context as _, Error};
1818
use docsrs_metadata::{BuildTargets, Metadata, DEFAULT_TARGETS, HOST_TARGET};
1919
use failure::Error as FailureError;
@@ -45,7 +45,7 @@ pub struct RustwideBuilder {
4545
config: Arc<Config>,
4646
db: Pool,
4747
storage: Arc<Storage>,
48-
metrics: Arc<Metrics>,
48+
metrics: Arc<InstanceMetrics>,
4949
index: Arc<Index>,
5050
rustc_version: String,
5151
repository_stats_updater: Arc<RepositoryStatsUpdater>,
@@ -92,7 +92,7 @@ impl RustwideBuilder {
9292
config,
9393
db: context.pool()?,
9494
storage: context.storage()?,
95-
metrics: context.metrics()?,
95+
metrics: context.instance_metrics()?,
9696
index: context.index()?,
9797
rustc_version: String::new(),
9898
repository_stats_updater: context.repository_stats_updater()?,
@@ -484,11 +484,11 @@ impl RustwideBuilder {
484484

485485
let has_examples = build.host_source_dir().join("examples").is_dir();
486486
if res.result.successful {
487-
self.metrics.instance.successful_builds.inc();
487+
self.metrics.successful_builds.inc();
488488
} else if res.cargo_metadata.root().is_library() {
489-
self.metrics.instance.failed_builds.inc();
489+
self.metrics.failed_builds.inc();
490490
} else {
491-
self.metrics.instance.non_library_builds.inc();
491+
self.metrics.non_library_builds.inc();
492492
}
493493

494494
let release_data = if !is_local {

Diff for: src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ pub use self::context::Context;
88
pub use self::docbuilder::PackageKind;
99
pub use self::docbuilder::RustwideBuilder;
1010
pub use self::index::Index;
11-
pub use self::metrics::Metrics;
11+
pub use self::metrics::{InstanceMetrics, ServiceMetrics};
1212
pub use self::storage::Storage;
1313
pub use self::web::{start_background_metrics_webserver, start_web_server};
1414

Diff for: src/metrics/mod.rs

-15
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,6 @@ pub const CDN_INVALIDATION_HISTOGRAM_BUCKETS: &[f64; 11] = &[
3535
24000.0, // 240
3636
];
3737

38-
#[derive(Debug)]
39-
pub struct Metrics {
40-
pub instance: InstanceMetrics,
41-
pub service: ServiceMetrics,
42-
}
43-
44-
impl Metrics {
45-
pub fn new() -> Result<Self, prometheus::Error> {
46-
Ok(Self {
47-
instance: InstanceMetrics::new()?,
48-
service: ServiceMetrics::new()?,
49-
})
50-
}
51-
}
52-
5338
metrics! {
5439
pub struct InstanceMetrics {
5540
/// The number of idle database connections

0 commit comments

Comments
 (0)