{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:architecture-standards:schema:log-record",
  "title": "Diagnostic log record",
  "description": "Structural contract for a diagnostic JSON log record.",
  "$comment": "Nonnormative projection of OBS-LOG-001, OBS-LOG-003 and OBS-LOG-004. Normative text prevails.",
  "type": "object",
  "required": [
    "timestamp",
    "severity_text",
    "severity_number",
    "message",
    "service.name",
    "service.version",
    "deployment.environment.name",
    "event.name"
  ],
  "properties": {
    "timestamp": {
      "type": "string",
      "format": "date-time",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]+(?:Z|[+]00:00)$"
    },
    "severity_text": {
      "enum": ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"]
    },
    "severity_number": {
      "type": "integer",
      "minimum": 1,
      "maximum": 24
    },
    "message": {
      "type": "string",
      "pattern": "\\S"
    },
    "service.name": {
      "type": "string",
      "pattern": "\\S"
    },
    "service.version": {
      "type": "string",
      "pattern": "\\S"
    },
    "deployment.environment.name": {
      "type": "string",
      "pattern": "\\S"
    },
    "event.name": {
      "type": "string",
      "pattern": "\\S"
    },
    "trace_id": {
      "type": "string",
      "pattern": "^[0-9a-f]{32}$",
      "not": {
        "const": "00000000000000000000000000000000"
      }
    },
    "span_id": {
      "type": "string",
      "pattern": "^[0-9a-f]{16}$",
      "not": {
        "const": "0000000000000000"
      }
    },
    "request_id": {
      "type": "string",
      "pattern": "\\S"
    },
    "correlation_id": {
      "type": "string",
      "pattern": "\\S"
    }
  },
  "dependentRequired": {
    "trace_id": ["span_id"],
    "span_id": ["trace_id"]
  },
  "allOf": [
    {
      "oneOf": [
        {
          "properties": {
            "severity_text": {"const": "TRACE"},
            "severity_number": {"minimum": 1, "maximum": 4}
          }
        },
        {
          "properties": {
            "severity_text": {"const": "DEBUG"},
            "severity_number": {"minimum": 5, "maximum": 8}
          }
        },
        {
          "properties": {
            "severity_text": {"const": "INFO"},
            "severity_number": {"minimum": 9, "maximum": 12}
          }
        },
        {
          "properties": {
            "severity_text": {"const": "WARN"},
            "severity_number": {"minimum": 13, "maximum": 16}
          }
        },
        {
          "properties": {
            "severity_text": {"const": "ERROR"},
            "severity_number": {"minimum": 17, "maximum": 20}
          }
        },
        {
          "properties": {
            "severity_text": {"const": "FATAL"},
            "severity_number": {"minimum": 21, "maximum": 24}
          }
        }
      ]
    }
  ],
  "additionalProperties": true
}
