syntax = "proto3";

package envoy.api.v2.cluster;

option java_outer_classname = "CircuitBreakerProto";
option java_multiple_files = true;
option java_package = "io.envoyproxy.envoy.api.v2.cluster";
option go_package = "cluster";
option csharp_namespace = "Envoy.Api.V2.ClusterNS";
option ruby_package = "Envoy.Api.V2.ClusterNS";

import "envoy/api/v2/core/base.proto";

import "google/protobuf/wrappers.proto";

import "gogoproto/gogo.proto";

option (gogoproto.equal_all) = true;

// [#protodoc-title: Circuit breakers]

// :ref:`Circuit breaking<arch_overview_circuit_break>` settings can be
// specified individually for each defined priority.
message CircuitBreakers {

  // A Thresholds defines CircuitBreaker settings for a
  // :ref:`RoutingPriority<envoy_api_enum_core.RoutingPriority>`.
  message Thresholds {
    // The :ref:`RoutingPriority<envoy_api_enum_core.RoutingPriority>`
    // the specified CircuitBreaker settings apply to.
    // [#comment:TODO(htuch): add (validate.rules).enum.defined_only = true once
    // https://github.com/lyft/protoc-gen-validate/issues/42 is resolved.]
    core.RoutingPriority priority = 1;

    // The maximum number of connections that Envoy will make to the upstream
    // cluster. If not specified, the default is 1024.
    google.protobuf.UInt32Value max_connections = 2;

    // The maximum number of pending requests that Envoy will allow to the
    // upstream cluster. If not specified, the default is 1024.
    google.protobuf.UInt32Value max_pending_requests = 3;

    // The maximum number of parallel requests that Envoy will make to the
    // upstream cluster. If not specified, the default is 1024.
    google.protobuf.UInt32Value max_requests = 4;

    // The maximum number of parallel retries that Envoy will allow to the
    // upstream cluster. If not specified, the default is 3.
    google.protobuf.UInt32Value max_retries = 5;

    // If track_remaining is true, then stats will be published that expose
    // the number of resources remaining until the circuit breakers open. If
    // not specified, the default is false.
    bool track_remaining = 6;

    // The maximum number of connection pools per cluster that Envoy will concurrently support at
    // once. If not specified, the default is unlimited. Set this for clusters which create a
    // large number of connection pools. See
    // :ref:`Circuit Breaking <arch_overview_circuit_break_cluster_maximum_connection_pools>` for
    // more details.
    google.protobuf.UInt32Value max_connection_pools = 7;
  }

  // If multiple :ref:`Thresholds<envoy_api_msg_cluster.CircuitBreakers.Thresholds>`
  // are defined with the same :ref:`RoutingPriority<envoy_api_enum_core.RoutingPriority>`,
  // the first one in the list is used. If no Thresholds is defined for a given
  // :ref:`RoutingPriority<envoy_api_enum_core.RoutingPriority>`, the default values
  // are used.
  repeated Thresholds thresholds = 1;
}
