Skip to content

Commit 9371122

Browse files
authored
Rollup merge of #140815 - yaahc:rustdoc-metrics, r=GuillaumeGomez
also export metrics from librustdoc Addresses the issue mentioned here: [#t-docs-rs > metrics intitiative @ 💬](https://rust-lang.zulipchat.com/#narrow/channel/356853-t-docs-rs/topic/metrics.20intitiative/near/515714331) The previous implementation only emitted metrics from rustc, but it turns out running `cargo doc` only calls `rustc` for dependencies, and not for the root crate being documented. We are planning to gather a sample dataset from docs.rs ci via `cargo doc` so as things stood this would not emit any metrics for any of the crates themselves that were published. This change adds the same logic from `rustc_driver_impl` to `librustdoc` to also dump metrics at the end of its execution if they are enabled. Note: The hash's generated by librustdoc will likely be completely different from the ones generated by rustc. This is because rustc is actually doing the various passes needed to fully calculate the stable version hash. My understanding of how rustdoc works is that the hashes generated will be working with partial information due to it only doing the work required to generate docs. The hashes will still be unique per crate and will work for the purposes of the metrics proof of concept, it would not be possible to correlate metrics generated by rustdoc with those generated by rustc for the same crate. This is fine for the purposes of the PoC but a future full implementation of metrics may want to address this issue.
2 parents 7a5bbe0 + 71e767f commit 9371122

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

src/librustdoc/lib.rs

+19
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,11 @@ extern crate tikv_jemalloc_sys as jemalloc_sys;
7373

7474
use std::env::{self, VarError};
7575
use std::io::{self, IsTerminal};
76+
use std::path::Path;
7677
use std::process;
7778

7879
use rustc_errors::DiagCtxtHandle;
80+
use rustc_hir::def_id::LOCAL_CRATE;
7981
use rustc_interface::interface;
8082
use rustc_middle::ty::TyCtxt;
8183
use rustc_session::config::{ErrorOutputType, RustcOptGroup, make_crate_type_option};
@@ -904,6 +906,10 @@ fn main_args(early_dcx: &mut EarlyDiagCtxt, at_args: &[String]) {
904906
rustc_interface::passes::write_dep_info(tcx);
905907
}
906908

909+
if let Some(metrics_dir) = &sess.opts.unstable_opts.metrics_dir {
910+
dump_feature_usage_metrics(tcx, metrics_dir);
911+
}
912+
907913
if run_check {
908914
// Since we're in "check" mode, no need to generate anything beyond this point.
909915
return;
@@ -923,3 +929,16 @@ fn main_args(early_dcx: &mut EarlyDiagCtxt, at_args: &[String]) {
923929
})
924930
})
925931
}
932+
933+
fn dump_feature_usage_metrics(tcxt: TyCtxt<'_>, metrics_dir: &Path) {
934+
let hash = tcxt.crate_hash(LOCAL_CRATE);
935+
let crate_name = tcxt.crate_name(LOCAL_CRATE);
936+
let metrics_file_name = format!("unstable_feature_usage_metrics-{crate_name}-{hash}.json");
937+
let metrics_path = metrics_dir.join(metrics_file_name);
938+
if let Err(error) = tcxt.features().dump_feature_usage_metrics(metrics_path) {
939+
// FIXME(yaahc): once metrics can be enabled by default we will want "failure to emit
940+
// default metrics" to only produce a warning when metrics are enabled by default and emit
941+
// an error only when the user manually enables metrics
942+
tcxt.dcx().err(format!("cannot emit feature usage metrics: {error}"));
943+
}
944+
}

0 commit comments

Comments
 (0)