Commit a179f275 authored by Luigi Semenzato's avatar Luigi Semenzato Committed by Commit Bot

Add metrics event reporting for Chrome OS

This adds a mechanism to report statistically-interesting
events to Chrome OS listeners.  A Chrome OS daemon (such
as the memory daemon "memd") can register as a client
of the Metrics Event Service, and receive signals on the
occurrence of related events (for instance, a tab discard).

This CL adds the supporting machinery and its first use,
signaling of a tab discard.

CQ-DEPEND=CL:1199965
BUG=chromium:729335
TEST=ran on DUT, verified that D-Bus signal is sent as expected

Change-Id: I6eddf4b0d18aa4c8a3fd4aab7f0770d87ddc7aeb
Reviewed-on: https://chromium-review.googlesource.com/1062078
Commit-Queue: Luigi Semenzato <semenzato@chromium.org>
Reviewed-by: default avatarSteven Bennetts <stevenjb@chromium.org>
Reviewed-by: default avatarDan Erat <derat@chromium.org>
Cr-Commit-Position: refs/heads/master@{#589639}
parent 1f44fb08
......@@ -599,7 +599,7 @@ deps = {
# For Linux and Chromium OS.
'src/third_party/cros_system_api': {
'url': Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + 'f64e5e47cf0b18553c5dee4626356c53751e90ec',
'url': Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + '41fa3011067832b0b4341de834cd7cd341099738',
'condition': 'checkout_linux',
},
......
......@@ -82,6 +82,7 @@ source_set("chromeos") {
"//chromeos:cryptohome_proto",
"//chromeos:cryptohome_signkey_proto",
"//chromeos:login_manager_proto",
"//chromeos:metrics_event_proto",
"//chromeos/assistant:buildflags",
"//chromeos/components/drivefs",
"//chromeos/components/drivefs/mojom",
......@@ -610,6 +611,8 @@ source_set("chromeos") {
"dbus/drive_file_stream_service_provider.h",
"dbus/kiosk_info_service_provider.cc",
"dbus/kiosk_info_service_provider.h",
"dbus/metrics_event_service_provider.cc",
"dbus/metrics_event_service_provider.h",
"dbus/proxy_resolution_service_provider.cc",
"dbus/proxy_resolution_service_provider.h",
"dbus/screen_lock_service_provider.cc",
......@@ -1911,6 +1914,7 @@ copy("dbus_service_files") {
"dbus/org.chromium.ComponentUpdaterService.conf",
"dbus/org.chromium.DriveFileStreamService.conf",
"dbus/org.chromium.KioskAppService.conf",
"dbus/org.chromium.MetricsEventService.conf",
"dbus/org.chromium.NetworkProxyService.conf",
"dbus/org.chromium.ScreenLockService.conf",
"dbus/org.chromium.VirtualFileRequestService.conf",
......
......@@ -49,6 +49,7 @@
#include "chrome/browser/chromeos/dbus/component_updater_service_provider.h"
#include "chrome/browser/chromeos/dbus/drive_file_stream_service_provider.h"
#include "chrome/browser/chromeos/dbus/kiosk_info_service_provider.h"
#include "chrome/browser/chromeos/dbus/metrics_event_service_provider.h"
#include "chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h"
#include "chrome/browser/chromeos/dbus/screen_lock_service_provider.h"
#include "chrome/browser/chromeos/dbus/virtual_file_request_service_provider.h"
......@@ -334,6 +335,11 @@ class DBusServices {
CrosDBusService::CreateServiceProviderList(
std::make_unique<KioskInfoService>()));
metrics_event_service_ = CrosDBusService::Create(
kMetricsEventServiceName, dbus::ObjectPath(kMetricsEventServicePath),
CrosDBusService::CreateServiceProviderList(
std::make_unique<MetricsEventServiceProvider>()));
screen_lock_service_ = CrosDBusService::Create(
kScreenLockServiceName, dbus::ObjectPath(kScreenLockServicePath),
CrosDBusService::CreateServiceProviderList(
......@@ -407,6 +413,7 @@ class DBusServices {
TPMTokenLoader::Shutdown();
proxy_resolution_service_.reset();
kiosk_info_service_.reset();
metrics_event_service_.reset();
virtual_file_request_service_.reset();
component_updater_service_.reset();
chrome_features_service_.reset();
......@@ -423,6 +430,7 @@ class DBusServices {
private:
std::unique_ptr<CrosDBusService> proxy_resolution_service_;
std::unique_ptr<CrosDBusService> kiosk_info_service_;
std::unique_ptr<CrosDBusService> metrics_event_service_;
std::unique_ptr<CrosDBusService> screen_lock_service_;
std::unique_ptr<CrosDBusService> virtual_file_request_service_;
std::unique_ptr<CrosDBusService> component_updater_service_;
......
// Copyright 2018 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 "chrome/browser/chromeos/dbus/metrics_event_service_provider.h"
#include <time.h>
#include "chrome/browser/browser_process.h"
#include "chrome/browser/resource_coordinator/tab_manager.h"
#include "dbus/message.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace chromeos {
MetricsEventServiceProvider::MetricsEventServiceProvider() {}
MetricsEventServiceProvider::~MetricsEventServiceProvider() {
DCHECK(g_browser_process);
if (exported_object_)
g_browser_process->GetTabManager()->RemoveObserver(this);
}
void MetricsEventServiceProvider::Start(
scoped_refptr<dbus::ExportedObject> exported_object) {
exported_object_ = exported_object;
DCHECK(g_browser_process);
g_browser_process->GetTabManager()->AddObserver(this);
}
void MetricsEventServiceProvider::OnDiscardedStateChange(
content::WebContents* contents,
bool is_discarded) {
if (is_discarded) {
EmitSignal(metrics_event::Event_Type_TAB_DISCARD);
}
}
void MetricsEventServiceProvider::EmitSignal(metrics_event::Event_Type type) {
DCHECK(exported_object_);
dbus::Signal signal(chromeos::kMetricsEventServiceInterface,
chromeos::kMetricsEventServiceChromeEventSignal);
metrics_event::Event payload;
// Here we have a Chrome/Chrome OS specific agreement to use clock_gettime
// with CLOCK_MONOTONIC.
struct timespec timespec;
// clock_gettime() can only fail on bad pointer, or bad clock specifier, so
// the following call "cannot" fail.
int ret = clock_gettime(CLOCK_MONOTONIC, &timespec);
if (ret != 0) {
PLOG(DFATAL) << "clock_gettime";
return;
}
int64_t now_ms = timespec.tv_sec * 1000 + timespec.tv_nsec / (1000 * 1000);
dbus::MessageWriter writer(&signal);
payload.set_type(type);
payload.set_timestamp(now_ms);
dbus::MessageWriter(&signal).AppendProtoAsArrayOfBytes(payload);
exported_object_->SendSignal(&signal);
}
} // namespace chromeos
// Copyright 2018 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 CHROME_BROWSER_CHROMEOS_DBUS_METRICS_EVENT_SERVICE_PROVIDER_H_
#define CHROME_BROWSER_CHROMEOS_DBUS_METRICS_EVENT_SERVICE_PROVIDER_H_
#include <string>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/resource_coordinator/tab_lifecycle_observer.h"
#include "chromeos/dbus/metrics_event/metrics_event.pb.h"
#include "chromeos/dbus/services/cros_dbus_service.h"
#include "dbus/exported_object.h"
namespace chromeos {
// This class does not export any methods. An instance of this class can send
// signals to clients for a number of events of statistical interest, e.g. tab
// discards.
class MetricsEventServiceProvider
: public CrosDBusService::ServiceProviderInterface,
public resource_coordinator::TabLifecycleObserver {
public:
MetricsEventServiceProvider();
~MetricsEventServiceProvider() override;
// CrosDBusService::ServiceProviderInterface overrides:
void Start(scoped_refptr<dbus::ExportedObject> exported_object) override;
private:
// resource_coordinator::TabLifecycleObserver:
void OnDiscardedStateChange(content::WebContents* contents,
bool is_discarded) override;
void OnAutoDiscardableStateChange(content::WebContents* contents,
bool is_auto_discardable) override {}
// Emits the D-Bus signal for this event.
void EmitSignal(metrics_event::Event_Type type);
// A reference on ExportedObject for sending signals.
scoped_refptr<dbus::ExportedObject> exported_object_;
DISALLOW_COPY_AND_ASSIGN(MetricsEventServiceProvider);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_DBUS_METRICS_EVENT_SERVICE_PROVIDER_H_
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<!--
Copyright (c) 2018 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.
This file will be installed at /opt/google/chrome/dbus on Chromium OS.
-->
<busconfig>
<policy user="chronos">
<allow own="org.chromium.MetricsEventService"/>
</policy>
</busconfig>
......@@ -30,6 +30,7 @@ component("chromeos") {
":cryptohome_proto",
":login_manager_proto",
":media_perception_proto",
":metrics_event_proto",
":power_manager_proto",
":seneschal_proto",
":smbprovider_proto",
......@@ -880,6 +881,14 @@ proto_library("power_manager_proto") {
proto_out_dir = "chromeos/dbus/power_manager"
}
proto_library("metrics_event_proto") {
sources = [
"//third_party/cros_system_api/dbus/metrics_event/metrics_event.proto",
]
proto_out_dir = "chromeos/dbus/metrics_event"
}
proto_library("attestation_proto") {
sources = [
"dbus/proto/attestation.proto",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment