syntax = "proto3";

package xray.core.app.observatory;
message ObservationResult {
  repeated OutboundStatus status = 1;
}

message HealthPingMeasurementResult {
  int64 all = 1;
  int64 fail = 2;
  int64 deviation = 3;
  int64 average = 4;
  int64 max = 5;
  int64 min = 6;
}

message OutboundStatus{
  /* @Document Whether this outbound is usable
     @Restriction ReadOnlyForUser
  */
  bool alive = 1;
  /* @Document The time for probe request to finish.
     @Type time.ms
     @Restriction ReadOnlyForUser
  */
  int64 delay = 2;
  /* @Document The last error caused this outbound failed to relay probe request
     @Restriction NotMachineReadable
  */
  string last_error_reason = 3;
  /* @Document The outbound tag for this Server
     @Type id.outboundTag
  */
  string outbound_tag = 4;
  /* @Document The time this outbound is known to be alive
   @Type id.outboundTag
*/
  int64 last_seen_time = 5;
  /* @Document The time this outbound is tried
   @Type id.outboundTag
*/
  int64 last_try_time = 6;

  HealthPingMeasurementResult health_ping = 7;
}

message ProbeResult{
  /* @Document Whether this outbound is usable
     @Restriction ReadOnlyForUser
  */
  bool alive = 1;
  /* @Document The time for probe request to finish.
     @Type time.ms
     @Restriction ReadOnlyForUser
  */
  int64 delay = 2;
  /* @Document The error caused this outbound failed to relay probe request
   @Restriction NotMachineReadable
*/
  string last_error_reason = 3;
}

message Intensity{
  /* @Document The time interval for a probe request in ms.
     @Type time.ms
  */
  uint32 probe_interval = 1;
}
message Config {
  /* @Document The selectors for outbound under observation
  */
  repeated string subject_selector = 2;

  string probe_url = 3;

  int64 probe_interval = 4;

  bool enable_concurrency = 5;
}