{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://github.com/api-evangelist/alibaba-sentinel/json-schema/flow-rule.json",
  "title": "Alibaba Sentinel Flow Rule",
  "description": "JSON Schema for Sentinel flow control rules used by the Dashboard API and configuration.",
  "type": "array",
  "items": {
    "$ref": "#/$defs/FlowRule"
  },
  "$defs": {
    "FlowRule": {
      "type": "object",
      "required": ["resource", "count"],
      "properties": {
        "id": {
          "type": "integer",
          "description": "Unique identifier of the rule."
        },
        "resource": {
          "type": "string",
          "description": "Resource name to apply the flow rule to."
        },
        "limitApp": {
          "type": "string",
          "default": "default",
          "description": "Calling application to apply the rule to."
        },
        "grade": {
          "type": "integer",
          "enum": [0, 1],
          "default": 1,
          "description": "Threshold type: 0 = thread count, 1 = QPS."
        },
        "count": {
          "type": "number",
          "description": "Threshold count value."
        },
        "strategy": {
          "type": "integer",
          "enum": [0, 1, 2],
          "default": 0,
          "description": "Flow control strategy: 0 = direct, 1 = relate, 2 = chain."
        },
        "refResource": {
          "type": "string",
          "description": "Reference resource for relate/chain strategy."
        },
        "controlBehavior": {
          "type": "integer",
          "enum": [0, 1, 2, 3],
          "default": 0,
          "description": "Control behavior: 0 = reject directly, 1 = warm up, 2 = rate limiter, 3 = warm up + rate limiter."
        },
        "warmUpPeriodSec": {
          "type": "integer",
          "description": "Warm-up period in seconds for warm up behavior."
        },
        "maxQueueingTimeMs": {
          "type": "integer",
          "description": "Maximum queuing time in milliseconds for rate limiter behavior."
        },
        "clusterMode": {
          "type": "boolean",
          "default": false,
          "description": "Whether the rule is for cluster flow control."
        },
        "clusterConfig": {
          "type": "object",
          "properties": {
            "flowId": {
              "type": "integer",
              "description": "Cluster flow ID."
            },
            "thresholdType": {
              "type": "integer",
              "enum": [0, 1],
              "description": "0 = average by local, 1 = global threshold."
            },
            "fallbackToLocalWhenFail": {
              "type": "boolean",
              "default": true,
              "description": "Whether to fall back to local flow control on failure."
            }
          }
        }
      }
    }
  }
}
