154 lines
6.3 KiB
Protocol Buffer
154 lines
6.3 KiB
Protocol Buffer
// Copyright 2019 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
syntax = "proto2";
|
|
|
|
option optimize_for = LITE_RUNTIME;
|
|
option java_package = "org.chromium.components.metrics";
|
|
|
|
package metrics;
|
|
|
|
// One structured metrics event, containing several hashed and unhashed metrics
|
|
// related to a single event type. Structured metrics have hashing keys based on
|
|
// the project. A project refers to a use-case of the framework (ie bluetooth,
|
|
// event sequence).
|
|
//
|
|
// Structured metrics is currently only used for the CrOS platform, so some of
|
|
// the fields are CrOS-specific (ie device_project_id, user_project_id). If
|
|
// structured metrics were to expand to other platforms, these fields will need
|
|
// to be revisited.
|
|
//
|
|
// Next tag: 9
|
|
message StructuredEventProto {
|
|
// A per-client, per-profile, per-project ID that is used only for structured
|
|
// metrics. For projects recorded from Chrome OS's platform2 repository, this
|
|
// ID is device-wide, not per-profile. The ID is rotated at least every 90
|
|
// days.
|
|
//
|
|
// For events of type SEQUENCE, the ID will be rotated every 120 days.
|
|
optional fixed64 profile_event_id = 1;
|
|
|
|
// A per-profile, per-project ID used only for events of type SEQUENCE. A
|
|
// device may have multiple profiles and multiple projects (ie cros-events).
|
|
//
|
|
// This ID is generated by applying HMAC on a locally-generated GUID (which is
|
|
// never sent) with a per-profile, per-project key. The first 8 bytes of the
|
|
// resulting string will be emitted.
|
|
//
|
|
// For events recorded when a user is not logged in or for events recorded
|
|
// outside of Chrome, this field should be empty.
|
|
//
|
|
// Since the per-profile, per-project keys are rotated every 120 days, this
|
|
// means that the |user_project_id| will also change every N days. For more
|
|
// details on how keys are rotated, refer to go/structured-metrics.
|
|
optional fixed64 user_project_id = 7;
|
|
|
|
// A device-wide, per-project ID used only for events of type SEQUENCE. This
|
|
// ID is rotated every 120 days.
|
|
//
|
|
// This ID is generated by hashing a locally-generated GUID (which is never
|
|
// sent) with a per-device, per-project key. The first 8 bytes of thee
|
|
// resulting string will be emitted.
|
|
//
|
|
// Since the per-device, per-project keys are rotated every N (default 90)
|
|
// days, this means that the |device_project_id| will also change every N
|
|
// days. For more details on how keys are rotated, refer to
|
|
// go/structured-metrics.
|
|
//
|
|
// Note that an event may have both a |device_project_id| and
|
|
// |user_project_id|.
|
|
optional fixed64 device_project_id = 8;
|
|
|
|
// The first 8 bytes of the MD5 hash of the event's name as a string. Each
|
|
// name is defined in src/tools/metrics/structured/structured.xml, and this
|
|
// will be the hash of one of those.
|
|
optional fixed64 event_name_hash = 2;
|
|
|
|
// All metric values for this event. Each metric has two properties defined in
|
|
// structured.xml that determine what is recorded.
|
|
//
|
|
// 1. Metric name. This is a string, and the first 8 bytes of its MD5 hash is
|
|
// recorded as name_hash.
|
|
//
|
|
// 2. Kind. Each metric can store four kinds of values.
|
|
//
|
|
// - int64. The client supplies an int64 value for the metric, and that
|
|
// value is recorded as-is in value_int64.
|
|
//
|
|
// - string. The client supplies a string value for the metric, which is
|
|
// recorded as-is in value_string. This is sometimes referred to as a
|
|
// "raw string" to differentiate from the following.
|
|
//
|
|
// - hashed-string. The client supplies an arbitrary string for the metric.
|
|
// The string itself is not recorded, instead, value_hmac records the
|
|
// first 8 bytes of:
|
|
//
|
|
// HMAC_SHA256(concat(string, metric_name), event_key)
|
|
//
|
|
// - double. The client supplies a double value for the metric, which is
|
|
// recorded as-is in value_double.
|
|
//
|
|
// The event_key is a per-profile, per-client, per-project secret 32-byte
|
|
// key used only for signing hashed values for this event. Keys should
|
|
// never leave the device, and are rotated at least every 90 days.
|
|
message Metric {
|
|
optional fixed64 name_hash = 1;
|
|
oneof value {
|
|
fixed64 value_hmac = 2;
|
|
int64 value_int64 = 3;
|
|
string value_string = 4;
|
|
double value_double = 5;
|
|
}
|
|
}
|
|
repeated Metric metrics = 3;
|
|
|
|
// Type of this event, which determines which log source the event is saved
|
|
// into. An event should have type RAW_STRING if and only if the event may
|
|
// contain raw string metrics, ie. strings that have not been HMAC'd. The
|
|
// UNKNOWN value is considered an error and should never be sent.
|
|
//
|
|
// An event should be marked as a SEQUENCE if it contains temporal data.
|
|
enum EventType {
|
|
UNKNOWN = 0;
|
|
REGULAR = 1;
|
|
RAW_STRING = 2;
|
|
SEQUENCE = 3;
|
|
}
|
|
optional EventType event_type = 4;
|
|
|
|
// The project name hash is the first 8 bytes of the MD5 hash of the project
|
|
// name that is defined in src/tools/metrics/structured/structured.xml.
|
|
optional fixed64 project_name_hash = 5;
|
|
|
|
// Metadata associated with events for which relative order in which the
|
|
// events occur are of interest.
|
|
//
|
|
// Next tag: 4
|
|
message EventSequenceMetadata {
|
|
// GUIDs generated on the client to uniquely identify an event. These event
|
|
// IDs will be used to establish relationships between events on the client.
|
|
optional fixed64 event_unique_id = 1;
|
|
|
|
// Time elapsed since boot time. Note that system uptime includes duration a
|
|
// device has spent asleep. System uptime resets when a machine reboots.
|
|
// Granularity is in milliseconds.
|
|
optional int64 system_uptime = 2;
|
|
|
|
// Monotonically increasing number incremented every time a system reset is
|
|
// detected. This value will be reset to 0 in the event of a powerwash.
|
|
optional int64 reset_counter = 3;
|
|
}
|
|
|
|
// Metadata associated with event type SEQUENCE. This field will be stripped
|
|
// if the event is not of type SEQUENCE.
|
|
optional EventSequenceMetadata event_sequence_metadata = 6;
|
|
}
|
|
|
|
// The top-level proto for structured metrics. One StructuredDataProto is
|
|
// uploaded per UMA upload containing structured metrics. Contains all
|
|
// structured events for that upload, and any other metadata.
|
|
message StructuredDataProto {
|
|
repeated StructuredEventProto events = 1;
|
|
}
|