arc: Add success value to auth error metrics

The UMA metrics currently recorded for signin, checkin, and DPC errors,
do not have success as one of the values which makes it difficult to
determine if a certain error has started occurring more often in relation
to success.

UMA guidelines suggest that we have a baseline value in enums so we can
precisely avoid a problem like this where we can't compute the ratio of
success/failure if we only report errors.

Created a set of new UMA metrics that replace the old ones and has only
commonly occurring error values instead of all of the existing ones, in
addition to the new success value.

OBSOLETE_HISTOGRAM[Arc.Provisioning.CheckInError.Child]=Replaced by Arc.Provisioning.CheckinResult.Child
OBSOLETE_HISTOGRAM[Arc.Provisioning.CheckInError.DemoMode]=Replaced by Arc.Provisioning.CheckinResult.DemoMode
OBSOLETE_HISTOGRAM[Arc.Provisioning.CheckInError.Managed]=Replaced by Arc.Provisioning.CheckinResult.Managed
OBSOLETE_HISTOGRAM[Arc.Provisioning.CheckInError.OfflineDemoMode]=Replaced by Arc.Provisioning.CheckinResult.OfflineDemoMode
OBSOLETE_HISTOGRAM[Arc.Provisioning.CheckInError.RobotAccount]=Replaced by Arc.Provisioning.CheckinResult.RobotAccount
OBSOLETE_HISTOGRAM[Arc.Provisioning.CheckInError.Unmanaged]=Replaced by Arc.Provisioning.CheckinResult.Unmanaged
OBSOLETE_HISTOGRAM[Arc.Provisioning.CloudFlowError.Child]=Replaced by Arc.Provisioning.DpcResult.Child
OBSOLETE_HISTOGRAM[Arc.Provisioning.CloudFlowError.DemoMode]=Replaced by Arc.Provisioning.DpcResult.DemoMode
OBSOLETE_HISTOGRAM[Arc.Provisioning.CloudFlowError.Managed]=Replaced by Arc.Provisioning.DpcResult.Managed
OBSOLETE_HISTOGRAM[Arc.Provisioning.CloudFlowError.OfflineDemoMode]=Replaced by Arc.Provisioning.DpcResult.OfflineDemoMode
OBSOLETE_HISTOGRAM[Arc.Provisioning.CloudFlowError.RobotAccount]=Replaced by Arc.Provisioning.DpcResult.RobotAccount
OBSOLETE_HISTOGRAM[Arc.Provisioning.CloudFlowError.Unmanaged]=Replaced by Arc.Provisioning.DpcResult.Unmanaged
OBSOLETE_HISTOGRAM[Arc.Provisioning.SignInError.Child]=Replaced by Arc.Provisioning.SigninResult.Child
OBSOLETE_HISTOGRAM[Arc.Provisioning.SignInError.DemoMode]=Replaced by Arc.Provisioning.SigninResult.DemoMode
OBSOLETE_HISTOGRAM[Arc.Provisioning.SignInError.Managed]=Replaced by Arc.Provisioning.SigninResult.Managed
OBSOLETE_HISTOGRAM[Arc.Provisioning.SignInError.OfflineDemoMode]=Replaced by Arc.Provisioning.SigninResult.OfflineDemoMode
OBSOLETE_HISTOGRAM[Arc.Provisioning.SignInError.RobotAccount]=Replaced by Arc.Provisioning.SigninResult.RobotAccount
OBSOLETE_HISTOGRAM[Arc.Provisioning.SignInError.Unmanaged]=Replaced by Arc.Provisioning.SigninResult.Unmanaged

Bug: b:333128815
Fixed: b:333128815
Test: ./out_Default/Release/unit_tests
Change-Id: I5e67cfa67986c8a400b81d1c77e61fa8d7c18497
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5610477
Reviewed-by: Yury Khmel <khmel@chromium.org>
Auto-Submit: Muhammad Hasan Khan <mhasank@chromium.org>
Commit-Queue: Muhammad Hasan Khan <mhasank@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1312950}
diff --git a/chrome/browser/ash/arc/arc_optin_uma.cc b/chrome/browser/ash/arc/arc_optin_uma.cc
index a086c00..0348a13c 100644
--- a/chrome/browser/ash/arc/arc_optin_uma.cc
+++ b/chrome/browser/ash/arc/arc_optin_uma.cc
@@ -114,25 +114,25 @@
       GetHistogramNameByUserType("Arc.Provisioning.Status", profile), status);
 }
 
-void UpdateCloudProvisionFlowErrorUMA(mojom::CloudProvisionFlowError error,
-                                      const Profile* profile) {
+void UpdateProvisioningDpcResultUMA(ArcProvisioningDpcResult result,
+                                    const Profile* profile) {
   LogStabilityUmaEnum(
-      GetHistogramNameByUserType("Arc.Provisioning.CloudFlowError", profile),
-      error);
+      GetHistogramNameByUserType("Arc.Provisioning.DpcResult", profile),
+      result);
 }
 
-void UpdateGMSSignInErrorUMA(mojom::GMSSignInError error,
-                             const Profile* profile) {
+void UpdateProvisioningSigninResultUMA(ArcProvisioningSigninResult result,
+                                       const Profile* profile) {
   LogStabilityUmaEnum(
-      GetHistogramNameByUserType("Arc.Provisioning.SignInError", profile),
-      error);
+      GetHistogramNameByUserType("Arc.Provisioning.SigninResult", profile),
+      result);
 }
 
-void UpdateGMSCheckInErrorUMA(mojom::GMSCheckInError error,
-                              const Profile* profile) {
+void UpdateProvisioningCheckinResultUMA(ArcProvisioningCheckinResult result,
+                                        const Profile* profile) {
   LogStabilityUmaEnum(
-      GetHistogramNameByUserType("Arc.Provisioning.CheckInError", profile),
-      error);
+      GetHistogramNameByUserType("Arc.Provisioning.CheckinResult", profile),
+      result);
 }
 
 void UpdateSecondarySigninResultUMA(ProvisioningStatus status) {
@@ -259,6 +259,85 @@
   LogStabilityUmaEnum("Arc.OptInSilentAuthCode.SecondaryAccount", state);
 }
 
+ArcProvisioningDpcResult GetDpcErrorResult(
+    mojom::CloudProvisionFlowError error) {
+  switch (error) {
+    case mojom::CloudProvisionFlowError::ERROR_ENROLLMENT_TOKEN_INVALID:
+      return ArcProvisioningDpcResult::kInvalidToken;
+    case mojom::CloudProvisionFlowError::ERROR_ADD_ACCOUNT_FAILED:
+      return ArcProvisioningDpcResult::kAccountAddFail;
+    case mojom::CloudProvisionFlowError::ERROR_TIMEOUT:
+      return ArcProvisioningDpcResult::kTimeout;
+    case mojom::CloudProvisionFlowError::ERROR_NETWORK_UNAVAILABLE:
+      return ArcProvisioningDpcResult::kNetworkError;
+    case mojom::CloudProvisionFlowError::
+        ERROR_OAUTH_TOKEN_AUTHENTICATOR_EXCEPTION:
+      return ArcProvisioningDpcResult::kOAuthAuthException;
+    case mojom::CloudProvisionFlowError::ERROR_OAUTH_TOKEN_IO_EXCEPTION:
+      return ArcProvisioningDpcResult::kOAuthIOException;
+    case mojom::CloudProvisionFlowError::ERROR_OTHER:
+    case mojom::CloudProvisionFlowError::ERROR_ENTERPRISE_INVALID:
+    case mojom::CloudProvisionFlowError::ERROR_USER_CANCEL:
+    case mojom::CloudProvisionFlowError::ERROR_NO_ACCOUNT_IN_WORK_PROFILE:
+    case mojom::CloudProvisionFlowError::ERROR_INVALID_POLICY_STATE:
+    case mojom::CloudProvisionFlowError::ERROR_DPC_SUPPORT:
+    case mojom::CloudProvisionFlowError::ERROR_ACCOUNT_NOT_READY:
+    case mojom::CloudProvisionFlowError::ERROR_CHECKIN_FAILED:
+    case mojom::CloudProvisionFlowError::ERROR_ACCOUNT_NOT_ALLOWLISTED:
+    case mojom::CloudProvisionFlowError::ERROR_JSON:
+    case mojom::CloudProvisionFlowError::ERROR_MANAGED_PROVISIONING_FAILED:
+    case mojom::CloudProvisionFlowError::ERROR_INVALID_SETUP_ACTION:
+    case mojom::CloudProvisionFlowError::ERROR_SERVER:
+    case mojom::CloudProvisionFlowError::ERROR_REMOVE_ACCOUNT_FAILED:
+    case mojom::CloudProvisionFlowError::ERROR_OAUTH_TOKEN:
+    case mojom::CloudProvisionFlowError::ERROR_ACCOUNT_OTHER:
+    case mojom::CloudProvisionFlowError::ERROR_QUARANTINE:
+    case mojom::CloudProvisionFlowError::ERROR_DEVICE_QUOTA_EXCEEDED:
+    case mojom::CloudProvisionFlowError::ERROR_SERVER_TRANSIENT_ERROR:
+    case mojom::CloudProvisionFlowError::
+        ERROR_OAUTH_TOKEN_OPERATION_CANCELED_EXCEPTION:
+    case mojom::CloudProvisionFlowError::ERROR_REQUEST_ANDROID_ID_FAILED:
+      VLOG(1) << "ArcProvisioningDpcResult[kUnknownError]="
+              << static_cast<
+                     std::underlying_type_t<mojom::CloudProvisionFlowError>>(
+                     error);
+      return ArcProvisioningDpcResult::kUnknownError;
+  }
+}
+
+ArcProvisioningSigninResult GetSigninErrorResult(mojom::GMSSignInError error) {
+  switch (error) {
+    case mojom::GMSSignInError::GMS_SIGN_IN_NETWORK_ERROR:
+      return ArcProvisioningSigninResult::kNetworkError;
+    case mojom::GMSSignInError::GMS_SIGN_IN_SERVICE_UNAVAILABLE:
+      return ArcProvisioningSigninResult::kServiceUnavailable;
+    case mojom::GMSSignInError::GMS_SIGN_IN_BAD_AUTHENTICATION:
+      return ArcProvisioningSigninResult::kAuthFailure;
+    case mojom::GMSSignInError::GMS_SIGN_IN_TIMEOUT:
+      return ArcProvisioningSigninResult::kTimeout;
+    case mojom::GMSSignInError::GMS_SIGN_IN_FAILED:
+    case mojom::GMSSignInError::GMS_SIGN_IN_INTERNAL_ERROR:
+      VLOG(1) << "ArcProvisioningSigninResult[kUnknownError]="
+              << static_cast<std::underlying_type_t<mojom::GMSSignInError>>(
+                     error);
+      return ArcProvisioningSigninResult::kUnknownError;
+  }
+}
+
+ArcProvisioningCheckinResult GetCheckinErrorResult(
+    mojom::GMSCheckInError error) {
+  switch (error) {
+    case mojom::GMSCheckInError::GMS_CHECK_IN_TIMEOUT:
+      return ArcProvisioningCheckinResult::kTimeout;
+    case mojom::GMSCheckInError::GMS_CHECK_IN_FAILED:
+    case mojom::GMSCheckInError::GMS_CHECK_IN_INTERNAL_ERROR:
+      VLOG(1) << "ArcProvisioningCheckinResult[kUnknownError]="
+              << static_cast<std::underlying_type_t<mojom::GMSCheckInError>>(
+                     error);
+      return ArcProvisioningCheckinResult::kUnknownError;
+  }
+}
+
 ProvisioningStatus GetProvisioningStatus(
     const ArcProvisioningResult& provisioning_result) {
   if (provisioning_result.stop_reason())
diff --git a/chrome/browser/ash/arc/arc_optin_uma.h b/chrome/browser/ash/arc/arc_optin_uma.h
index 39de096..f5dda8c9 100644
--- a/chrome/browser/ash/arc/arc_optin_uma.h
+++ b/chrome/browser/ash/arc/arc_optin_uma.h
@@ -208,6 +208,41 @@
 
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
+enum class ArcProvisioningCheckinResult {
+  kSuccess = 0,
+  kUnknownError = 1,
+  kTimeout = 2,
+  kMaxValue = kTimeout,
+};
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class ArcProvisioningDpcResult {
+  kSuccess = 0,
+  kUnknownError = 1,
+  kInvalidToken = 2,
+  kAccountAddFail = 3,
+  kTimeout = 4,
+  kNetworkError = 5,
+  kOAuthAuthException = 6,
+  kOAuthIOException = 7,
+  kMaxValue = kOAuthIOException,
+};
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class ArcProvisioningSigninResult {
+  kSuccess = 0,
+  kUnknownError = 1,
+  kNetworkError = 2,
+  kServiceUnavailable = 3,
+  kAuthFailure = 4,
+  kTimeout = 5,
+  kMaxValue = kTimeout,
+};
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
 enum class ArcEnabledState {
   // ARC++ is enabled for non-managed case.
   ENABLED_NOT_MANAGED = 0,
@@ -249,12 +284,12 @@
 void UpdateOptInNetworkErrorActionUMA(OptInNetworkErrorActionType type);
 void UpdateProvisioningStatusUMA(ProvisioningStatus status,
                                  const Profile* profile);
-void UpdateCloudProvisionFlowErrorUMA(mojom::CloudProvisionFlowError error,
-                                      const Profile* profile);
-void UpdateGMSSignInErrorUMA(mojom::GMSSignInError error,
-                             const Profile* profile);
-void UpdateGMSCheckInErrorUMA(mojom::GMSCheckInError error,
-                              const Profile* profile);
+void UpdateProvisioningDpcResultUMA(ArcProvisioningDpcResult result,
+                                    const Profile* profile);
+void UpdateProvisioningSigninResultUMA(ArcProvisioningSigninResult result,
+                                       const Profile* profile);
+void UpdateProvisioningCheckinResultUMA(ArcProvisioningCheckinResult result,
+                                        const Profile* profile);
 void UpdateSecondarySigninResultUMA(ProvisioningStatus status);
 void UpdateProvisioningTiming(const base::TimeDelta& elapsed_time,
                               bool success,
@@ -287,6 +322,15 @@
     const Profile* profile,
     mojom::MainAccountResolutionStatus status);
 
+// Returns the enum for use in UMA stat for reporting DPC errors.
+ArcProvisioningDpcResult GetDpcErrorResult(
+    mojom::CloudProvisionFlowError error);
+// Returns the enum for use in UMA stat for reporting signin errors.
+ArcProvisioningSigninResult GetSigninErrorResult(mojom::GMSSignInError error);
+// Returns the enum for use in UMA stat for reporting checkin errors.
+ArcProvisioningCheckinResult GetCheckinErrorResult(
+    mojom::GMSCheckInError error);
+
 // Returns the enum for use in UMA stat and displaying error code on the UI.
 // This enum should not be used anywhere else. Please work with the object
 // instead.
diff --git a/chrome/browser/ash/arc/session/arc_session_manager.cc b/chrome/browser/ash/arc/session/arc_session_manager.cc
index 158a163..5b425463 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager.cc
+++ b/chrome/browser/ash/arc/session/arc_session_manager.cc
@@ -678,12 +678,15 @@
     UpdateProvisioningStatusUMA(GetProvisioningStatus(result), profile_);
 
     if (result.gms_sign_in_error()) {
-      UpdateGMSSignInErrorUMA(result.gms_sign_in_error().value(), profile_);
+      UpdateProvisioningSigninResultUMA(
+          GetSigninErrorResult(result.gms_sign_in_error().value()), profile_);
     } else if (result.gms_check_in_error()) {
-      UpdateGMSCheckInErrorUMA(result.gms_check_in_error().value(), profile_);
+      UpdateProvisioningCheckinResultUMA(
+          GetCheckinErrorResult(result.gms_check_in_error().value()), profile_);
     } else if (result.cloud_provision_flow_error()) {
-      UpdateCloudProvisionFlowErrorUMA(
-          result.cloud_provision_flow_error().value(), profile_);
+      UpdateProvisioningDpcResultUMA(
+          GetDpcErrorResult(result.cloud_provision_flow_error().value()),
+          profile_);
     }
 
     if (!provisioning_successful) {
@@ -703,8 +706,18 @@
       scoped_opt_in_tracker_.reset();
     }
 
-    prefs->SetBoolean(prefs::kArcIsManaged,
-                      policy_util::IsAccountManaged(profile_));
+    bool managed = policy_util::IsAccountManaged(profile_);
+    if (managed) {
+      UpdateProvisioningDpcResultUMA(ArcProvisioningDpcResult::kSuccess,
+                                     profile_);
+    } else {
+      UpdateProvisioningSigninResultUMA(ArcProvisioningSigninResult::kSuccess,
+                                        profile_);
+    }
+    UpdateProvisioningCheckinResultUMA(ArcProvisioningCheckinResult::kSuccess,
+                                       profile_);
+
+    prefs->SetBoolean(prefs::kArcIsManaged, managed);
 
     if (prefs->HasPrefPath(prefs::kArcSignedIn) &&
         prefs->GetBoolean(prefs::kArcSignedIn)) {
diff --git a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc
index 885005843..91d2372 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc
+++ b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc
@@ -907,6 +907,106 @@
   EXPECT_TRUE(arc_session_manager()->IsPlaystoreLaunchRequestedForTesting());
 }
 
+TEST_F(ArcSessionManagerTest, Provisioning_SigninErrorMetric) {
+  arc_session_manager()->SetProfile(profile());
+  arc_session_manager()->Initialize();
+  arc_session_manager()->RequestEnable();
+  arc_session_manager()->EmulateRequirementCheckCompletionForTesting();
+
+  base::HistogramTester histogram_tester;
+
+  arc::mojom::ArcSignInResultPtr result = arc::mojom::ArcSignInResult::NewError(
+      arc::mojom::ArcSignInError::NewSignInError(
+          arc::mojom::GMSSignInError::GMS_SIGN_IN_NETWORK_ERROR));
+  arc_session_manager()->OnProvisioningFinished(
+      ArcProvisioningResult(std::move(result)));
+
+  histogram_tester.ExpectUniqueSample("Arc.Provisioning.SigninResult.Unmanaged",
+                                      2 /*kNetworkError*/, 1);
+  arc_session_manager()->Shutdown();
+}
+
+TEST_F(ArcSessionManagerTest, Provisioning_DpcErrorMetric) {
+  arc_session_manager()->SetProfile(profile());
+  arc_session_manager()->Initialize();
+  arc_session_manager()->RequestEnable();
+  arc_session_manager()->EmulateRequirementCheckCompletionForTesting();
+
+  base::HistogramTester histogram_tester;
+
+  arc::mojom::ArcSignInResultPtr result = arc::mojom::ArcSignInResult::NewError(
+      arc::mojom::ArcSignInError::NewCloudProvisionFlowError(
+          arc::mojom::CloudProvisionFlowError::ERROR_ADD_ACCOUNT_FAILED));
+  arc_session_manager()->OnProvisioningFinished(
+      ArcProvisioningResult(std::move(result)));
+
+  histogram_tester.ExpectUniqueSample("Arc.Provisioning.DpcResult.Unmanaged",
+                                      3 /*kAccountAddFail*/, 1);
+  arc_session_manager()->Shutdown();
+}
+
+TEST_F(ArcSessionManagerTest, Provisioning_CheckinErrorMetric) {
+  arc_session_manager()->SetProfile(profile());
+  arc_session_manager()->Initialize();
+  arc_session_manager()->RequestEnable();
+  arc_session_manager()->EmulateRequirementCheckCompletionForTesting();
+
+  base::HistogramTester histogram_tester;
+
+  arc::mojom::ArcSignInResultPtr result = arc::mojom::ArcSignInResult::NewError(
+      arc::mojom::ArcSignInError::NewCheckInError(
+          arc::mojom::GMSCheckInError::GMS_CHECK_IN_TIMEOUT));
+  arc_session_manager()->OnProvisioningFinished(
+      ArcProvisioningResult(std::move(result)));
+
+  histogram_tester.ExpectUniqueSample(
+      "Arc.Provisioning.CheckinResult.Unmanaged", 2 /*kTimeout*/, 1);
+  arc_session_manager()->Shutdown();
+}
+
+TEST_F(ArcSessionManagerTest, Provisioning_SuccessMetric_Unmanaged) {
+  arc_session_manager()->SetProfile(profile());
+  arc_session_manager()->Initialize();
+  arc_session_manager()->RequestEnable();
+  arc_session_manager()->EmulateRequirementCheckCompletionForTesting();
+
+  base::HistogramTester histogram_tester;
+
+  arc::mojom::ArcSignInResultPtr result =
+      arc::mojom::ArcSignInResult::NewSuccess(
+          arc::mojom::ArcSignInSuccess::SUCCESS);
+  arc_session_manager()->OnProvisioningFinished(
+      ArcProvisioningResult(std::move(result)));
+
+  histogram_tester.ExpectUniqueSample("Arc.Provisioning.SigninResult.Unmanaged",
+                                      0, 1);
+  histogram_tester.ExpectUniqueSample(
+      "Arc.Provisioning.CheckinResult.Unmanaged", 0, 1);
+  arc_session_manager()->Shutdown();
+}
+
+TEST_F(ArcSessionManagerTest, Provisioning_SuccessMetric_Managed) {
+  arc_session_manager()->SetProfile(profile());
+  arc_session_manager()->Initialize();
+  arc_session_manager()->RequestEnable();
+  arc_session_manager()->EmulateRequirementCheckCompletionForTesting();
+  profile()->GetProfilePolicyConnector()->OverrideIsManagedForTesting(true);
+
+  base::HistogramTester histogram_tester;
+
+  arc::mojom::ArcSignInResultPtr result =
+      arc::mojom::ArcSignInResult::NewSuccess(
+          arc::mojom::ArcSignInSuccess::SUCCESS);
+  arc_session_manager()->OnProvisioningFinished(
+      ArcProvisioningResult(std::move(result)));
+
+  histogram_tester.ExpectUniqueSample("Arc.Provisioning.DpcResult.Managed", 0,
+                                      1);
+  histogram_tester.ExpectUniqueSample("Arc.Provisioning.CheckinResult.Managed",
+                                      0, 1);
+  arc_session_manager()->Shutdown();
+}
+
 // Verifies that Play Store shown is suppressed on restart when required.
 TEST_F(ArcSessionManagerTest, PlayStoreSuppressed) {
   // Set up the situation that terms were accepted in the previous session.
diff --git a/tools/metrics/histograms/metadata/arc/enums.xml b/tools/metrics/histograms/metadata/arc/enums.xml
index bd268f7..b6fece4 100644
--- a/tools/metrics/histograms/metadata/arc/enums.xml
+++ b/tools/metrics/histograms/metadata/arc/enums.xml
@@ -498,59 +498,35 @@
   <int value="29" label="enabledSystemAppPackageNames"/>
 </enum>
 
-<enum name="ArcProvisioningCheckInError">
-  <summary>Defines ARC GMS check-in failure reasons</summary>
-  <int value="1" label="Check-in failed"/>
+<enum name="ArcProvisioningCheckinResult">
+  <summary>Defines ARC GMS check-in success or failure reasons</summary>
+  <int value="0" label="Success"/>
+  <int value="1" label="Unknown error"/>
   <int value="2" label="Timeout"/>
-  <int value="3" label="Internal error"/>
 </enum>
 
-<enum name="ArcProvisioningCloudFlowError">
-  <summary>Defines Arc Cloud DPC Provisioning failure reasons</summary>
-  <int value="0" label="Unknown or uncommon error"/>
-  <int value="1" label="Enrollment token provided was invalid"/>
-  <int value="2" label="Enterprise hit device quota"/>
-  <int value="3"
-      label="CloudDPS could not fulfill request because of a transient error"/>
-  <int value="4" label="Account could not be added"/>
-  <int value="5" label="Could not get Android ID"/>
-  <int value="6" label="Device got stuck in quarantine mode"/>
-  <int value="7" label="Setup step timed out"/>
-  <int value="8"
+<enum name="ArcProvisioningDpcResult">
+  <summary>Defines ARC DPC Provisioning success or failure reasons</summary>
+  <int value="0" label="Success"/>
+  <int value="1" label="Unknown error"/>
+  <int value="2" label="Enrollment token provided was invalid"/>
+  <int value="3" label="Account could not be added"/>
+  <int value="4" label="Setup step timed out"/>
+  <int value="5"
       label="There was no network, so device couldn't fulfill a request"/>
-  <int value="9" label="Enterprise is not registered with CloudDPx"/>
-  <int value="10" label="User cancelled the step"/>
-  <int value="11"
-      label="Either account migration failed or account was deleted by user
-             during provisioning"/>
-  <int value="12" label="Policy got stuck in invalid state"/>
-  <int value="13" label="Issues with DpcSupport"/>
-  <int value="14" label="Account wad not ready"/>
-  <int value="15" label="Checkin failed"/>
-  <int value="16" label="Issues with whitelisting work account"/>
-  <int value="17" label="Error parsing JSON, most likely policy JSON"/>
-  <int value="18" label="ManagedProvisioning failed"/>
-  <int value="19" label="Setup intent could not be parsed"/>
-  <int value="20" label="CloudDPS exception with an uncommon server code"/>
-  <int value="21"
-      label="Removing a previously existing unmanaged account failed"/>
-  <int value="22" label="Error with getting OAuth token"/>
-  <int value="23" label="AccountException with no exception details"/>
-  <int value="24"
+  <int value="6"
       label="Error with getting OAuth token due to AuthenticatorException"/>
-  <int value="25" label="Error with getting OAuth token due to IOException"/>
-  <int value="26"
-      label="Error with getting OAuth token due to OperationCanceledException"/>
+  <int value="7" label="Error with getting OAuth token due to IOException"/>
 </enum>
 
-<enum name="ArcProvisioningSignInError">
-  <summary>Defines ARC GMS sign-in failure reasons</summary>
-  <int value="1" label="Network error"/>
-  <int value="2" label="Sign-in service unavailble"/>
-  <int value="3" label="Bad authentication"/>
-  <int value="4" label="Unknown error"/>
+<enum name="ArcProvisioningSigninResult">
+  <summary>Defines ARC GMS sign-in success or failure reasons</summary>
+  <int value="0" label="Success"/>
+  <int value="1" label="Unknown error"/>
+  <int value="2" label="Network error"/>
+  <int value="3" label="Sign-in service unavailble"/>
+  <int value="4" label="Bad authentication"/>
   <int value="5" label="Timeout"/>
-  <int value="6" label="Internal error"/>
 </enum>
 
 <enum name="ArcProvisioningStatus">
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index 2e6d5000..adc0b0d 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -1868,27 +1868,14 @@
   </summary>
 </histogram>
 
-<histogram name="Arc.Provisioning.CheckInError{ArcUserTypes}"
-    enum="ArcProvisioningCheckInError" expires_after="never">
+<histogram name="Arc.Provisioning.CheckinResult{ArcUserTypes}"
+    enum="ArcProvisioningCheckinResult" expires_after="never">
 <!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
 
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
-    The error that occurred during GMS check-in operation. Recorded when ARC++
-    provisioning flow fails. {ArcUserTypes}
-  </summary>
-  <token key="ArcUserTypes" variants="ArcUserTypes"/>
-</histogram>
-
-<histogram name="Arc.Provisioning.CloudFlowError{ArcUserTypes}"
-    enum="ArcProvisioningCloudFlowError" expires_after="never">
-<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
-
-  <owner>mhasank@google.com</owner>
-  <owner>arc-core@google.com</owner>
-  <summary>
-    The result (success or the reason of failure) of Cloud DPC provisioning.
+    The result (success or the reason of failure) of GMS check-in operation.
     Recorded when ARC++ provisioning flow completes. {ArcUserTypes}
   </summary>
   <token key="ArcUserTypes" variants="ArcUserTypes"/>
@@ -1905,6 +1892,19 @@
   </summary>
 </histogram>
 
+<histogram name="Arc.Provisioning.DpcResult{ArcUserTypes}"
+    enum="ArcProvisioningDpcResult" expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
+  <owner>mhasank@google.com</owner>
+  <owner>arc-core@google.com</owner>
+  <summary>
+    The result (success or the reason of failure) of Cloud DPC provisioning.
+    Recorded when ARC++ provisioning flow completes. {ArcUserTypes}
+  </summary>
+  <token key="ArcUserTypes" variants="ArcUserTypes"/>
+</histogram>
+
 <histogram name="Arc.Provisioning.PreSignIn.TimeDelta{ArcUserTypes}" units="ms"
     expires_after="never">
 <!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
@@ -1921,15 +1921,15 @@
   </token>
 </histogram>
 
-<histogram name="Arc.Provisioning.SignInError{ArcUserTypes}"
-    enum="ArcProvisioningSignInError" expires_after="never">
+<histogram name="Arc.Provisioning.SigninResult{ArcUserTypes}"
+    enum="ArcProvisioningSigninResult" expires_after="never">
 <!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
 
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
-    The error that occured during GMS sign-in operation. Recorded when ARC++
-    provisioning flow fails. {ArcUserTypes}
+    The result (success or the reason of failure) of GMS sign-in operation.
+    Recorded when ARC++ provisioning flow completes. {ArcUserTypes}
   </summary>
   <token key="ArcUserTypes" variants="ArcUserTypes"/>
 </histogram>