Log SharingMessage histograms with message type suffix.

Bug: 1010515
Change-Id: If62345aba1aed10d3e679140ee66aeb2f074115f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1841331
Reviewed-by: Ilya Sherman <[email protected]>
Reviewed-by: Alex Chau <[email protected]>
Commit-Queue: Michael van Ouwerkerk <[email protected]>
Auto-Submit: Michael van Ouwerkerk <[email protected]>
Cr-Commit-Position: refs/heads/master@{#706831}
diff --git a/chrome/browser/sharing/ack_message_handler.cc b/chrome/browser/sharing/ack_message_handler.cc
index 5f93d0f..f4489185 100644
--- a/chrome/browser/sharing/ack_message_handler.cc
+++ b/chrome/browser/sharing/ack_message_handler.cc
@@ -13,7 +13,8 @@
 void AckMessageHandler::OnMessage(
     const chrome_browser_sharing::SharingMessage& message) {
   for (AckMessageObserver& observer : observers_)
-    observer.OnAckReceived(message.ack_message().original_message_id());
+    observer.OnAckReceived(message.ack_message().original_message_type(),
+                           message.ack_message().original_message_id());
 }
 
 void AckMessageHandler::AddObserver(AckMessageObserver* observer) {
diff --git a/chrome/browser/sharing/ack_message_handler.h b/chrome/browser/sharing/ack_message_handler.h
index 8e00dad..71ecc7f 100644
--- a/chrome/browser/sharing/ack_message_handler.h
+++ b/chrome/browser/sharing/ack_message_handler.h
@@ -11,15 +11,21 @@
 #include "base/observer_list.h"
 #include "chrome/browser/sharing/sharing_message_handler.h"
 
+namespace chrome_browser_sharing {
+enum MessageType : int;
+}  // namespace chrome_browser_sharing
+
 // Class to managae ack message and notify observers.
 class AckMessageHandler : public SharingMessageHandler {
  public:
   // Interface for objects observing ack message received events.
   class AckMessageObserver : public base::CheckedObserver {
    public:
-    // Called when an ack message is received, where the identifier of original
-    // message is |message_id|.
-    virtual void OnAckReceived(const std::string& message_id) = 0;
+    // Called when an ack message is received, where |message_type| is the type
+    // of the original message, and |message_id| is the identifier of the
+    // original message.
+    virtual void OnAckReceived(chrome_browser_sharing::MessageType message_type,
+                               const std::string& message_id) = 0;
   };
 
   AckMessageHandler();
diff --git a/chrome/browser/sharing/ack_message_handler_unittest.cc b/chrome/browser/sharing/ack_message_handler_unittest.cc
index 6addf3d..1a3cb39 100644
--- a/chrome/browser/sharing/ack_message_handler_unittest.cc
+++ b/chrome/browser/sharing/ack_message_handler_unittest.cc
@@ -11,13 +11,20 @@
 
 class TestObserver : public AckMessageHandler::AckMessageObserver {
  public:
-  void OnAckReceived(const std::string& message_id) override {
+  void OnAckReceived(chrome_browser_sharing::MessageType message_type,
+                     const std::string& message_id) override {
+    received_message_type_ = message_type;
     received_message_id_ = message_id;
   }
 
+  chrome_browser_sharing::MessageType received_message_type() const {
+    return received_message_type_;
+  }
+
   std::string received_message_id() const { return received_message_id_; }
 
  private:
+  chrome_browser_sharing::MessageType received_message_type_;
   std::string received_message_id_;
 };
 
@@ -37,8 +44,12 @@
   chrome_browser_sharing::SharingMessage sharing_message;
   sharing_message.mutable_ack_message()->set_original_message_id(
       kTestMessageId);
+  sharing_message.mutable_ack_message()->set_original_message_type(
+      chrome_browser_sharing::CLICK_TO_CALL_MESSAGE);
 
   ack_message_handler_.OnMessage(sharing_message);
 
   EXPECT_EQ(kTestMessageId, test_observer_.received_message_id());
+  EXPECT_EQ(chrome_browser_sharing::CLICK_TO_CALL_MESSAGE,
+            test_observer_.received_message_type());
 }
diff --git a/chrome/browser/sharing/proto/sharing_message.proto b/chrome/browser/sharing/proto/sharing_message.proto
index 29bda1a..d6cc93c 100644
--- a/chrome/browser/sharing/proto/sharing_message.proto
+++ b/chrome/browser/sharing/proto/sharing_message.proto
@@ -12,6 +12,18 @@
 // Required in Chrome.
 option optimize_for = LITE_RUNTIME;
 
+// Enum for identifying a message type.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused. Keep this in sync with
+// SharingMessageType in enums.xml.
+enum MessageType {
+  UNKNOWN_MESSAGE = 0;
+  PING_MESSAGE = 1;
+  ACK_MESSAGE = 2;
+  CLICK_TO_CALL_MESSAGE = 3;
+  SHARED_CLIPBOARD_MESSAGE = 4;
+}
+
 // Message for sending between devices in Sharing.
 message SharingMessage {
   // Identifier of sender. required.
@@ -41,6 +53,9 @@
 message AckMessage {
   // required.
   string original_message_id = 1;
+
+  // The type of message that this is acknowledging. optional.
+  MessageType original_message_type = 2;
 }
 
 // Message for data necessary to send an AckMessage to the sender.
diff --git a/chrome/browser/sharing/sharing_fcm_handler.cc b/chrome/browser/sharing/sharing_fcm_handler.cc
index 477217a2..ccf11c78 100644
--- a/chrome/browser/sharing/sharing_fcm_handler.cc
+++ b/chrome/browser/sharing/sharing_fcm_handler.cc
@@ -105,7 +105,17 @@
   DCHECK(sharing_message.payload_case() != SharingMessage::PAYLOAD_NOT_SET)
       << "No payload set in SharingMessage received";
 
-  LogSharingMessageReceived(sharing_message.payload_case());
+  chrome_browser_sharing::MessageType message_type =
+      chrome_browser_sharing::UNKNOWN_MESSAGE;
+  if (sharing_message.payload_case() ==
+      chrome_browser_sharing::SharingMessage::kAckMessage) {
+    DCHECK(sharing_message.has_ack_message());
+    message_type = sharing_message.ack_message().original_message_type();
+  } else {
+    message_type =
+        SharingPayloadCaseToMessageType(sharing_message.payload_case());
+  }
+  LogSharingMessageReceived(message_type, sharing_message.payload_case());
 
   auto it = sharing_handlers_.find(sharing_message.payload_case());
   if (it == sharing_handlers_.end()) {
@@ -152,26 +162,33 @@
   SharingMessage ack_message;
   ack_message.mutable_ack_message()->set_original_message_id(
       original_message_id);
+  chrome_browser_sharing::MessageType original_message_type =
+      SharingPayloadCaseToMessageType(original_message.payload_case());
+  ack_message.mutable_ack_message()->set_original_message_type(
+      original_message_type);
 
   base::Optional<syncer::DeviceInfo::SharingInfo> sharing_info =
       GetSharingInfo(original_message);
   if (!sharing_info) {
     LOG(ERROR) << "Unable to find sharing info";
-    LogSendSharingAckMessageResult(SharingSendMessageResult::kDeviceNotFound);
+    LogSendSharingAckMessageResult(original_message_type,
+                                   SharingSendMessageResult::kDeviceNotFound);
     return;
   }
 
   sharing_fcm_sender_->SendMessageToDevice(
       std::move(*sharing_info), kAckTimeToLive, std::move(ack_message),
       base::BindOnce(&SharingFCMHandler::OnAckMessageSent,
-                     weak_ptr_factory_.GetWeakPtr(), original_message_id));
+                     weak_ptr_factory_.GetWeakPtr(), original_message_id,
+                     original_message_type));
 }
 
 void SharingFCMHandler::OnAckMessageSent(
     const std::string& original_message_id,
+    chrome_browser_sharing::MessageType original_message_type,
     SharingSendMessageResult result,
     base::Optional<std::string> message_id) {
-  LogSendSharingAckMessageResult(result);
+  LogSendSharingAckMessageResult(original_message_type, result);
   if (result != SharingSendMessageResult::kSuccessful)
     LOG(ERROR) << "Failed to send ack mesage for " << original_message_id;
 }
diff --git a/chrome/browser/sharing/sharing_fcm_handler.h b/chrome/browser/sharing/sharing_fcm_handler.h
index 6d0c3ee..c6e389da 100644
--- a/chrome/browser/sharing/sharing_fcm_handler.h
+++ b/chrome/browser/sharing/sharing_fcm_handler.h
@@ -76,9 +76,11 @@
   void SendAckMessage(const SharingMessage& original_message,
                       const std::string& original_message_id);
 
-  void OnAckMessageSent(const std::string& original_message_id,
-                        SharingSendMessageResult result,
-                        base::Optional<std::string> message_id);
+  void OnAckMessageSent(
+      const std::string& original_message_id,
+      chrome_browser_sharing::MessageType original_message_type,
+      SharingSendMessageResult result,
+      base::Optional<std::string> message_id);
 
   gcm::GCMDriver* const gcm_driver_;
   SharingFCMSender* sharing_fcm_sender_;
diff --git a/chrome/browser/sharing/sharing_fcm_handler_unittest.cc b/chrome/browser/sharing/sharing_fcm_handler_unittest.cc
index 3a32ac75..3aae1a10 100644
--- a/chrome/browser/sharing/sharing_fcm_handler_unittest.cc
+++ b/chrome/browser/sharing/sharing_fcm_handler_unittest.cc
@@ -50,7 +50,7 @@
   MOCK_METHOD4(SendMessageToDevice,
                void(syncer::DeviceInfo::SharingInfo target,
                     base::TimeDelta time_to_live,
-                    chrome_browser_sharing::SharingMessage message,
+                    SharingMessage message,
                     SendMessageCallback callback));
 };
 
@@ -142,6 +142,8 @@
   SharingMessage sharing_ack_message;
   sharing_ack_message.mutable_ack_message()->set_original_message_id(
       kTestMessageId);
+  sharing_ack_message.mutable_ack_message()->set_original_message_type(
+      chrome_browser_sharing::PING_MESSAGE);
 
   // Tests OnMessage flow in SharingFCMHandler when no handler is registered.
   EXPECT_CALL(mock_sharing_message_handler_, OnMessage(_)).Times(0);
@@ -183,6 +185,8 @@
   SharingMessage sharing_ack_message;
   sharing_ack_message.mutable_ack_message()->set_original_message_id(
       kTestMessageId);
+  sharing_ack_message.mutable_ack_message()->set_original_message_type(
+      chrome_browser_sharing::PING_MESSAGE);
 
   // Tests OnMessage flow in SharingFCMHandler after handler is added.
   EXPECT_CALL(mock_sharing_message_handler_,
@@ -212,6 +216,8 @@
   SharingMessage sharing_ack_message;
   sharing_ack_message.mutable_ack_message()->set_original_message_id(
       kTestMessageId);
+  sharing_ack_message.mutable_ack_message()->set_original_message_type(
+      chrome_browser_sharing::PING_MESSAGE);
 
   EXPECT_CALL(mock_sharing_message_handler_,
               OnMessage(ProtoEquals(sharing_message)));
diff --git a/chrome/browser/sharing/sharing_metrics.cc b/chrome/browser/sharing/sharing_metrics.cc
index f49fbd2..7ab85015 100644
--- a/chrome/browser/sharing/sharing_metrics.cc
+++ b/chrome/browser/sharing/sharing_metrics.cc
@@ -18,34 +18,6 @@
 #include "services/metrics/public/cpp/ukm_source_id.h"
 
 namespace {
-
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class SharingMessageType {
-  kUnknownMessage = 0,
-  kPingMessage = 1,
-  kAckMessage = 2,
-  kClickToCallMessage = 3,
-  kSharedClipboardMessage = 4,
-  kMaxValue = kSharedClipboardMessage,
-};
-
-SharingMessageType PayloadCaseToMessageType(
-    chrome_browser_sharing::SharingMessage::PayloadCase payload_case) {
-  switch (payload_case) {
-    case chrome_browser_sharing::SharingMessage::PAYLOAD_NOT_SET:
-      return SharingMessageType::kUnknownMessage;
-    case chrome_browser_sharing::SharingMessage::kPingMessage:
-      return SharingMessageType::kPingMessage;
-    case chrome_browser_sharing::SharingMessage::kAckMessage:
-      return SharingMessageType::kAckMessage;
-    case chrome_browser_sharing::SharingMessage::kClickToCallMessage:
-      return SharingMessageType::kClickToCallMessage;
-    case chrome_browser_sharing::SharingMessage::kSharedClipboardMessage:
-      return SharingMessageType::kSharedClipboardMessage;
-  }
-}
-
 const char* GetEnumStringValue(SharingFeatureName feature) {
   DCHECK(feature != SharingFeatureName::kUnknown)
       << "Feature needs to be specified for metrics logging.";
@@ -59,12 +31,54 @@
       return "SharedClipboard";
   }
 }
+
+const std::string& MessageTypeToMessageSuffix(
+    chrome_browser_sharing::MessageType message_type) {
+  // For proto3 enums unrecognized enum values are kept when parsing and their
+  // name is an empty string. We don't want to use that as a histogram suffix.
+  // The returned values must match the values of the SharingMessage suffixes
+  // defined in histograms.xml.
+  if (!chrome_browser_sharing::MessageType_IsValid(message_type)) {
+    return chrome_browser_sharing::MessageType_Name(
+        chrome_browser_sharing::UNKNOWN_MESSAGE);
+  }
+  return chrome_browser_sharing::MessageType_Name(message_type);
+}
 }  // namespace
 
-void LogSharingMessageReceived(
+chrome_browser_sharing::MessageType SharingPayloadCaseToMessageType(
     chrome_browser_sharing::SharingMessage::PayloadCase payload_case) {
-  base::UmaHistogramEnumeration("Sharing.MessageReceivedType",
-                                PayloadCaseToMessageType(payload_case));
+  switch (payload_case) {
+    case chrome_browser_sharing::SharingMessage::PAYLOAD_NOT_SET:
+      return chrome_browser_sharing::UNKNOWN_MESSAGE;
+    case chrome_browser_sharing::SharingMessage::kPingMessage:
+      return chrome_browser_sharing::PING_MESSAGE;
+    case chrome_browser_sharing::SharingMessage::kAckMessage:
+      return chrome_browser_sharing::ACK_MESSAGE;
+    case chrome_browser_sharing::SharingMessage::kClickToCallMessage:
+      return chrome_browser_sharing::CLICK_TO_CALL_MESSAGE;
+    case chrome_browser_sharing::SharingMessage::kSharedClipboardMessage:
+      return chrome_browser_sharing::SHARED_CLIPBOARD_MESSAGE;
+  }
+  // For proto3 enums unrecognized enum values are kept when parsing, and a new
+  // payload case received over the network would not default to
+  // PAYLOAD_NOT_SET. Explicitly return UNKNOWN_MESSAGE here to handle this
+  // case.
+  return chrome_browser_sharing::UNKNOWN_MESSAGE;
+}
+
+void LogSharingMessageReceived(
+    chrome_browser_sharing::MessageType original_message_type,
+    chrome_browser_sharing::SharingMessage::PayloadCase payload_case) {
+  chrome_browser_sharing::MessageType actual_message_type =
+      SharingPayloadCaseToMessageType(payload_case);
+  base::UmaHistogramExactLinear("Sharing.MessageReceivedType",
+                                actual_message_type,
+                                chrome_browser_sharing::MessageType_ARRAYSIZE);
+  base::UmaHistogramExactLinear(
+      base::StrCat({"Sharing.MessageReceivedType.",
+                    MessageTypeToMessageSuffix(original_message_type)}),
+      actual_message_type, chrome_browser_sharing::MessageType_ARRAYSIZE);
 }
 
 void LogSharingRegistrationResult(SharingDeviceRegistrationResult result) {
@@ -150,8 +164,13 @@
       /*value_max=*/20);
 }
 
-void LogSharingMessageAckTime(base::TimeDelta time) {
+void LogSharingMessageAckTime(chrome_browser_sharing::MessageType message_type,
+                              base::TimeDelta time) {
   base::UmaHistogramMediumTimes("Sharing.MessageAckTime", time);
+  base::UmaHistogramMediumTimes(
+      base::StrCat({"Sharing.MessageAckTime.",
+                    MessageTypeToMessageSuffix(message_type)}),
+      time);
 }
 
 void LogSharingDialogShown(SharingFeatureName feature, SharingDialogType type) {
@@ -164,12 +183,24 @@
   base::UmaHistogramEnumeration("Sharing.ClickToCallHelpTextClicked", type);
 }
 
-void LogSendSharingMessageResult(SharingSendMessageResult result) {
+void LogSendSharingMessageResult(
+    chrome_browser_sharing::MessageType message_type,
+    SharingSendMessageResult result) {
   base::UmaHistogramEnumeration("Sharing.SendMessageResult", result);
+  base::UmaHistogramEnumeration(
+      base::StrCat({"Sharing.SendMessageResult.",
+                    MessageTypeToMessageSuffix(message_type)}),
+      result);
 }
 
-void LogSendSharingAckMessageResult(SharingSendMessageResult result) {
+void LogSendSharingAckMessageResult(
+    chrome_browser_sharing::MessageType message_type,
+    SharingSendMessageResult result) {
   base::UmaHistogramEnumeration("Sharing.SendAckMessageResult", result);
+  base::UmaHistogramEnumeration(
+      base::StrCat({"Sharing.SendAckMessageResult.",
+                    MessageTypeToMessageSuffix(message_type)}),
+      result);
 }
 
 void LogClickToCallUKM(content::WebContents* web_contents,
diff --git a/chrome/browser/sharing/sharing_metrics.h b/chrome/browser/sharing/sharing_metrics.h
index f3fcb81c..efc6736f 100644
--- a/chrome/browser/sharing/sharing_metrics.h
+++ b/chrome/browser/sharing/sharing_metrics.h
@@ -5,9 +5,8 @@
 #ifndef CHROME_BROWSER_SHARING_SHARING_METRICS_H_
 #define CHROME_BROWSER_SHARING_SHARING_METRICS_H_
 
-#include "chrome/browser/sharing/proto/sharing_message.pb.h"
-
 #include "base/time/time.h"
+#include "chrome/browser/sharing/proto/sharing_message.pb.h"
 #include "chrome/browser/sharing/sharing_constants.h"
 #include "chrome/browser/sharing/sharing_send_message_result.h"
 
@@ -72,9 +71,15 @@
 const char kSharingClickToCallUiContextMenu[] = "ContextMenu";
 const char kSharingClickToCallUiDialog[] = "Dialog";
 
+chrome_browser_sharing::MessageType SharingPayloadCaseToMessageType(
+    chrome_browser_sharing::SharingMessage::PayloadCase payload_case);
+
 // Logs the |payload_case| to UMA. This should be called when a SharingMessage
-// is received.
+// is received. Additionally, a suffixed version of the histogram is logged
+// using |original_message_type| which is different from the actual message type
+// for ack messages.
 void LogSharingMessageReceived(
+    chrome_browser_sharing::MessageType original_message_type,
     chrome_browser_sharing::SharingMessage::PayloadCase payload_case);
 
 // Logs the |result| to UMA. This should be called after attempting register
@@ -126,7 +131,8 @@
 
 // Logs to UMA the time from sending a FCM message from the Sharing service
 // until an ack message is received for it.
-void LogSharingMessageAckTime(base::TimeDelta time);
+void LogSharingMessageAckTime(chrome_browser_sharing::MessageType message_type,
+                              base::TimeDelta time);
 
 // Logs to UMA the |type| of dialog shown for sharing feature.
 void LogSharingDialogShown(SharingFeatureName feature, SharingDialogType type);
@@ -137,10 +143,14 @@
 
 // Logs to UMA result of sending a SharingMessage. This should not be called for
 // sending ack messages.
-void LogSendSharingMessageResult(SharingSendMessageResult result);
+void LogSendSharingMessageResult(
+    chrome_browser_sharing::MessageType message_type,
+    SharingSendMessageResult result);
 
 // Logs to UMA result of sendin an ack of a SharingMessage.
-void LogSendSharingAckMessageResult(SharingSendMessageResult result);
+void LogSendSharingAckMessageResult(
+    chrome_browser_sharing::MessageType message_type,
+    SharingSendMessageResult result);
 
 // Records a Click to Call selection to UKM. This is logged after a completed
 // action like selecting an app or a device to send the phone number to.
diff --git a/chrome/browser/sharing/sharing_service.cc b/chrome/browser/sharing/sharing_service.cc
index 51230dd0..85c94be0 100644
--- a/chrome/browser/sharing/sharing_service.cc
+++ b/chrome/browser/sharing/sharing_service.cc
@@ -268,18 +268,20 @@
     SendMessageCallback callback) {
   std::string message_guid = base::GenerateGUID();
   send_message_callbacks_.emplace(message_guid, std::move(callback));
+  chrome_browser_sharing::MessageType message_type =
+      SharingPayloadCaseToMessageType(message.payload_case());
 
   base::PostDelayedTask(
       FROM_HERE, {base::TaskPriority::USER_VISIBLE, content::BrowserThread::UI},
       base::BindOnce(&SharingService::InvokeSendMessageCallback,
-                     weak_ptr_factory_.GetWeakPtr(), message_guid,
+                     weak_ptr_factory_.GetWeakPtr(), message_guid, message_type,
                      SharingSendMessageResult::kAckTimeout),
       kSendMessageTimeout);
 
   base::Optional<syncer::DeviceInfo::SharingInfo> sharing_info =
       sync_prefs_->GetSharingInfo(device_guid);
   if (!sharing_info) {
-    InvokeSendMessageCallback(message_guid,
+    InvokeSendMessageCallback(message_guid, message_type,
                               SharingSendMessageResult::kDeviceNotFound);
     return;
   }
@@ -288,7 +290,7 @@
       std::move(*sharing_info), time_to_live, std::move(message),
       base::BindOnce(&SharingService::OnMessageSent,
                      weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(),
-                     message_guid));
+                     message_guid, message_type));
 }
 
 void SharingService::SetDeviceInfoTrackerForTesting(
@@ -296,12 +298,14 @@
   device_info_tracker_ = tracker;
 }
 
-void SharingService::OnMessageSent(base::TimeTicks start_time,
-                                   const std::string& message_guid,
-                                   SharingSendMessageResult result,
-                                   base::Optional<std::string> message_id) {
+void SharingService::OnMessageSent(
+    base::TimeTicks start_time,
+    const std::string& message_guid,
+    chrome_browser_sharing::MessageType message_type,
+    SharingSendMessageResult result,
+    base::Optional<std::string> message_id) {
   if (result != SharingSendMessageResult::kSuccessful) {
-    InvokeSendMessageCallback(message_guid, result);
+    InvokeSendMessageCallback(message_guid, message_type, result);
     return;
   }
 
@@ -309,10 +313,13 @@
   message_guids_.emplace(*message_id, message_guid);
 }
 
-void SharingService::OnAckReceived(const std::string& message_id) {
+void SharingService::OnAckReceived(
+    chrome_browser_sharing::MessageType message_type,
+    const std::string& message_id) {
   auto times_iter = send_message_times_.find(message_id);
   if (times_iter != send_message_times_.end()) {
-    LogSharingMessageAckTime(base::TimeTicks::Now() - times_iter->second);
+    LogSharingMessageAckTime(message_type,
+                             base::TimeTicks::Now() - times_iter->second);
     send_message_times_.erase(times_iter);
   }
 
@@ -322,12 +329,13 @@
 
   std::string message_guid = std::move(iter->second);
   message_guids_.erase(iter);
-  InvokeSendMessageCallback(message_guid,
+  InvokeSendMessageCallback(message_guid, message_type,
                             SharingSendMessageResult::kSuccessful);
 }
 
 void SharingService::InvokeSendMessageCallback(
     const std::string& message_guid,
+    chrome_browser_sharing::MessageType message_type,
     SharingSendMessageResult result) {
   auto iter = send_message_callbacks_.find(message_guid);
   if (iter == send_message_callbacks_.end())
@@ -336,7 +344,7 @@
   SendMessageCallback callback = std::move(iter->second);
   send_message_callbacks_.erase(iter);
   std::move(callback).Run(result);
-  LogSendSharingMessageResult(result);
+  LogSendSharingMessageResult(message_type, result);
 }
 
 void SharingService::OnDeviceInfoChange() {
diff --git a/chrome/browser/sharing/sharing_service.h b/chrome/browser/sharing/sharing_service.h
index eb885618..5bb5b0e 100644
--- a/chrome/browser/sharing/sharing_service.h
+++ b/chrome/browser/sharing/sharing_service.h
@@ -134,7 +134,8 @@
   void OnSyncCycleCompleted(syncer::SyncService* sync) override;
 
   // AckMessageHandler::AckMessageObserver override.
-  void OnAckReceived(const std::string& message_id) override;
+  void OnAckReceived(chrome_browser_sharing::MessageType message_type,
+                     const std::string& message_id) override;
 
   // syncer::DeviceInfoTracker::Observer.
   void OnDeviceInfoChange() override;
@@ -149,10 +150,13 @@
 
   void OnMessageSent(base::TimeTicks start_time,
                      const std::string& message_guid,
+                     chrome_browser_sharing::MessageType message_type,
                      SharingSendMessageResult result,
                      base::Optional<std::string> message_id);
-  void InvokeSendMessageCallback(const std::string& message_guid,
-                                 SharingSendMessageResult result);
+  void InvokeSendMessageCallback(
+      const std::string& message_guid,
+      chrome_browser_sharing::MessageType message_type,
+      SharingSendMessageResult result);
 
   // Returns true if required sync feature is enabled.
   bool IsSyncEnabled() const;
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index ff4d6cad..ecf5470 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -133692,6 +133692,8 @@
 </histogram>
 
 <histogram name="Sharing.MessageAckTime" units="ms" expires_after="2020-02-02">
+<!-- Name completed by histogram_suffixes name="SharingMessage" -->
+
   <owner>[email protected]</owner>
   <owner>[email protected]</owner>
   <summary>
@@ -133702,6 +133704,8 @@
 
 <histogram name="Sharing.MessageReceivedType" enum="SharingMessageType"
     expires_after="2020-02-02">
+<!-- Name completed by histogram_suffixes name="SharingMessage" -->
+
   <owner>[email protected]</owner>
   <owner>[email protected]</owner>
   <summary>
@@ -133713,6 +133717,8 @@
 
 <histogram name="Sharing.SendAckMessageResult" enum="SharingSendMessageResult"
     expires_after="M80">
+<!-- Name completed by histogram_suffixes name="SharingMessage" -->
+
   <owner>[email protected]</owner>
   <owner>[email protected]</owner>
   <summary>
@@ -133736,6 +133742,8 @@
 
 <histogram name="Sharing.SendMessageResult" enum="SharingSendMessageResult"
     expires_after="M80">
+<!-- Name completed by histogram_suffixes name="SharingMessage" -->
+
   <owner>[email protected]</owner>
   <owner>[email protected]</owner>
   <summary>
@@ -178566,6 +178574,18 @@
   <affected-histogram name="Sharing.ClickToCallSelectedDeviceIndex"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="SharingMessage" separator=".">
+  <suffix name="ACK_MESSAGE" label="Ack Message"/>
+  <suffix name="CLICK_TO_CALL_MESSAGE" label="Click To Call Message"/>
+  <suffix name="PING_MESSAGE" label="Ping Message"/>
+  <suffix name="SHARED_CLIPBOARD_MESSAGE" label="Shared Clipboard Message"/>
+  <suffix name="UNKNOWN_MESSAGE" label="Unknown Message"/>
+  <affected-histogram name="Sharing.MessageAckTime"/>
+  <affected-histogram name="Sharing.MessageReceivedType"/>
+  <affected-histogram name="Sharing.SendAckMessageResult"/>
+  <affected-histogram name="Sharing.SendMessageResult"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="ShillCumulativeTimeOnline" separator=".">
   <suffix name="Any" label="Any connection type"/>
   <suffix name="Cellular" label="Cellular connection"/>