syntax = "proto3";

package v1;

import "sdktoken.proto";
import "google/protobuf/timestamp.proto";

//熔断状态变更类型
enum StatusChange {
    Unknown = 0;
    CloseToOpen = 1;
    OpenToHalfOpen = 2;
    HalfOpenToOpen = 3;
    HalfOpenToClose = 4;
}

enum RecoverAllStatus {
    Invalid = 0;
    //发生了全死全活
    Start = 1;
    //全死全活结束（由于服务实例状态的改变）
    End = 2;
}

//实例的一次熔断状态改变
message CircuitbreakChange {
    //变更时间
    google.protobuf.Timestamp time = 1;
    //变更的次序
    uint32 change_seq = 2;
    //状态变更类型
    StatusChange change = 3;
    //状态变更原因
    string reason = 4;
}

//实例的周期熔断变更历史
message CircuitbreakHistory {
    string ip = 1;
    uint32 port = 2;
    string vpc_id = 3;
    repeated CircuitbreakChange changes = 4;
}

//全死全活状态
message RecoverAllChange {
    //发生全死全活时间
    google.protobuf.Timestamp time = 1;
    //发生全死全活的实例集合的信息，如共同metadata、共同位置等
    string instance_info = 2;
    //全死全活是发生了还是结束了
    RecoverAllStatus change = 3;
}

//一个服务一个周期的熔断变化情况
message ServiceCircuitbreak {
    //该条记录的唯一id
    string id = 1;
    //sdk标识
    SDKToken sdk_token = 2;
    string namespace = 3;
    string service = 4;
    //发生全死全活的情况
    repeated RecoverAllChange recover_all = 5;
    //实例熔断情况
    repeated CircuitbreakHistory instance_circuitbreak = 6;
}
