diff --git a/toolkit/components/telemetry/ScalarInfo.h b/toolkit/components/telemetry/ScalarInfo.h index 6c9d8aade7bc..9d7729c5d8ef 100644 --- a/toolkit/components/telemetry/ScalarInfo.h +++ b/toolkit/components/telemetry/ScalarInfo.h @@ -6,17 +6,30 @@ #ifndef TelemetryScalarInfo_h__ #define TelemetryScalarInfo_h__ +#include "nsXULAppAPI.h" + // This module is internal to Telemetry. It defines a structure that holds the // scalar info. It should only be used by TelemetryScalarData.h automatically // generated file and TelemetryScalar.cpp. This should not be used anywhere else. // For the public interface to Telemetry functionality, see Telemetry.h. namespace { + +enum class RecordedProcessType : uint32_t { + Main = (1 << GeckoProcessType_Default), // Also known as "parent process" + Content = (1 << GeckoProcessType_Content), + Gpu = (1 << GeckoProcessType_GPU), + AllChilds = 0xFFFFFFFF - 1, // All the children processes (i.e. content, gpu, ...) + All = 0xFFFFFFFF // All the processes +}; +MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(RecordedProcessType) + struct ScalarInfo { uint32_t kind; uint32_t name_offset; uint32_t expiration_offset; uint32_t dataset; + RecordedProcessType record_in_processes; bool keyed; const char *name() const; diff --git a/toolkit/components/telemetry/gen-scalar-data.py b/toolkit/components/telemetry/gen-scalar-data.py index 6c17c602f8d3..cfdc12f3036a 100644 --- a/toolkit/components/telemetry/gen-scalar-data.py +++ b/toolkit/components/telemetry/gen-scalar-data.py @@ -40,11 +40,12 @@ def write_scalar_info(scalar, output, name_index, expiration_index): if cpp_guard: print("#if defined(%s)" % cpp_guard, file=output) - print(" {{ {}, {}, {}, {}, {} }},"\ + print(" {{ {}, {}, {}, {}, {}, {} }},"\ .format(scalar.nsITelemetry_kind, name_index, expiration_index, scalar.dataset, + " | ".join(scalar.record_in_processes_enum), "true" if scalar.keyed else "false"), file=output) diff --git a/toolkit/components/telemetry/parse_scalars.py b/toolkit/components/telemetry/parse_scalars.py index a560a30139a0..b9bae3545961 100644 --- a/toolkit/components/telemetry/parse_scalars.py +++ b/toolkit/components/telemetry/parse_scalars.py @@ -14,6 +14,16 @@ SCALAR_TYPES_MAP = { 'boolean': 'nsITelemetry::SCALAR_BOOLEAN' } +# This is a list of flags that determine which process the scalar is allowed +# to record from. +KNOWN_PROCESS_FLAGS = { + 'all': 'RecordedProcessType::All', + 'all_childs': 'RecordedProcessType::AllChilds', + 'main': 'RecordedProcessType::Main', + 'content': 'RecordedProcessType::Content', + 'gpu': 'RecordedProcessType::Gpu', +} + class ScalarType: """A class for representing a scalar definition.""" @@ -87,13 +97,15 @@ class ScalarType: OPTIONAL_FIELDS = { 'cpp_guard': basestring, 'release_channel_collection': basestring, - 'keyed': bool + 'keyed': bool, + 'record_in_processes': list, } # The types for the data within the fields that hold lists. LIST_FIELDS_CONTENT = { 'bug_numbers': int, - 'notification_emails': basestring + 'notification_emails': basestring, + 'record_in_processes': basestring, } # Concatenate the required and optional field definitions. @@ -153,6 +165,12 @@ class ScalarType: if cpp_guard and re.match(r'\W', cpp_guard): raise ValueError(self._name + ' - invalid cpp_guard: ' + cpp_guard) + # Validate record_in_processes. + record_in_processes = definition.get('record_in_processes', []) + for proc in record_in_processes: + if proc not in KNOWN_PROCESS_FLAGS.keys(): + raise ValueError(self._name + ' - unknown value in record_in_processes: ' + proc) + @property def name(self): """Get the scalar name""" @@ -208,6 +226,16 @@ class ScalarType: """Get the list of notification emails""" return self._definition['notification_emails'] + @property + def record_in_processes(self): + """Get the non-empty list of processes to record data in""" + return self._definition.get('record_in_processes', ['main']) + + @property + def record_in_processes_enum(self): + """Get the non-empty list of flags representing the processes to record data in""" + return [KNOWN_PROCESS_FLAGS.get(p) for p in self.record_in_processes] + @property def dataset(self): """Get the nsITelemetry constant equivalent to the chose release channel collection