{
  "description": "PrometheusServiceLevel is the expected service quality level using Prometheus as the backend used by Sloth.",
  "properties": {
    "apiVersion": {
      "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
      "type": "string"
    },
    "kind": {
      "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "description": "ServiceLevelSpec is the spec for a PrometheusServiceLevel.",
      "properties": {
        "labels": {
          "additionalProperties": {
            "type": "string"
          },
          "description": "Labels are the Prometheus labels that will have all the recording and alerting rules generated for the service SLOs.",
          "type": "object"
        },
        "service": {
          "description": "Service is the application of the SLOs.",
          "type": "string"
        },
        "slos": {
          "description": "SLOs are the SLOs of the service.",
          "items": {
            "description": "SLO is the configuration/declaration of the service level objective of a service.",
            "properties": {
              "alerting": {
                "description": "Alerting is the configuration with all the things related with the SLO alerts.",
                "properties": {
                  "annotations": {
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Annotations are the Prometheus annotations that will have all the alerts generated by this SLO.",
                    "type": "object"
                  },
                  "labels": {
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Labels are the Prometheus labels that will have all the alerts generated by this SLO.",
                    "type": "object"
                  },
                  "name": {
                    "description": "Name is the name used by the alerts generated for this SLO.",
                    "type": "string"
                  },
                  "pageAlert": {
                    "description": "Page alert refers to the critical alert (check multiwindow-multiburn alerts).",
                    "properties": {
                      "annotations": {
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Annotations are the Prometheus annotations for the specific alert.",
                        "type": "object"
                      },
                      "disable": {
                        "description": "Disable disables the alert and makes Sloth not generating this alert. This can be helpful for example to disable ticket(warning) alerts.",
                        "type": "boolean"
                      },
                      "labels": {
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Labels are the Prometheus labels for the specific alert. For example can be useful to route the Page alert to specific Slack channel.",
                        "type": "object"
                      }
                    },
                    "type": "object",
                    "additionalProperties": false
                  },
                  "ticketAlert": {
                    "description": "TicketAlert alert refers to the warning alert (check multiwindow-multiburn alerts).",
                    "properties": {
                      "annotations": {
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Annotations are the Prometheus annotations for the specific alert.",
                        "type": "object"
                      },
                      "disable": {
                        "description": "Disable disables the alert and makes Sloth not generating this alert. This can be helpful for example to disable ticket(warning) alerts.",
                        "type": "boolean"
                      },
                      "labels": {
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Labels are the Prometheus labels for the specific alert. For example can be useful to route the Page alert to specific Slack channel.",
                        "type": "object"
                      }
                    },
                    "type": "object",
                    "additionalProperties": false
                  }
                },
                "type": "object",
                "additionalProperties": false
              },
              "description": {
                "description": "Description is the description of the SLO.",
                "type": "string"
              },
              "labels": {
                "additionalProperties": {
                  "type": "string"
                },
                "description": "Labels are the Prometheus labels that will have all the recording and alerting rules for this specific SLO. These labels are merged with the previous level labels.",
                "type": "object"
              },
              "name": {
                "description": "Name is the name of the SLO.",
                "maxLength": 128,
                "type": "string"
              },
              "objective": {
                "description": "Objective is target of the SLO the percentage (0, 100] (e.g 99.9).",
                "type": "number"
              },
              "sli": {
                "description": "SLI is the indicator (service level indicator) for this specific SLO.",
                "properties": {
                  "events": {
                    "description": "Events is the events SLI type.",
                    "properties": {
                      "errorQuery": {
                        "description": "ErrorQuery is a Prometheus query that will get the number/count of events that we consider that are bad for the SLO (e.g \"http 5xx\", \"latency > 250ms\"...). Requires the usage of `{{.window}}` template variable.",
                        "type": "string"
                      },
                      "totalQuery": {
                        "description": "TotalQuery is a Prometheus query that will get the total number/count of events for the SLO (e.g \"all http requests\"...). Requires the usage of `{{.window}}` template variable.",
                        "type": "string"
                      }
                    },
                    "required": [
                      "errorQuery",
                      "totalQuery"
                    ],
                    "type": "object",
                    "additionalProperties": false
                  },
                  "plugin": {
                    "description": "Plugin is the pluggable SLI type.",
                    "properties": {
                      "id": {
                        "description": "Name is the name of the plugin that needs to load.",
                        "type": "string"
                      },
                      "options": {
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Options are the options used for the plugin.",
                        "type": "object"
                      }
                    },
                    "required": [
                      "id"
                    ],
                    "type": "object",
                    "additionalProperties": false
                  },
                  "raw": {
                    "description": "Raw is the raw SLI type.",
                    "properties": {
                      "errorRatioQuery": {
                        "description": "ErrorRatioQuery is a Prometheus query that will get the raw error ratio (0-1) for the SLO.",
                        "type": "string"
                      }
                    },
                    "required": [
                      "errorRatioQuery"
                    ],
                    "type": "object",
                    "additionalProperties": false
                  }
                },
                "type": "object",
                "additionalProperties": false
              }
            },
            "required": [
              "alerting",
              "name",
              "objective",
              "sli"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "minItems": 1,
          "type": "array"
        }
      },
      "required": [
        "service"
      ],
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "properties": {
        "lastPromOpRulesSuccessfulGenerated": {
          "description": "LastPromOpRulesGeneration tells the last atemp made for a successful SLO rules generate.",
          "format": "date-time",
          "type": "string"
        },
        "observedGeneration": {
          "description": "ObservedGeneration tells the generation was acted on, normally this is required to stop an infinite loop when the status is updated because it sends a watch updated event to the watchers of the K8s object.",
          "format": "int64",
          "type": "integer"
        },
        "processedSLOs": {
          "description": "ProcessedSLOs tells how many SLOs haven been processed for Prometheus operator.",
          "type": "integer"
        },
        "promOpRulesGenerated": {
          "description": "PromOpRulesGenerated tells if the rules for prometheus operator CRD have been generated.",
          "type": "boolean"
        },
        "promOpRulesGeneratedSLOs": {
          "description": "PromOpRulesGeneratedSLOs tells how many SLOs have been processed and generated for Prometheus operator successfully.",
          "type": "integer"
        }
      },
      "required": [
        "observedGeneration",
        "processedSLOs",
        "promOpRulesGenerated",
        "promOpRulesGeneratedSLOs"
      ],
      "type": "object",
      "additionalProperties": false
    }
  },
  "type": "object"
}
