Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1629)

Unified Diff: chrome/installer/setup/setup_main.cc

Issue 1537743006: Persist setup metrics and have Chrome report them during UMA upload. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@shared-histograms
Patch Set: moved allocator create/destroy to be beside snapshot (simpler code) Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/installer/setup/setup_main.cc
diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc
index 997b8342c8cf71e3ce0fd163d6ca3c9a1f5c2e01..9e9e7f979797e01c971fce08290c70afbfd82f84 100644
--- a/chrome/installer/setup/setup_main.cc
+++ b/chrome/installer/setup/setup_main.cc
@@ -21,6 +21,9 @@
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
+#include "base/metrics/histogram_base.h"
+#include "base/metrics/histogram_persistence.h"
+#include "base/metrics/persistent_memory_allocator.h"
#include "base/path_service.h"
#include "base/process/launch.h"
#include "base/process/memory.h"
@@ -69,6 +72,7 @@
#include "chrome/installer/util/self_cleaning_temp_dir.h"
#include "chrome/installer/util/shell_util.h"
#include "chrome/installer/util/user_experiment.h"
+#include "chrome/installer/util/util_constants.h"
#if defined(GOOGLE_CHROME_BUILD)
#include "chrome/installer/util/updating_app_registration_data.h"
@@ -1621,6 +1625,23 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance,
if (!installer::IsProcessorSupported())
return installer::CPU_NOT_SUPPORTED;
+ // Create a persistent space for any histograms that can be reported later
grt (UTC plus 2) 2016/02/04 15:36:42 how about creating an installer_metrics.{cc,h} pai
bcwhite 2016/02/04 21:51:13 Done.
+ // by the Chrome process. The "id" is a timestamp so that Chrome can tell
grt (UTC plus 2) 2016/02/04 15:36:42 nit: The comment on line 1795 refers to the browse
bcwhite 2016/02/04 21:51:13 Done.
+ // if it has already reported these metrics. No name is given so no internal
+ // histograms are created or managed; such would be pointless because they
+ // would have to be created on the heap and thus never be persisted for
+ // reporting.
+ uint64_t allocator_id = base::Time::Now().ToTimeT();
+ base::SetPersistentHistogramMemoryAllocator(
+ new base::LocalPersistentMemoryAllocator(1 << 20, // 1 MiB
+ allocator_id,
+ std::string()));
+
+ // Now that histograms have a persistent place to be stored, the allocator
+ // itself can create histograms within that space.
+ base::GetPersistentHistogramMemoryAllocator()
+ ->CreateTrackingHistograms(installer::kSetupHistogramAllocatorName);
+
// The exit manager is in charge of calling the dtors of singletons.
base::AtExitManager exit_manager;
base::CommandLine::Init(0, NULL);
@@ -1770,6 +1791,34 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance,
return_code = InstallUtil::GetInstallReturnCode(install_status);
}
+ // Save all the persistent histograms to a single file on disk for reading
grt (UTC plus 2) 2016/02/04 15:36:42 using a single file means that we'll get only a ra
bcwhite 2016/02/04 21:51:13 All things are possible... for a cost. Metrics ar
grt (UTC plus 2) 2016/02/08 18:09:18 Okay. Getting some data is better than none, so I'
bcwhite 2016/02/09 21:08:45 I've got some ideas on how to extend this but it n
grt (UTC plus 2) 2016/02/10 16:01:53 For a system-level install, setup.exe and chrome.e
+ // by the browser so it can be reported. For atomicity, first write to a
+ // temporary file and then rename it. The ImportantFileWriter would be good
+ // for this except it supports only std::string for its data.
+ base::FilePath file_path = installer_state.target_path().AppendASCII(
+ installer::kSetupHistogramAllocatorName).AddExtension(L".pma");
+ base::FilePath tmp_file_path;
+ base::DeleteFile(file_path, false);
+ if (base::CreateTemporaryFileInDir(file_path.DirName(), &tmp_file_path)) {
+ base::File histograms(tmp_file_path,
+ base::File::FLAG_OPEN | base::File::FLAG_WRITE);
+ if (histograms.IsValid()) {
+ base::PersistentMemoryAllocator* alloc =
+ base::GetPersistentHistogramMemoryAllocator();
+ int used = static_cast<int>(alloc->used());
+ if (histograms.Write(0, static_cast<const char*>(alloc->data()),
+ used) == used &&
+ histograms.Flush()) {
+ histograms.Close();
+ if (base::ReplaceFile(tmp_file_path, file_path, nullptr)) {
grt (UTC plus 2) 2016/02/04 15:36:42 this will fail so long as chrome.exe has the |file
bcwhite 2016/02/04 21:51:13 Basically part of the multiple-runs problem. File
grt (UTC plus 2) 2016/02/08 18:09:18 Right now that window is pretty big (~30m), right?
bcwhite 2016/02/09 21:08:45 Yes. Either I'll pre-read it into an alternate me
+ VLOG(1) << "Persistent histograms saved in file: "
+ << file_path.AsUTF8Unsafe();
+ }
+ }
+ }
+ }
+ base::DeleteFile(tmp_file_path, false);
+
VLOG(1) << "Installation complete, returning: " << return_code;
return return_code;

Powered by Google App Engine
This is Rietveld 408576698