{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://github.com/api-evangelist/go-kit/json-schema/go-kit-transport-config.json",
  "title": "Go Kit Service Transport Configuration",
  "description": "JSON Schema representing Go Kit service transport configuration options for HTTP, gRPC, and other transport layers, including middleware, instrumentation, and service discovery.",
  "type": "object",
  "properties": {
    "service": {
      "type": "object",
      "description": "Service-level configuration.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Service name for discovery and logging."
        },
        "version": {
          "type": "string",
          "description": "Service version."
        }
      },
      "additionalProperties": true
    },
    "http": {
      "type": "object",
      "description": "HTTP transport configuration.",
      "properties": {
        "address": {
          "type": "string",
          "description": "Bind address for the HTTP server.",
          "default": ":8080"
        },
        "readTimeout": {
          "type": "string",
          "description": "HTTP read timeout (e.g., 30s).",
          "default": "30s"
        },
        "writeTimeout": {
          "type": "string",
          "description": "HTTP write timeout.",
          "default": "30s"
        },
        "idleTimeout": {
          "type": "string",
          "description": "HTTP idle connection timeout.",
          "default": "120s"
        },
        "tls": {
          "type": "object",
          "description": "TLS configuration for the HTTP transport.",
          "properties": {
            "enabled": {
              "type": "boolean",
              "default": false
            },
            "certFile": {
              "type": "string",
              "description": "Path to TLS certificate file."
            },
            "keyFile": {
              "type": "string",
              "description": "Path to TLS key file."
            }
          },
          "additionalProperties": true
        },
        "cors": {
          "type": "object",
          "description": "CORS configuration.",
          "properties": {
            "allowedOrigins": {
              "type": "array",
              "items": { "type": "string" },
              "default": ["*"]
            },
            "allowedMethods": {
              "type": "array",
              "items": { "type": "string" },
              "default": ["GET", "POST", "PUT", "DELETE"]
            },
            "allowedHeaders": {
              "type": "array",
              "items": { "type": "string" }
            },
            "allowCredentials": {
              "type": "boolean",
              "default": false
            }
          },
          "additionalProperties": true
        }
      },
      "additionalProperties": true
    },
    "grpc": {
      "type": "object",
      "description": "gRPC transport configuration.",
      "properties": {
        "address": {
          "type": "string",
          "description": "Bind address for the gRPC server.",
          "default": ":8081"
        },
        "tls": {
          "type": "object",
          "description": "TLS configuration for gRPC.",
          "properties": {
            "enabled": {
              "type": "boolean",
              "default": false
            },
            "certFile": {
              "type": "string"
            },
            "keyFile": {
              "type": "string"
            },
            "caFile": {
              "type": "string",
              "description": "CA certificate for mutual TLS."
            }
          },
          "additionalProperties": true
        },
        "maxRecvMsgSize": {
          "type": "integer",
          "description": "Maximum receive message size in bytes.",
          "default": 4194304
        },
        "maxSendMsgSize": {
          "type": "integer",
          "description": "Maximum send message size in bytes.",
          "default": 4194304
        },
        "keepAlive": {
          "type": "object",
          "properties": {
            "time": {
              "type": "string",
              "description": "Keepalive ping interval.",
              "default": "2h"
            },
            "timeout": {
              "type": "string",
              "description": "Keepalive timeout.",
              "default": "20s"
            }
          },
          "additionalProperties": true
        }
      },
      "additionalProperties": true
    },
    "serviceDiscovery": {
      "type": "object",
      "description": "Service discovery configuration for client-side load balancing.",
      "properties": {
        "type": {
          "type": "string",
          "description": "Discovery mechanism.",
          "enum": ["consul", "etcd", "eureka", "zookeeper", "dns", "static"],
          "default": "consul"
        },
        "addresses": {
          "type": "array",
          "description": "Discovery server addresses.",
          "items": {
            "type": "string"
          }
        },
        "refreshInterval": {
          "type": "string",
          "description": "How often to refresh the service list.",
          "default": "30s"
        }
      },
      "additionalProperties": true
    },
    "loadBalancer": {
      "type": "object",
      "description": "Client-side load balancer configuration.",
      "properties": {
        "strategy": {
          "type": "string",
          "description": "Load balancing strategy.",
          "enum": ["round-robin", "random", "least-connections"],
          "default": "round-robin"
        },
        "retryMax": {
          "type": "integer",
          "description": "Maximum number of retries.",
          "default": 3
        },
        "retryTimeout": {
          "type": "string",
          "description": "Per-retry timeout.",
          "default": "500ms"
        }
      },
      "additionalProperties": true
    },
    "rateLimit": {
      "type": "object",
      "description": "Rate limiting middleware configuration.",
      "properties": {
        "enabled": {
          "type": "boolean",
          "default": false
        },
        "requestsPerSecond": {
          "type": "number",
          "description": "Maximum requests per second."
        },
        "burst": {
          "type": "integer",
          "description": "Burst size for token bucket."
        }
      },
      "additionalProperties": true
    },
    "circuitBreaker": {
      "type": "object",
      "description": "Circuit breaker middleware configuration.",
      "properties": {
        "enabled": {
          "type": "boolean",
          "default": false
        },
        "maxRequests": {
          "type": "integer",
          "description": "Max requests in half-open state.",
          "default": 1
        },
        "interval": {
          "type": "string",
          "description": "Cyclic period for clearing counts.",
          "default": "60s"
        },
        "timeout": {
          "type": "string",
          "description": "Open state timeout before transitioning to half-open.",
          "default": "60s"
        }
      },
      "additionalProperties": true
    },
    "logging": {
      "type": "object",
      "description": "Logging middleware configuration.",
      "properties": {
        "level": {
          "type": "string",
          "enum": ["debug", "info", "warn", "error"],
          "default": "info"
        },
        "format": {
          "type": "string",
          "description": "Log format.",
          "enum": ["logfmt", "json"],
          "default": "logfmt"
        }
      },
      "additionalProperties": true
    },
    "metrics": {
      "type": "object",
      "description": "Metrics instrumentation configuration.",
      "properties": {
        "enabled": {
          "type": "boolean",
          "default": false
        },
        "provider": {
          "type": "string",
          "description": "Metrics backend provider.",
          "enum": ["prometheus", "statsd", "graphite", "influx", "dogstatsd"],
          "default": "prometheus"
        },
        "address": {
          "type": "string",
          "description": "Metrics server address (for push-based backends)."
        },
        "prefix": {
          "type": "string",
          "description": "Metrics name prefix."
        }
      },
      "additionalProperties": true
    },
    "tracing": {
      "type": "object",
      "description": "Distributed tracing configuration.",
      "properties": {
        "enabled": {
          "type": "boolean",
          "default": false
        },
        "provider": {
          "type": "string",
          "description": "Tracing backend provider.",
          "enum": ["zipkin", "jaeger", "lightstep", "opentelemetry"],
          "default": "zipkin"
        },
        "endpoint": {
          "type": "string",
          "description": "Tracing collector endpoint URL."
        },
        "sampleRate": {
          "type": "number",
          "description": "Sampling rate (0.0 - 1.0).",
          "default": 1.0,
          "minimum": 0.0,
          "maximum": 1.0
        }
      },
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}
