Index: content/common/web_database_observer_impl.cc |
=================================================================== |
--- content/common/web_database_observer_impl.cc (revision 111751) |
+++ content/common/web_database_observer_impl.cc (working copy) |
@@ -4,11 +4,39 @@ |
#include "content/common/web_database_observer_impl.h" |
+#include "base/metrics/histogram.h" |
#include "base/string16.h" |
#include "content/common/database_messages.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
+using WebKit::WebDatabase; |
+ |
+namespace { |
+ |
+const int kResultHistogramSize = 50; |
+const int kCallsiteHistogramSize = 10; |
+ |
+int DetermineHistogramResult(int webSqlErrorCode, int sqliteErrorCode) { |
+ // If we have a sqlite error, log it after trimming the extended bits. |
+ // There are 26 possible values, but we leave room for some new ones. |
+ if (sqliteErrorCode) |
+ return std::min(sqliteErrorCode & 0xff, 30); |
+ |
+ // Otherwise, webSqlErrorCode may be an SQLExceptionCode, SQLErrorCode |
+ // or a DOMExceptionCode, or -1 for success. |
+ if (webSqlErrorCode == -1) |
+ return 0; // no error |
+ |
+ // SQLExceptionCode starts at 1000 |
+ if (webSqlErrorCode >= 1000) |
+ webSqlErrorCode -= 1000; |
+ |
+ return std::min(webSqlErrorCode + 30, kResultHistogramSize - 1); |
+} |
+ |
+} // namespace |
+ |
WebDatabaseObserverImpl::WebDatabaseObserverImpl( |
IPC::Message::Sender* sender) |
: sender_(sender), |
@@ -19,7 +47,7 @@ |
} |
void WebDatabaseObserverImpl::databaseOpened( |
- const WebKit::WebDatabase& database) { |
+ const WebDatabase& database) { |
string16 origin_identifier = database.securityOrigin().databaseIdentifier(); |
string16 database_name = database.name(); |
open_connections_->AddOpenConnection(origin_identifier, database_name); |
@@ -29,13 +57,13 @@ |
} |
void WebDatabaseObserverImpl::databaseModified( |
- const WebKit::WebDatabase& database) { |
+ const WebDatabase& database) { |
sender_->Send(new DatabaseHostMsg_Modified( |
database.securityOrigin().databaseIdentifier(), database.name())); |
} |
void WebDatabaseObserverImpl::databaseClosed( |
- const WebKit::WebDatabase& database) { |
+ const WebDatabase& database) { |
string16 origin_identifier = database.securityOrigin().databaseIdentifier(); |
string16 database_name = database.name(); |
sender_->Send(new DatabaseHostMsg_Closed( |
@@ -43,6 +71,128 @@ |
open_connections_->RemoveOpenConnection(origin_identifier, database_name); |
} |
+void WebDatabaseObserverImpl::reportOpenDatabaseResult( |
+ const WebDatabase& database, int callsite, int webSqlErrorCode, |
+ int sqliteErrorCode) { |
+ DCHECK(callsite < kCallsiteHistogramSize); |
ramant (doing other things)
2011/11/29 23:29:36
nit:
could we define a routine that takes the his
michaeln
2011/11/29 23:50:13
I believe the histogram names can't vary for a par
ramant (doing other things)
2011/11/30 00:13:21
We have to define a macro. It is your call.
|
+ int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); |
+ if (database.isSyncDatabase()) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.OpenResult", |
+ result, kResultHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.OpenResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } else { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.OpenResult", |
+ result, kResultHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.OpenResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } |
+} |
+ |
+void WebDatabaseObserverImpl::reportChangeVersionResult( |
+ const WebDatabase& database, int callsite, int webSqlErrorCode, |
+ int sqliteErrorCode) { |
+ DCHECK(callsite < kCallsiteHistogramSize); |
+ int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); |
+ if (database.isSyncDatabase()) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.ChangeVersionResult", |
+ result, kResultHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.ChangeVersionResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } else { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.ChangeVersionResult", |
+ result, kResultHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.ChangeVersionResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } |
+} |
+ |
+void WebDatabaseObserverImpl::reportStartTransactionResult( |
+ const WebDatabase& database, int callsite, int webSqlErrorCode, |
+ int sqliteErrorCode) { |
+ DCHECK(callsite < kCallsiteHistogramSize); |
+ int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); |
+ if (database.isSyncDatabase()) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.BeginResult", |
+ result, kResultHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.BeginResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } else { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.BeginResult", |
+ result, kResultHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.BeginResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } |
+} |
+ |
+void WebDatabaseObserverImpl::reportCommitTransactionResult( |
+ const WebDatabase& database, int callsite, int webSqlErrorCode, |
+ int sqliteErrorCode) { |
+ DCHECK(callsite < kCallsiteHistogramSize); |
+ int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); |
+ if (database.isSyncDatabase()) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.CommitResult", |
+ result, kResultHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.CommitResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } else { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.CommitResult", result, |
+ result, kResultHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.CommitResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } |
+} |
+ |
+void WebDatabaseObserverImpl::reportExecuteStatementResult( |
+ const WebDatabase& database, int callsite, int webSqlErrorCode, |
+ int sqliteErrorCode) { |
+ DCHECK(callsite < kCallsiteHistogramSize); |
+ int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); |
+ if (database.isSyncDatabase()) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.StatementResult", |
+ result, kHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.StatementResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } else { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.StatementResult", |
+ result, kResultHistogramSize); |
+ if (result) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.StatementResult.ErrorSite", |
+ callsite, kCallsiteHistogramSize); |
+ } |
+ } |
+} |
+ |
+void WebDatabaseObserverImpl::reportVacuumDatabaseResult( |
+ const WebDatabase& database, int sqliteErrorCode) { |
+ int result = DetermineHistogramResult(-1, sqliteErrorCode); |
+ if (database.isSyncDatabase()) { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Sync.VacuumResult", |
+ result, kResultHistogramSize); |
+ } else { |
+ UMA_HISTOGRAM_ENUMERATION("websql.Async.VacuumResult", |
+ result, kResultHistogramSize); |
+ } |
+} |
+ |
void WebDatabaseObserverImpl::WaitForAllDatabasesToClose() { |
open_connections_->WaitForAllDatabasesToClose(); |
} |