Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2919)

Unified Diff: chrome/browser/metrics/metrics_log_serializer.cc

Issue 9232071: Upload UMA data using protocol buffers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/metrics/metrics_log_serializer.cc
diff --git a/chrome/browser/metrics/metrics_log_serializer.cc b/chrome/browser/metrics/metrics_log_serializer.cc
index bbddf601eb77710ae0e2ea2fae460a83c747425f..fd1616817a726aa30dbbdfe9e9e3cdea34157483 100644
--- a/chrome/browser/metrics/metrics_log_serializer.cc
+++ b/chrome/browser/metrics/metrics_log_serializer.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/metrics/metrics_log_serializer.h"
+#include <utility>
+
#include "base/base64.h"
#include "base/md5.h"
#include "base/metrics/histogram.h"
@@ -12,10 +14,12 @@
#include "chrome/browser/prefs/scoped_user_pref_update.h"
#include "chrome/common/pref_names.h"
+namespace {
+
// The number of "initial" logs we're willing to save, and hope to send during
// a future Chrome session. Initial logs contain crash stats, and are pretty
// small.
-static const size_t kMaxInitialLogsPersisted = 20;
+const size_t kMaxInitialLogsPersisted = 20;
// The number of ongoing logs we're willing to save persistently, and hope to
// send during a this or future sessions. Note that each log may be pretty
@@ -26,13 +30,12 @@ static const size_t kMaxInitialLogsPersisted = 20;
// A "standard shutdown" will create a small log, including just the data that
// was not yet been transmitted, and that is normal (to have exactly one
// ongoing_log_ at startup).
-static const size_t kMaxOngoingLogsPersisted = 8;
+const size_t kMaxOngoingLogsPersisted = 8;
// We append (2) more elements to persisted lists: the size of the list and a
// checksum of the elements.
-static const size_t kChecksumEntryCount = 2;
+const size_t kChecksumEntryCount = 2;
-namespace {
// TODO(ziadh): This is here temporarily for a side experiment. Remove later
// on.
enum LogStoreStatus {
@@ -54,6 +57,7 @@ void MakeStoreStatusHistogram(LogStoreStatus status) {
UMA_HISTOGRAM_ENUMERATION("PrefService.PersistentLogStore2", status,
END_STORE_STATUS);
}
+
} // namespace
@@ -61,40 +65,82 @@ MetricsLogSerializer::MetricsLogSerializer() {}
MetricsLogSerializer::~MetricsLogSerializer() {}
-void MetricsLogSerializer::SerializeLogs(const std::vector<std::string>& logs,
- MetricsLogManager::LogType log_type) {
+void MetricsLogSerializer::SerializeLogs(
+ const std::vector<std::pair<std::string, std::string> >& logs,
+ MetricsLogManager::LogType log_type) {
PrefService* local_state = g_browser_process->local_state();
DCHECK(local_state);
- const char* pref = NULL;
+ const char* pref_xml = NULL;
+ const char* pref_proto = NULL;
size_t max_store_count = 0;
switch (log_type) {
case MetricsLogManager::INITIAL_LOG:
- pref = prefs::kMetricsInitialLogs;
+ pref_xml = prefs::kMetricsInitialLogsXml;
+ pref_proto = prefs::kMetricsInitialLogsProto;
max_store_count = kMaxInitialLogsPersisted;
break;
case MetricsLogManager::ONGOING_LOG:
- pref = prefs::kMetricsOngoingLogs;
+ pref_xml = prefs::kMetricsOngoingLogsXml;
+ pref_proto = prefs::kMetricsOngoingLogsProto;
max_store_count = kMaxOngoingLogsPersisted;
break;
default:
NOTREACHED();
return;
};
- ListPrefUpdate update(local_state, pref);
- ListValue* pref_list = update.Get();
- WriteLogsToPrefList(logs, max_store_count, pref_list);
+
+ std::vector<std::string> logs_xml(logs.size());
+ std::vector<std::string> logs_proto(logs.size());
+ for (size_t i = 0; i < logs.size(); ++i) {
+ logs_xml[i] = logs[i].first;
+ logs_proto[i] = logs[i].second;
+ }
+
+ // Write the XML version.
+ ListPrefUpdate update_xml(local_state, pref_xml);
+ ListValue* pref_list_xml = update_xml.Get();
+ WriteLogsToPrefList(logs_xml, max_store_count, pref_list_xml);
+
+ // Write the protobuf version.
+ ListPrefUpdate update_proto(local_state, pref_proto);
+ ListValue* pref_list_proto = update_proto.Get();
+ WriteLogsToPrefList(logs_proto, max_store_count, pref_list_proto);
}
-void MetricsLogSerializer::DeserializeLogs(MetricsLogManager::LogType log_type,
- std::vector<std::string>* logs) {
+void MetricsLogSerializer::DeserializeLogs(
+ MetricsLogManager::LogType log_type,
+ std::vector<std::pair<std::string, std::string> >* logs) {
DCHECK(logs);
PrefService* local_state = g_browser_process->local_state();
DCHECK(local_state);
- const char* pref = (log_type == MetricsLogManager::INITIAL_LOG) ?
- prefs::kMetricsInitialLogs : prefs::kMetricsOngoingLogs;
- const ListValue* unsent_logs = local_state->GetList(pref);
- ReadLogsFromPrefList(*unsent_logs, logs);
+ const char* pref_xml;
+ const char* pref_proto;
+ if (log_type == MetricsLogManager::INITIAL_LOG) {
+ pref_xml = prefs::kMetricsInitialLogsXml;
+ pref_proto = prefs::kMetricsInitialLogsProto;
+ } else {
+ pref_xml = prefs::kMetricsOngoingLogsXml;
+ pref_proto = prefs::kMetricsOngoingLogsProto;
+ }
+
+ const ListValue* unsent_logs_xml = local_state->GetList(pref_xml);
+ const ListValue* unsent_logs_proto = local_state->GetList(pref_proto);
+ std::vector<std::string> logs_xml;
+ std::vector<std::string> logs_proto;
+ // TODO(isherman): Error reporting...
Ilya Sherman 2012/01/28 08:17:20 (Will address this TODO and the others in this fil
+ ReadLogsFromPrefList(*unsent_logs_xml, &logs_xml);
+ ReadLogsFromPrefList(*unsent_logs_proto, &logs_proto);
+
+ if (logs_xml.size() != logs_proto.size()) {
+ // TODO(isherman): ...
+ return;
+ }
+
+ logs->resize(logs_xml.size());
+ for (size_t i = 0; i < logs->size(); ++i) {
+ (*logs)[i] = std::make_pair(logs_xml[i], logs_proto[i]);
+ }
}
// static
@@ -106,7 +152,7 @@ void MetricsLogSerializer::WriteLogsToPrefList(
size_t start = 0;
if (local_list.size() > kMaxLocalListSize)
start = local_list.size() - kMaxLocalListSize;
- DCHECK(start <= local_list.size());
+ DCHECK_LE(start, local_list.size());
if (local_list.size() <= start)
return;
@@ -121,6 +167,7 @@ void MetricsLogSerializer::WriteLogsToPrefList(
// We encode the compressed log as Value::CreateStringValue() expects to
// take a valid UTF8 string.
if (!base::Base64Encode(*it, &encoded_log)) {
+ // TODO(isherman): Is it ok for xml and protobuf encoding failures to mix?
MakeStoreStatusHistogram(ENCODE_FAIL);
list->Clear();
return;

Powered by Google App Engine
This is Rietveld 408576698