Commit fe1c95b7 authored by Olivier Robin's avatar Olivier Robin Committed by Commit Bot

Enable MetricKit

After discussion with chrome-privacy, this can be enabled for
users who have opted-in UMA.

Bug: 1017434
Change-Id: I140dac0327206846127be4befa3e6c9fca8780fd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2292510
Commit-Queue: Olivier Robin <olivierrobin@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Cr-Commit-Position: refs/heads/master@{#791894}
parent 5fbcf2ee
...@@ -5,11 +5,6 @@ ...@@ -5,11 +5,6 @@
import("//build/buildflag_header.gni") import("//build/buildflag_header.gni")
import("//ios/chrome/features.gni") import("//ios/chrome/features.gni")
buildflag_header("ios_enable_metrickit_buildflags") {
header = "ios_enable_metrickit_buildflags.h"
flags = [ "IOS_ENABLE_METRICKIT=$ios_enable_metrickit" ]
}
source_set("application_delegate") { source_set("application_delegate") {
sources = [ sources = [
"memory_warning_helper.h", "memory_warning_helper.h",
...@@ -131,12 +126,9 @@ source_set("metric_kit_subscriber") { ...@@ -131,12 +126,9 @@ source_set("metric_kit_subscriber") {
sources = [ sources = [
"metric_kit_subscriber.h", "metric_kit_subscriber.h",
"metric_kit_subscriber.mm", "metric_kit_subscriber.mm",
"metric_kit_subscribing_util.h",
"metric_kit_subscribing_util.mm",
] ]
frameworks = [ "MetricKit.framework" ] frameworks = [ "MetricKit.framework" ]
deps = [ deps = [
":ios_enable_metrickit_buildflags",
"//base", "//base",
"//components/version_info", "//components/version_info",
] ]
...@@ -159,7 +151,7 @@ source_set("application_delegate_internal") { ...@@ -159,7 +151,7 @@ source_set("application_delegate_internal") {
] ]
deps = [ deps = [
":application_delegate", ":application_delegate",
":ios_enable_metrickit_buildflags", ":metric_kit_subscriber",
":tab_opening", ":tab_opening",
":url_opener_params", ":url_opener_params",
"//base", "//base",
...@@ -214,9 +206,6 @@ source_set("application_delegate_internal") { ...@@ -214,9 +206,6 @@ source_set("application_delegate_internal") {
] ]
public_deps = [ "//ios/chrome/browser/ui/scoped_ui_blocker" ] public_deps = [ "//ios/chrome/browser/ui/scoped_ui_blocker" ]
if (ios_enable_metrickit) {
deps += [ ":metric_kit_subscriber" ]
}
frameworks = [ frameworks = [
"CoreSpotlight.framework", "CoreSpotlight.framework",
"UIKit.framework", "UIKit.framework",
......
...@@ -12,8 +12,12 @@ extern NSString* const kChromeMetricKitPayloadsDirectory; ...@@ -12,8 +12,12 @@ extern NSString* const kChromeMetricKitPayloadsDirectory;
// A subscriber that save MetricKit reports to the application document // A subscriber that save MetricKit reports to the application document
// directory. // directory.
API_AVAILABLE(ios(13.0))
@interface MetricKitSubscriber : NSObject <MXMetricManagerSubscriber> @interface MetricKitSubscriber : NSObject <MXMetricManagerSubscriber>
+ (instancetype)sharedInstance; + (instancetype)sharedInstance;
// Whether the MetricKit collection is enabled.
@property(nonatomic, assign, getter=isEnabled) BOOL enabled;
@end @end
#endif // IOS_CHROME_APP_APPLICATION_DELEGATE_METRIC_KIT_SUBSCRIBER_H_ #endif // IOS_CHROME_APP_APPLICATION_DELEGATE_METRIC_KIT_SUBSCRIBER_H_
...@@ -44,6 +44,8 @@ enum MetricKitExitReason { ...@@ -44,6 +44,8 @@ enum MetricKitExitReason {
namespace { namespace {
NSString* const kEnableMetricKit = @"EnableMetricKit";
#if defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0 #if defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0
void ReportExitReason(base::HistogramBase* histogram, void ReportExitReason(base::HistogramBase* histogram,
MetricKitExitReason bucket, MetricKitExitReason bucket,
...@@ -147,14 +149,29 @@ void WriteDiagnosticPayloads(NSArray<MXDiagnosticPayload*>* payloads) ...@@ -147,14 +149,29 @@ void WriteDiagnosticPayloads(NSArray<MXDiagnosticPayload*>* payloads)
return instance; return instance;
} }
- (void)setEnabled:(BOOL)enable {
if (enable == _enabled) {
return;
}
_enabled = enable;
if (enable) {
[[MXMetricManager sharedManager] addSubscriber:self];
} else {
[[MXMetricManager sharedManager] removeSubscriber:self];
}
}
- (void)didReceiveMetricPayloads:(NSArray<MXMetricPayload*>*)payloads - (void)didReceiveMetricPayloads:(NSArray<MXMetricPayload*>*)payloads
API_AVAILABLE(ios(13.0)) { API_AVAILABLE(ios(13.0)) {
base::ThreadPool::PostTask( NSUserDefaults* standard_defaults = [NSUserDefaults standardUserDefaults];
FROM_HERE, if ([standard_defaults boolForKey:kEnableMetricKit]) {
{base::TaskPriority::BEST_EFFORT, base::ThreadPool::PostTask(
base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN, FROM_HERE,
base::ThreadPolicy::PREFER_BACKGROUND, base::MayBlock()}, {base::TaskPriority::BEST_EFFORT,
base::BindOnce(WriteMetricPayloads, payloads)); base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN,
base::ThreadPolicy::PREFER_BACKGROUND, base::MayBlock()},
base::BindOnce(WriteMetricPayloads, payloads));
}
for (MXMetricPayload* payload : payloads) { for (MXMetricPayload* payload : payloads) {
[self processPayload:payload]; [self processPayload:payload];
} }
...@@ -295,12 +312,15 @@ void WriteDiagnosticPayloads(NSArray<MXDiagnosticPayload*>* payloads) ...@@ -295,12 +312,15 @@ void WriteDiagnosticPayloads(NSArray<MXDiagnosticPayload*>* payloads)
#if defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0 #if defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0
- (void)didReceiveDiagnosticPayloads:(NSArray<MXDiagnosticPayload*>*)payloads - (void)didReceiveDiagnosticPayloads:(NSArray<MXDiagnosticPayload*>*)payloads
API_AVAILABLE(ios(14.0)) { API_AVAILABLE(ios(14.0)) {
base::ThreadPool::PostTask( NSUserDefaults* standard_defaults = [NSUserDefaults standardUserDefaults];
FROM_HERE, if ([standard_defaults boolForKey:kEnableMetricKit]) {
{base::TaskPriority::BEST_EFFORT, base::ThreadPool::PostTask(
base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN, FROM_HERE,
base::ThreadPolicy::PREFER_BACKGROUND, base::MayBlock()}, {base::TaskPriority::BEST_EFFORT,
base::BindOnce(WriteDiagnosticPayloads, payloads)); base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN,
base::ThreadPolicy::PREFER_BACKGROUND, base::MayBlock()},
base::BindOnce(WriteDiagnosticPayloads, payloads));
}
} }
#endif #endif
......
...@@ -34,16 +34,22 @@ base::FilePath MetricKitReportDirectory() { ...@@ -34,16 +34,22 @@ base::FilePath MetricKitReportDirectory() {
return base::FilePath(base::SysNSStringToUTF8(metric_kit_report_directory)); return base::FilePath(base::SysNSStringToUTF8(metric_kit_report_directory));
} }
NSString* const kEnableMetricKit = @"EnableMetricKit";
} }
class MetricKitSubscriberTest : public PlatformTest { class MetricKitSubscriberTest : public PlatformTest {
public: public:
MetricKitSubscriberTest() { MetricKitSubscriberTest() {
base::DeletePathRecursively(MetricKitReportDirectory()); base::DeletePathRecursively(MetricKitReportDirectory());
NSUserDefaults* standard_defaults = [NSUserDefaults standardUserDefaults];
[standard_defaults setBool:YES forKey:kEnableMetricKit];
} }
~MetricKitSubscriberTest() override { ~MetricKitSubscriberTest() override {
base::DeletePathRecursively(MetricKitReportDirectory()); base::DeletePathRecursively(MetricKitReportDirectory());
NSUserDefaults* standard_defaults = [NSUserDefaults standardUserDefaults];
[standard_defaults removeObjectForKey:kEnableMetricKit];
} }
private: private:
......
// Copyright 2020 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 IOS_CHROME_APP_APPLICATION_DELEGATE_METRIC_KIT_SUBSCRIBING_UTIL_H_
#define IOS_CHROME_APP_APPLICATION_DELEGATE_METRIC_KIT_SUBSCRIBING_UTIL_H_
// Enables MetricKit payloads collection and saving.
// Payloads will be saved in JSON files in application Documents directory.
//
// Checks if the collection is enabled in experimental settings.
// Changing the value of the setting will require restarting Chrome.
void EnableMetricKitReportCollection();
#endif // IOS_CHROME_APP_APPLICATION_DELEGATE_METRIC_KIT_SUBSCRIBING_UTIL_H_
// Copyright 2020 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.
#import "ios/chrome/app/application_delegate/metric_kit_subscribing_util.h"
#import <Foundation/Foundation.h>
#import <MetricKit/MetricKit.h>
#import "ios/chrome/app/application_delegate/metric_kit_subscriber.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
// The Experimental setting that enables the collection of MetricKit reports.
NSString* const kEnableMetricKit = @"EnableMetricKit";
} // namespace
void EnableMetricKitReportCollection() {
static dispatch_once_t once_token;
dispatch_once(&once_token, ^{
if (@available(iOS 13, *)) {
NSUserDefaults* standard_defaults = [NSUserDefaults standardUserDefaults];
if ([standard_defaults boolForKey:kEnableMetricKit]) {
[[MXMetricManager sharedManager]
addSubscriber:[MetricKitSubscriber sharedInstance]];
}
}
});
}
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include "components/metrics/metrics_service.h" #include "components/metrics/metrics_service.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "components/ukm/ios/features.h" #include "components/ukm/ios/features.h"
#import "ios/chrome/app/application_delegate/ios_enable_metrickit_buildflags.h" #import "ios/chrome/app/application_delegate/metric_kit_subscriber.h"
#import "ios/chrome/app/application_delegate/startup_information.h" #import "ios/chrome/app/application_delegate/startup_information.h"
#include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/chrome_url_constants.h" #include "ios/chrome/browser/chrome_url_constants.h"
...@@ -41,10 +41,6 @@ ...@@ -41,10 +41,6 @@
#import "ios/web/public/web_state.h" #import "ios/web/public/web_state.h"
#include "url/gurl.h" #include "url/gurl.h"
#if BUILDFLAG(IOS_ENABLE_METRICKIT)
#import "ios/chrome/app/application_delegate/metric_kit_subscribing_util.h" // nogncheck
#endif // BUILDFLAG(IOS_ENABLE_METRICKIT)
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
...@@ -229,9 +225,9 @@ using metrics_mediator::kAppEnteredBackgroundDateKey; ...@@ -229,9 +225,9 @@ using metrics_mediator::kAppEnteredBackgroundDateKey;
[self setBreakpadEnabled:optIn withUploading:allowUploading]; [self setBreakpadEnabled:optIn withUploading:allowUploading];
[self setWatchWWANEnabled:optIn]; [self setWatchWWANEnabled:optIn];
[self setAppGroupMetricsEnabled:optIn]; [self setAppGroupMetricsEnabled:optIn];
#if BUILDFLAG(IOS_ENABLE_METRICKIT) if (@available(iOS 13, *)) {
EnableMetricKitReportCollection(); [[MetricKitSubscriber sharedInstance] setEnabled:optIn];
#endif }
} }
- (BOOL)areMetricsEnabled { - (BOOL)areMetricsEnabled {
......
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