bug 1440673 - Summarize dynamic events to a dynamic scalar r?Dexter draft
authorChris H-C <chutten@mozilla.com>
Thu, 29 Mar 2018 14:28:50 -0400
changeset 778104 797576b3f0ed02d00edf5276d78a7985ca04a996
parent 778103 920b6472477a26316601a438e05fdaa771f91c78
child 778105 9bf40ea05e16df91359d4127276c64966353fdce
push id105384
push userbmo:chutten@mozilla.com
push dateThu, 05 Apr 2018 20:33:48 +0000
reviewersDexter
bugs1440673
milestone61.0a1
bug 1440673 - Summarize dynamic events to a dynamic scalar r?Dexter MozReview-Commit-ID: KD9ADGJZZCM
toolkit/components/telemetry/TelemetryScalar.cpp
--- a/toolkit/components/telemetry/TelemetryScalar.cpp
+++ b/toolkit/components/telemetry/TelemetryScalar.cpp
@@ -1504,16 +1504,29 @@ TelemetryScalar::InitializeGlobalState(b
   // Populate the static scalar name->id cache. Note that the scalar names are
   // statically allocated and come from the automatically generated TelemetryScalarData.h.
   uint32_t scalarCount = static_cast<uint32_t>(mozilla::Telemetry::ScalarID::ScalarCount);
   for (uint32_t i = 0; i < scalarCount; i++) {
     CharPtrEntryType *entry = gScalarNameIDMap.PutEntry(gScalars[i].name());
     entry->mData = ScalarKey{i, false};
   }
 
+  // To summarize dynamic events we need a dynamic scalar.
+  const nsTArray<DynamicScalarInfo> initialDynamicScalars({
+    DynamicScalarInfo{
+      nsITelemetry::SCALAR_TYPE_COUNT,
+      true /* recordOnRelease */,
+      false /* expired */,
+      nsAutoCString("telemetry.dynamic_event_counts"),
+      true /* keyed */,
+      false /* built-in */,
+    },
+  });
+  internal_RegisterScalars(locker, initialDynamicScalars);
+
   gInitDone = true;
 }
 
 void
 TelemetryScalar::DeInitializeGlobalState()
 {
   StaticMutexAutoLock locker(gTelemetryScalarsMutex);
   gCanRecordBase = false;
@@ -2541,22 +2554,33 @@ TelemetryScalar::SummarizeEvent(const ns
                                 ProcessID aProcessType, bool aDynamic)
 {
   MOZ_ASSERT(XRE_IsParentProcess(), "Only summarize events in the parent process");
   if (!XRE_IsParentProcess()) {
     return;
   }
 
   StaticMutexAutoLock lock(gTelemetryScalarsMutex);
+
   ScalarKey scalarKey{static_cast<uint32_t>(ScalarID::TELEMETRY_EVENT_COUNTS), aDynamic};
+  if (aDynamic) {
+    nsresult rv = internal_GetEnumByScalarName(lock,
+                                               nsAutoCString("telemetry.dynamic_event_counts"),
+                                               &scalarKey);
+    if (NS_FAILED(rv)) {
+      NS_WARNING("NS_FAILED getting ScalarKey for telemetry.dynamic_event_counts");
+      return;
+    }
+  }
+
   KeyedScalar* scalar = nullptr;
   nsresult rv = internal_GetKeyedScalarByEnum(lock, scalarKey, aProcessType, &scalar);
 
   if (NS_FAILED(rv)) {
-    NS_WARNING("NS_FAILED getting keyed scalar telemetry.event_counts. Wut.");
+    NS_WARNING("NS_FAILED getting keyed scalar for event summary. Wut.");
     return;
   }
 
   static uint32_t sMaxEventSummaryKeys =
     Preferences::GetUint("toolkit.telemetry.maxEventSummaryKeys", 500);
 
   // Set this each time as it may have been cleared and recreated between calls
   scalar->SetMaximumNumberOfKeys(sMaxEventSummaryKeys);