[signin] Add metrics to indicate the OAuth outages in Dice.

(cherry picked from commit c20c4f1610b3d3b8d0e0c01d6d84c60067a970f2)

Bug: 1115247
Change-Id: I021ed4188b4aca948b54df2af0117c6a5ce9f398
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2445490
Commit-Queue: David Roger <[email protected]>
Reviewed-by: Brian White <[email protected]>
Reviewed-by: Monica Basta <[email protected]>
Reviewed-by: David Roger <[email protected]>
Cr-Original-Commit-Position: refs/heads/master@{#814620}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2460731
Cr-Commit-Position: refs/branch-heads/4280@{#141}
Cr-Branched-From: ea420fb963f9658c9969b6513c56b8f47efa1a2a-refs/heads/master@{#812852}
diff --git a/components/signin/core/browser/dice_header_helper.cc b/components/signin/core/browser/dice_header_helper.cc
index 1de3ed9..0b0b4a14 100644
--- a/components/signin/core/browser/dice_header_helper.cc
+++ b/components/signin/core/browser/dice_header_helper.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -120,12 +121,18 @@
     return DiceResponseParams();
   }
 
-  if (params.signin_info && params.signin_info->authorization_code.empty() &&
-      !params.signin_info->no_authorization_code) {
-    DLOG(WARNING)
-        << "Missing authorization code  and no authorization code headers"
-        << "in Dice SIGNIN header: " << header_value;
-    return DiceResponseParams();
+  if (params.signin_info) {
+    if (params.signin_info->authorization_code.empty() &&
+        !params.signin_info->no_authorization_code) {
+      DLOG(WARNING)
+          << "Missing authorization code  and no authorization code headers"
+          << "in Dice SIGNIN header: " << header_value;
+      return DiceResponseParams();
+    }
+    // Uma histogram that records whether the authorization code was present or
+    // not.
+    base::UmaHistogramBoolean("Signin.DiceAuthorizationCode",
+                              !params.signin_info->authorization_code.empty());
   }
 
   return params;
diff --git a/components/signin/core/browser/signin_header_helper_unittest.cc b/components/signin/core/browser/signin_header_helper_unittest.cc
index 4629913..83f44c4 100644
--- a/components/signin/core/browser/signin_header_helper_unittest.cc
+++ b/components/signin/core/browser/signin_header_helper_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/command_line.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
@@ -436,6 +437,7 @@
 
   {
     // Signin response.
+    base::HistogramTester histogram_tester;
     DiceResponseParams params =
         BuildDiceSigninResponseParams(base::StringPrintf(
             "action=SIGNIN,id=%s,email=%s,authuser=%i,authorization_code=%s",
@@ -446,6 +448,8 @@
     EXPECT_EQ(kEmail, params.signin_info->account_info.email);
     EXPECT_EQ(kSessionIndex, params.signin_info->account_info.session_index);
     EXPECT_EQ(kAuthorizationCode, params.signin_info->authorization_code);
+    histogram_tester.ExpectUniqueSample("Signin.DiceAuthorizationCode", true,
+                                        1);
   }
 
   {
@@ -503,9 +507,10 @@
   {
     // Signin response with no_authorization_code and missing
     // authorization_code.
+    base::HistogramTester histogram_tester;
     DiceResponseParams params = BuildDiceSigninResponseParams(
-        base::StringPrintf("action=SIGNIN,id=%s,email=%s,authuser=%i,no_"
-                           "authorization_code=true",
+        base::StringPrintf("action=SIGNIN,id=%s,email=%s,authuser=%i,"
+                           "no_authorization_code=true",
                            kGaiaID, kEmail, kSessionIndex));
     EXPECT_EQ(DiceAction::SIGNIN, params.user_intention);
     ASSERT_TRUE(params.signin_info);
@@ -514,14 +519,18 @@
     EXPECT_EQ(kSessionIndex, params.signin_info->account_info.session_index);
     EXPECT_TRUE(params.signin_info->authorization_code.empty());
     EXPECT_TRUE(params.signin_info->no_authorization_code);
+    histogram_tester.ExpectUniqueSample("Signin.DiceAuthorizationCode", false,
+                                        1);
   }
 
   {
     // Missing authorization code and no_authorization_code.
+    base::HistogramTester histogram_tester;
     DiceResponseParams params = BuildDiceSigninResponseParams(
         base::StringPrintf("action=SIGNIN,id=%s,email=%s,authuser=%i", kGaiaID,
                            kEmail, kSessionIndex));
     EXPECT_EQ(DiceAction::NONE, params.user_intention);
+    histogram_tester.ExpectTotalCount("Signin.DiceAuthorizationCode", 0);
   }
 
   {
diff --git a/tools/metrics/histograms/histograms_xml/signin/histograms.xml b/tools/metrics/histograms/histograms_xml/signin/histograms.xml
index c1c0efbc..7b20e18 100644
--- a/tools/metrics/histograms/histograms_xml/signin/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/signin/histograms.xml
@@ -245,6 +245,18 @@
   <summary>The total number of accounts in the cookie jar.</summary>
 </histogram>
 
+<histogram name="Signin.DiceAuthorizationCode" enum="BooleanPresent"
+    expires_after="never">
+<!-- expires-never: used to monitor OAuth outages in Dice.  -->
+
+  <owner>[email protected]</owner>
+  <owner>[email protected]</owner>
+  <summary>
+    Recorded when a Dice signin response is received and indicates whether the
+    authorization code was present or not.
+  </summary>
+</histogram>
+
 <histogram name="Signin.DiceResponseHeader" enum="SigninDiceResponseHeader"
     expires_after="never">
 <!-- expires-never: used to monitor the health of the Dice feature and for troubleshooting.  -->