summaryrefslogtreecommitdiffstats
path: root/chromium/components/policy/core/common/policy_statistics_collector.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/policy/core/common/policy_statistics_collector.cc')
-rw-r--r--chromium/components/policy/core/common/policy_statistics_collector.cc128
1 files changed, 128 insertions, 0 deletions
diff --git a/chromium/components/policy/core/common/policy_statistics_collector.cc b/chromium/components/policy/core/common/policy_statistics_collector.cc
new file mode 100644
index 00000000000..c322e0ddce0
--- /dev/null
+++ b/chromium/components/policy/core/common/policy_statistics_collector.cc
@@ -0,0 +1,128 @@
+// Copyright (c) 2012 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 "components/policy/core/common/policy_statistics_collector.h"
+
+#include <algorithm>
+#include <string>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/location.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
+#include "base/task/task_runner.h"
+#include "components/policy/core/common/policy_pref_names.h"
+#include "components/policy/core/common/policy_service.h"
+#include "components/policy/core/common/policy_types.h"
+#include "components/policy/policy_constants.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/pref_service.h"
+
+namespace policy {
+
+const int PolicyStatisticsCollector::kStatisticsUpdateRate =
+ 24 * 60 * 60 * 1000; // 24 hours.
+
+PolicyStatisticsCollector::PolicyStatisticsCollector(
+ const GetChromePolicyDetailsCallback& get_details,
+ const Schema& chrome_schema,
+ PolicyService* policy_service,
+ PrefService* prefs,
+ const scoped_refptr<base::TaskRunner>& task_runner)
+ : get_details_(get_details),
+ chrome_schema_(chrome_schema),
+ policy_service_(policy_service),
+ prefs_(prefs),
+ task_runner_(task_runner) {
+}
+
+PolicyStatisticsCollector::~PolicyStatisticsCollector() {
+}
+
+void PolicyStatisticsCollector::Initialize() {
+ using base::Time;
+
+ base::TimeDelta update_rate = base::Milliseconds(kStatisticsUpdateRate);
+ Time last_update = prefs_->GetTime(policy_prefs::kLastPolicyStatisticsUpdate);
+ base::TimeDelta delay = std::max(Time::Now() - last_update, base::Days(0));
+ if (delay >= update_rate)
+ CollectStatistics();
+ else
+ ScheduleUpdate(update_rate - delay);
+}
+
+// static
+void PolicyStatisticsCollector::RegisterPrefs(PrefRegistrySimple* registry) {
+ registry->RegisterInt64Pref(policy_prefs::kLastPolicyStatisticsUpdate, 0);
+}
+
+void PolicyStatisticsCollector::RecordPolicyUse(int id, Condition condition) {
+ std::string suffix;
+ switch (condition) {
+ case kDefault:
+ break;
+ case kMandatory:
+ suffix = ".Mandatory";
+ break;
+ case kRecommended:
+ suffix = ".Recommended";
+ break;
+ case kIgnoredByAtomicGroup:
+ suffix = ".IgnoredByPolicyGroup";
+ break;
+ }
+ base::UmaHistogramSparse("Enterprise.Policies" + suffix, id);
+}
+
+void PolicyStatisticsCollector::CollectStatistics() {
+ const PolicyMap& policies = policy_service_->GetPolicies(
+ PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()));
+
+ // Collect statistics.
+ for (Schema::Iterator it(chrome_schema_.GetPropertiesIterator());
+ !it.IsAtEnd(); it.Advance()) {
+ if (policies.Get(it.key())) {
+ const PolicyDetails* details = get_details_.Run(it.key());
+ if (details) {
+ RecordPolicyUse(details->id, kDefault);
+ if (policies.Get(it.key())->level == POLICY_LEVEL_MANDATORY) {
+ RecordPolicyUse(details->id, kMandatory);
+ } else {
+ RecordPolicyUse(details->id, kRecommended);
+ }
+ } else {
+ NOTREACHED();
+ }
+ }
+ }
+
+ for (size_t i = 0; i < kPolicyAtomicGroupMappingsLength; ++i) {
+ const AtomicGroup& group = kPolicyAtomicGroupMappings[i];
+ // Find the policy with the highest priority that is both in |policies|
+ // and |group.policies|, an array ending with a nullptr.
+ for (const char* const* policy_name = group.policies; *policy_name;
+ ++policy_name) {
+ if (policies.IsPolicyIgnoredByAtomicGroup(*policy_name)) {
+ const PolicyDetails* details = get_details_.Run(*policy_name);
+ if (details)
+ RecordPolicyUse(details->id, kIgnoredByAtomicGroup);
+ else
+ NOTREACHED();
+ }
+ }
+ }
+
+ // Take care of next update.
+ prefs_->SetTime(policy_prefs::kLastPolicyStatisticsUpdate, base::Time::Now());
+ ScheduleUpdate(base::Milliseconds(kStatisticsUpdateRate));
+}
+
+void PolicyStatisticsCollector::ScheduleUpdate(base::TimeDelta delay) {
+ update_callback_.Reset(base::BindOnce(
+ &PolicyStatisticsCollector::CollectStatistics, base::Unretained(this)));
+ task_runner_->PostDelayedTask(FROM_HERE, update_callback_.callback(), delay);
+}
+
+} // namespace policy \ No newline at end of file