diff --git a/include/vcpkg/registries.h b/include/vcpkg/registries.h index 9c07f1a609..3e0284c9f9 100644 --- a/include/vcpkg/registries.h +++ b/include/vcpkg/registries.h @@ -31,6 +31,8 @@ namespace vcpkg struct RegistryImplementation { + virtual StringLiteral kind() const = 0; + // returns nullptr if the port doesn't exist virtual std::unique_ptr get_port_entry(const VcpkgPaths& paths, StringView port_name) const = 0; diff --git a/src/vcpkg-test/registries.cpp b/src/vcpkg-test/registries.cpp index 1c839409d9..40136bff9e 100644 --- a/src/vcpkg-test/registries.cpp +++ b/src/vcpkg-test/registries.cpp @@ -10,6 +10,8 @@ namespace { struct TestRegistryImplementation final : RegistryImplementation { + StringLiteral kind() const override { return "test"; } + std::unique_ptr get_port_entry(const VcpkgPaths&, StringView) const override { return nullptr; } void get_all_port_names(std::vector&, const VcpkgPaths&) const override { } diff --git a/src/vcpkg/configuration.cpp b/src/vcpkg/configuration.cpp index 3fa02876ff..6377544aff 100644 --- a/src/vcpkg/configuration.cpp +++ b/src/vcpkg/configuration.cpp @@ -2,6 +2,7 @@ #include #include +#include #include namespace @@ -74,6 +75,8 @@ namespace vcpkg { if (!flags.registries && registry_set.has_modifications()) { + Metrics::g_metrics.lock()->track_property("registries-error-registry-modification-without-feature-flag", + "defined"); System::printf(System::Color::warning, "Warning: configuration specified the \"registries\" or \"default-registries\" field, but " "the %s feature flag was not enabled.\n", diff --git a/src/vcpkg/registries.cpp b/src/vcpkg/registries.cpp index 971e8d0c29..f31001e5d9 100644 --- a/src/vcpkg/registries.cpp +++ b/src/vcpkg/registries.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -45,6 +46,8 @@ namespace { } + StringLiteral kind() const override { return "git"; } + std::unique_ptr get_port_entry(const VcpkgPaths&, StringView) const override; void get_all_port_names(std::vector&, const VcpkgPaths&) const override; @@ -73,6 +76,7 @@ namespace registry_versions_dir_name); if (!maybe_tree) { + Metrics::g_metrics.lock()->track_property("registries-error-no-versions-at-commit", "defined"); Checks::exit_with_message( VCPKG_LINE_INFO, "Error: could not find the git tree for `versions` in repo `%s` at commit `%s`: %s", @@ -84,7 +88,7 @@ namespace if (!maybe_path) { Checks::exit_with_message(VCPKG_LINE_INFO, - "Error: failed to check out `port_versions` from repo %s: %s", + "Error: failed to check out `versions` from repo %s: %s", m_repo, maybe_path.error()); } @@ -158,6 +162,8 @@ namespace Debug::print("BuiltinRegistry initialized with: \"", m_baseline_identifier, "\"\n"); } + StringLiteral kind() const override { return "builtin"; } + std::unique_ptr get_port_entry(const VcpkgPaths& paths, StringView port_name) const override; void get_all_port_names(std::vector&, const VcpkgPaths&) const override; @@ -177,6 +183,8 @@ namespace { } + StringLiteral kind() const override { return "filesystem"; } + std::unique_ptr get_port_entry(const VcpkgPaths&, StringView) const override; void get_all_port_names(std::vector&, const VcpkgPaths&) const override; @@ -524,6 +532,7 @@ namespace if (m_baseline_identifier == "default") { + Metrics::g_metrics.lock()->track_property("registries-error-could-not-find-baseline", "defined"); Checks::exit_with_message( VCPKG_LINE_INFO, "Couldn't find explicitly specified baseline `\"default\"` in the baseline file.", @@ -534,6 +543,7 @@ namespace auto explicit_hash = paths.git_fetch_from_remote_registry(m_repo, m_baseline_identifier); if (!explicit_hash.has_value()) { + Metrics::g_metrics.lock()->track_property("registries-error-could-not-find-baseline", "defined"); Checks::exit_with_message( VCPKG_LINE_INFO, "Error: Couldn't find explicitly specified baseline `\"%s\"` in the baseline file for repo %s, " @@ -546,6 +556,7 @@ namespace auto maybe_contents = paths.git_show_from_remote_registry(*explicit_hash.get(), path_to_baseline); if (!maybe_contents.has_value()) { + Metrics::g_metrics.lock()->track_property("registries-error-could-not-find-baseline", "defined"); Checks::exit_with_message( VCPKG_LINE_INFO, "Error: Couldn't find explicitly specified baseline `\"%s\"` in the baseline file for repo %s, " @@ -568,6 +579,7 @@ namespace } else { + Metrics::g_metrics.lock()->track_property("registries-error-could-not-find-baseline", "defined"); Checks::exit_maybe_upgrade( VCPKG_LINE_INFO, "Couldn't find explicitly specified baseline `\"%s\"` in the baseline file for repo %s, " diff --git a/src/vcpkg/vcpkgpaths.cpp b/src/vcpkg/vcpkgpaths.cpp index c0c5b5b84f..e2306aa514 100644 --- a/src/vcpkg/vcpkgpaths.cpp +++ b/src/vcpkg/vcpkgpaths.cpp @@ -338,6 +338,33 @@ If you wish to silence this error and use classic mode, you can: auto config_file = load_configuration(filesystem, args, root, manifest_root_dir); + // metrics from configuration + { + auto default_registry = config_file.config.registry_set.default_registry(); + auto other_registries = config_file.config.registry_set.registries(); + auto metrics = Metrics::g_metrics.lock(); + + if (default_registry) + { + metrics->track_property("registries-default-registry-kind", default_registry->kind()); + } + else + { + metrics->track_property("registries-default-registry-kind", "disabled"); + } + + if (other_registries.size() != 0) + { + std::vector registry_kinds; + for (const auto& reg : other_registries) + { + registry_kinds.push_back(reg.implementation().kind()); + } + Util::sort_unique_erase(registry_kinds); + metrics->track_property("registries-kinds-used", Strings::join(",", registry_kinds)); + } + } + config_root_dir = std::move(config_file.config_directory); m_pimpl->m_config = std::move(config_file.config);