diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 653714d858eb2..556c489c8890c 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -297,6 +297,7 @@ source_set("browser") {
       "//components/password_manager/content/browser",
       "//components/password_manager/sync/browser",
       "//components/plugins/common",
+      "//components/profile_metrics",
       "//components/proxy_config",
       "//components/resources",
       "//components/safe_browsing_db",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index cd6a091864347..cfe67c6cd2528 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -76,6 +76,7 @@ include_rules = [
   "+components/pref_registry",
   "+components/printing/browser",
   "+components/printing/common",
+  "+components/profile_metrics",
   "+components/proximity_auth",
   "+components/proxy_config",
   "+components/query_parser",
diff --git a/chrome/browser/profiles/profile_metrics.cc b/chrome/browser/profiles/profile_metrics.cc
index a0143d58da485..1825c95bd804d 100644
--- a/chrome/browser/profiles/profile_metrics.cc
+++ b/chrome/browser/profiles/profile_metrics.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/installer/util/google_update_settings.h"
+#include "components/profile_metrics/counts.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/user_metrics.h"
 
@@ -143,7 +144,7 @@ enum ProfileAvatar {
 };
 
 bool ProfileMetrics::CountProfileInformation(ProfileManager* manager,
-                                             ProfileCounts* counts) {
+                                             profile_metrics::Counts* counts) {
   const ProfileInfoCache& info_cache = manager->GetProfileInfoCache();
   size_t number_of_profiles = info_cache.GetNumberOfProfiles();
   counts->total = number_of_profiles;
@@ -176,7 +177,7 @@ bool ProfileMetrics::CountProfileInformation(ProfileManager* manager,
 
 void ProfileMetrics::UpdateReportedProfilesStatistics(ProfileManager* manager) {
 #if defined(OS_WIN) || defined(OS_MACOSX)
-  ProfileCounts counts;
+  profile_metrics::Counts counts;
   if (CountProfileInformation(manager, &counts)) {
     size_t limited_total = counts.total;
     size_t limited_signedin = counts.signedin;
@@ -207,25 +208,13 @@ void ProfileMetrics::UpdateReportedOSProfileStatistics(
 #endif
 
 void ProfileMetrics::LogNumberOfProfiles(ProfileManager* manager) {
-  ProfileCounts counts;
+  profile_metrics::Counts counts;
   bool success = CountProfileInformation(manager, &counts);
-  UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfProfiles", counts.total);
+
+  profile_metrics::LogProfileMetricsCounts(counts);
 
   // Ignore other metrics if we have no profiles.
   if (success) {
-    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfManagedProfiles",
-                             counts.supervised);
-    UMA_HISTOGRAM_COUNTS_100("Profile.PercentageOfManagedProfiles",
-                             100 * counts.supervised / counts.total);
-    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfSignedInProfiles",
-                             counts.signedin);
-    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfUnusedProfiles",
-                             counts.unused);
-    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfSignedInProfilesWithGAIAIcons",
-                             counts.gaia_icon);
-    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfProfilesWithAuthErrors",
-                             counts.auth_errors);
-
     LogLockedProfileInformation(manager);
 
 #if defined(OS_WIN) || defined(OS_MACOSX)
diff --git a/chrome/browser/profiles/profile_metrics.h b/chrome/browser/profiles/profile_metrics.h
index 0b3c71fc4bb7f..c34635fbf5f87 100644
--- a/chrome/browser/profiles/profile_metrics.h
+++ b/chrome/browser/profiles/profile_metrics.h
@@ -19,24 +19,12 @@ namespace base {
 class FilePath;
 }
 
+namespace profile_metrics {
+struct Counts;
+}
+
 class ProfileMetrics {
  public:
-  struct ProfileCounts {
-    size_t total;
-    size_t signedin;
-    size_t supervised;
-    size_t unused;
-    size_t gaia_icon;
-    size_t auth_errors;
-
-    ProfileCounts()
-        : total(0),
-          signedin(0),
-          supervised(0),
-          unused(0),
-          gaia_icon(0),
-          auth_errors(0) {}
-  };
 
   // Enum for counting the ways users were added.
   enum ProfileAdd {
@@ -213,7 +201,7 @@ class ProfileMetrics {
   // Count and return summary information about the profiles currently in the
   // |manager|. This information is returned in the output variable |counts|.
   static bool CountProfileInformation(ProfileManager* manager,
-                                      ProfileCounts* counts);
+                                      profile_metrics::Counts* counts);
 
 #if !defined(OS_ANDROID) && !defined(OS_IOS)
   static void LogNumberOfProfileSwitches();
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 19dac934b3f31..9392b0feba2f8 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -3234,6 +3234,7 @@
             '../components/components.gyp:password_manager_sync_browser',
             '../components/components.gyp:plugins_common',
             '../components/components.gyp:power',
+            '../components/components.gyp:profile_metrics',
             '../components/components.gyp:proxy_config',
             '../components/components.gyp:safe_browsing_db',
             '../components/components.gyp:safe_json',
diff --git a/components/OWNERS b/components/OWNERS
index 2c5c12e72ff3b..7de4ca976ea15 100644
--- a/components/OWNERS
+++ b/components/OWNERS
@@ -232,6 +232,10 @@ per-file policy*=bartfab@chromium.org
 per-file policy*=atwilson@chromium.org
 per-file policy*=cschuet@chromium.org
 
+per-file profile_metrics*=anthonyvd@chromium.org
+per-file profile_metrics*=erg@chromium.org
+per-file profile_metrics*=mlerman@chromium.org
+
 per-file proximity_auth*=isherman@chromium.org
 per-file proximity_auth*=tbarzic@chromium.org
 per-file proximity_auth*=tengs@chromium.org
diff --git a/components/components.gyp b/components/components.gyp
index 3a29ea2a3bbbb..21ae71fa8be63 100644
--- a/components/components.gyp
+++ b/components/components.gyp
@@ -66,6 +66,7 @@
     'policy.gypi',
     'precache.gypi',
     'pref_registry.gypi',
+    'profile_metrics.gypi',
     'proxy_config.gypi',
     'query_parser.gypi',
     'rappor.gypi',
diff --git a/components/profile_metrics.gypi b/components/profile_metrics.gypi
new file mode 100644
index 0000000000000..49e713ada4ce3
--- /dev/null
+++ b/components/profile_metrics.gypi
@@ -0,0 +1,24 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'targets': [
+    {
+      # GN version: //components/profile_metrics
+      'target_name': 'profile_metrics',
+      'type': 'static_library',
+      'include_dirs': [
+        '..',
+      ],
+      'dependencies': [
+        '../base/base.gyp:base',
+      ],
+      'sources': [
+        # Note: sources list duplicated in GN build.
+        'profile_metrics/counts.cc',
+        'profile_metrics/counts.h',
+      ],
+    },
+  ],
+}
diff --git a/components/profile_metrics/BUILD.gn b/components/profile_metrics/BUILD.gn
new file mode 100644
index 0000000000000..8adf08bb883a0
--- /dev/null
+++ b/components/profile_metrics/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# GYP version: components/profile_metrics.gypi:profile_metrics
+static_library("profile_metrics") {
+  sources = [
+    "counts.cc",
+    "counts.h",
+  ]
+
+  deps = [
+    "//base",
+  ]
+}
diff --git a/components/profile_metrics/OWNERS b/components/profile_metrics/OWNERS
new file mode 100644
index 0000000000000..367bb85da5f4c
--- /dev/null
+++ b/components/profile_metrics/OWNERS
@@ -0,0 +1,3 @@
+anthonyvd@chromium.org
+erg@chromium.org
+mlerman@chromium.org
diff --git a/components/profile_metrics/counts.cc b/components/profile_metrics/counts.cc
new file mode 100644
index 0000000000000..9186d042a6655
--- /dev/null
+++ b/components/profile_metrics/counts.cc
@@ -0,0 +1,30 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/profile_metrics/counts.h"
+
+#include "base/metrics/histogram.h"
+
+namespace profile_metrics {
+
+void LogProfileMetricsCounts(const Counts& counts) {
+  UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfProfiles", counts.total);
+
+  // Ignore other metrics if we have no profiles.
+  if (counts.total > 0) {
+    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfManagedProfiles",
+                             counts.supervised);
+    UMA_HISTOGRAM_COUNTS_100("Profile.PercentageOfManagedProfiles",
+                             100 * counts.supervised / counts.total);
+    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfSignedInProfiles",
+                             counts.signedin);
+    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfUnusedProfiles", counts.unused);
+    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfSignedInProfilesWithGAIAIcons",
+                             counts.gaia_icon);
+    UMA_HISTOGRAM_COUNTS_100("Profile.NumberOfProfilesWithAuthErrors",
+                             counts.auth_errors);
+  }
+}
+
+}  // namespace profile_metrics
diff --git a/components/profile_metrics/counts.h b/components/profile_metrics/counts.h
new file mode 100644
index 0000000000000..a02a9725a0fe6
--- /dev/null
+++ b/components/profile_metrics/counts.h
@@ -0,0 +1,34 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PROFILE_METRICS_COUNTS_H_
+#define COMPONENTS_PROFILE_METRICS_COUNTS_H_
+
+#include "base/metrics/histogram_base.h"
+
+namespace profile_metrics {
+
+struct Counts {
+  base::HistogramBase::Sample total;
+  base::HistogramBase::Sample signedin;
+  base::HistogramBase::Sample supervised;
+  base::HistogramBase::Sample unused;
+  base::HistogramBase::Sample gaia_icon;
+  base::HistogramBase::Sample auth_errors;
+
+  Counts()
+      : total(0),
+        signedin(0),
+        supervised(0),
+        unused(0),
+        gaia_icon(0),
+        auth_errors(0) {}
+};
+
+// Logs metrics related to |counts|.
+void LogProfileMetricsCounts(const Counts& counts);
+
+}  // namespace profile_metrics
+
+#endif  // COMPONENTS_PROFILE_METRICS_COUNTS_H_