// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto3";

package cobalt;

import "src/pb/observation.proto";

// An Event is the unit of data logged in Cobalt.
//
// Events are associated with a specific Metric. There is a different Event
// type for each Metric type. Events are also tagged with a day index indicating
// the day on which the event occurred.
message Event {
  // An Event has one of the following types. These types correspond to
  // the various Metric types defined in config/metric_definitions.proto.
  oneof type {
    // These event types are for Cobalt 1.0.
    // TODO(fxbug.dev/45463): Delete when all users move to Cobalt 1.1.
    EventOccurredEvent event_occurred_event = 1;
    EventCountEvent event_count_event = 2;
    ElapsedTimeEvent elapsed_time_event = 3;
    FrameRateEvent frame_rate_event = 4;
    MemoryUsageEvent memory_usage_event = 5;
    IntHistogramEvent int_histogram_event = 6;
    // The remaining event types are for Cobalt 1.1.
    OccurrenceEvent occurrence_event = 8;
    IntegerEvent integer_event = 9;
    IntegerHistogramEvent integer_histogram_event = 10;
    StringEvent string_event = 11;
    CustomEvent custom_event = 999;
  }

  // The three-part unique numerical identifier of the Metric that this
  // Event is associated with.
  uint32 customer_id = 1000;
  uint32 project_id = 1001;
  uint32 metric_id = 1002;

  // The index of the day on which this Event occurred.
  uint32 day_index = 1003;
  // The hour id for this Event.
  uint32 hour_id = 1005;

  reserved 7;
}

// Records that an event has occurred.
message EventOccurredEvent {
  // The event code for the event that occurred.
  uint32 event_code = 1;
}

// Records that an event occurred a number of times.
message EventCountEvent {
  // The event codes for the event that occurred. There must be one event code
  // given for each dimension specified in the metric definition.
  repeated uint32 event_code = 1;
  // The associated system component
  string component = 2;
  // Time over which the count was taken, in microseconds.
  int64 period_duration_micros = 3;
  // The number of times the event occurred.
  int64 count = 4;
}

// Records that an event occurred a number of times.
message ElapsedTimeEvent {
  // The event codes for the event that occurred. There must be one event code
  // given for each dimension specified in the metric definition.
  repeated uint32 event_code = 1;
  // The associated system component
  string component = 2;
  // The elapsed time in microseconds.
  int64 elapsed_micros = 3;
}

// Records a frame-rate.
message FrameRateEvent {
  // The event codes for the event that occurred. There must be one event code
  // given for each dimension specified in the metric definition.
  repeated uint32 event_code = 1;
  // The associated system component
  string component = 2;
  // round(frames-per-second * 1000)
  int64 frames_per_1000_seconds = 3;
}

// Records a memory-usage.
message MemoryUsageEvent {
  // The event codes for the event that occurred. There must be one event code
  // given for each dimension specified in the metric definition.
  repeated uint32 event_code = 1;
  // The associated system component
  string component = 2;
  // Memory usage in bytes.
  int64 bytes = 3;
}

// Records a histogram over a set of integer buckets. The semantics of the
// Metric must be specified in comments near the Metric definition. The
// numerical values of the buckets is specified in the |int_buckets|
// field of the MetricDefinition.
message IntHistogramEvent {
  // The event codes for the event that occurred. There must be one event code
  // given for each dimension specified in the metric definition.
  repeated uint32 event_code = 1;
  // The associated system component
  string component = 2;

  // The set of bucket indices and their corresponding counts.
  repeated HistogramBucket buckets = 3;
}

// Records that an event occurred a number of times.
message OccurrenceEvent {
  // The event codes for the event that occurred. There must be one event code
  // given for each dimension specified in the metric definition.
  repeated uint32 event_code = 1;
  // The number of times the event occurred.
  uint64 count = 2;
}

// Records that an event occurred a number of times.
message IntegerEvent {
  // The event codes for the event that occurred. There must be one event code
  // given for each dimension specified in the metric definition.
  repeated uint32 event_code = 1;
  // The elapsed time in microseconds.
  int64 value = 2;
}

// Records a frame-rate.
message StringEvent {
  // The event codes for the event that occurred. There must be one event code
  // given for each dimension specified in the metric definition.
  repeated uint32 event_code = 1;
  // The associated system component
  string string_value = 2;
}

// Records a histogram over a set of integer buckets. The semantics of the
// Metric must be specified in comments near the Metric definition. The
// numerical values of the buckets is specified in the |int_buckets|
// field of the MetricDefinition.
message IntegerHistogramEvent {
  // The event codes for the event that occurred. There must be one event code
  // given for each dimension specified in the metric definition.
  repeated uint32 event_code = 1;
  // The set of bucket indices and their corresponding counts.
  repeated HistogramBucket buckets = 3;
}

// Allows users of Cobalt to define custom Metrics with custom semantics.
// Each Custom event is either
//
// 1. a collection of CustomEventValues, each of which has a dimension name and a value associated
// with the event.
// 2. a serialized protocol buffer.
message CustomEvent {
  // The keys are the names of the metric dimensions to which each ValuePart
  // is associated.
  map<string, CustomDimensionValue> values = 1;

  // The serialized protocol buffer.
  bytes serialized_proto = 2;
}
