15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SYNC_UTIL_DATA_TYPE_HISTOGRAM_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_UTIL_DATA_TYPE_HISTOGRAM_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For now, this just implements UMA_HISTOGRAM_LONG_TIMES. This can be adjusted
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if we feel the min, max, or bucket count amount are not appropriate.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_FREQ_HISTOGRAM(name, time) UMA_HISTOGRAM_CUSTOM_TIMES( \
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name, time, base::TimeDelta::FromMilliseconds(1), \
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta::FromHours(1), 50)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper macro for datatype specific histograms. For each datatype, invokes
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a pre-defined PER_DATA_TYPE_MACRO(type_str), where |type_str| is the string
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version of the datatype.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example usage (ignoring newlines necessary for multiline macro):
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// std::vector<syncer::ModelType> types = GetEntryTypes();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for (int i = 0; i < types.size(); ++i) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #define PER_DATA_TYPE_MACRO(type_str)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     UMA_HISTOGRAM_ENUMERATION("Sync." type_str "StartFailures",
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                               error, max_error);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   SYNC_DATA_TYPE_HISTOGRAM(types[i]);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #undef PER_DATA_TYPE_MACRO
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(zea): Once visual studio supports proper variadic argument replacement
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in macros, pass in the histogram method directly as a parameter.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://connect.microsoft.com/VisualStudio/feedback/details/380090/
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variadic-macro-replacement#details
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_DATA_TYPE_HISTOGRAM(datatype) \
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do { \
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (datatype) { \
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::BOOKMARKS: \
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Bookmarks"); \
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::PREFERENCES: \
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Preferences"); \
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::PASSWORDS: \
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Passwords"); \
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::AUTOFILL: \
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Autofill"); \
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::AUTOFILL_PROFILE: \
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("AutofillProfiles"); \
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::THEMES: \
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Themes"); \
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::TYPED_URLS: \
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("TypedUrls"); \
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::EXTENSIONS: \
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Extensions"); \
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::NIGORI: \
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Nigori"); \
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::SEARCH_ENGINES: \
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("SearchEngines"); \
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::SESSIONS: \
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Sessions"); \
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::APPS: \
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Apps"); \
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ::syncer::APP_LIST: \
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PER_DATA_TYPE_MACRO("AppList"); \
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break; \
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::APP_SETTINGS: \
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("AppSettings"); \
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::EXTENSION_SETTINGS: \
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("ExtensionSettings"); \
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::APP_NOTIFICATIONS: \
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("AppNotifications"); \
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::HISTORY_DELETE_DIRECTIVES: \
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("HistoryDeleteDirectives"); \
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case ::syncer::SYNCED_NOTIFICATIONS: \
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PER_DATA_TYPE_MACRO("SyncedNotifications"); \
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break; \
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ::syncer::SYNCED_NOTIFICATION_APP_INFO: \
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PER_DATA_TYPE_MACRO("SyncedNotificationAppInfo"); \
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break; \
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::DEVICE_INFO: \
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("DeviceInfo"); \
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ::syncer::EXPERIMENTS: \
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PER_DATA_TYPE_MACRO("Experiments"); \
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break; \
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case ::syncer::PRIORITY_PREFERENCES :\
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PER_DATA_TYPE_MACRO("PriorityPreferences"); \
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break; \
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case ::syncer::DICTIONARY: \
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PER_DATA_TYPE_MACRO("Dictionary"); \
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break; \
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case ::syncer::FAVICON_IMAGES: \
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PER_DATA_TYPE_MACRO("FaviconImages"); \
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break; \
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case ::syncer::FAVICON_TRACKING: \
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PER_DATA_TYPE_MACRO("FaviconTracking"); \
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break; \
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      case ::syncer::SUPERVISED_USER_SETTINGS: \
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PER_DATA_TYPE_MACRO("ManagedUserSetting"); \
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break; \
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      case ::syncer::SUPERVISED_USERS: \
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        PER_DATA_TYPE_MACRO("ManagedUser"); \
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break; \
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      case ::syncer::SUPERVISED_USER_SHARED_SETTINGS: \
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PER_DATA_TYPE_MACRO("ManagedUserSharedSetting"); \
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break; \
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case ::syncer::ARTICLES: \
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        PER_DATA_TYPE_MACRO("Article"); \
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break; \
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case ::syncer::PROXY_TABS: \
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PER_DATA_TYPE_MACRO("Tabs"); \
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break; \
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default: \
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED() << "Unknown datatype " \
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     << ::syncer::ModelTypeToString(datatype);  \
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } \
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (0)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SYNC_UTIL_DATA_TYPE_HISTOGRAM_H_
136