// 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/observation2.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 {
    OccurrenceEvent occurrence_event = 1;
    CountEvent count_event = 2;
    ElapsedTimeEvent elapsed_time_event = 3;
    FrameRateEvent frame_rate_event = 4;
    MemoryUsageEvent memory_usage_event = 5;
    IntHistogramEvent int_histogram_event = 6;
    StringUsedEvent string_used_event = 7;
    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 index (between 0 and 23 inclusive) within the day on which this Event occurred.
  uint32 hour_index = 1004;
}

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

// Records that an event occurred a number of times.
message CountEvent {
  // 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 a given string was used in a specific context. The semantics
// of the Metric must be specified in comments near the MetricDefintion.
//
// See comments in metric_definion.proto for Metric type STRING_USED.
message StringUsedEvent {
  string str = 1;
}

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