Hi Willy, Hi All,

On Thu, Nov 10, 2016 at 04:52:56PM +0100, Willy Tarreau wrote:
> Hi Simon!
> 
> On Thu, Nov 10, 2016 at 04:27:15PM +0100, Simon Horman wrote:
> > My preference is to take things calmly as TBH I am only just getting
> > started on this and I think the schema could take a little time to get
> > a consensus on.
> 
> I totally agree with you. I think the most difficult thing is not to
> run over a few arrays and dump them but manage to make everyone agree
> on the schema. And that will take more than a few days I guess. Anyway
> I'm fine with being proven wrong :-)

I took a first pass at defining a schema.

* The schema follows what is described on json-schema.org (or at least
  tries to). Is this a suitable approach?
* The schema only covers "show info" and "show stat" and the fields
  are based on the typed output variants of those commands.
  This leads me to several questions:
  - Is this field selection desirable? It seems to make sense to me
    as presumably the intention of the JSON output is for it to
    be machine readable.
  - Is such an approach appropriate for other show commands?
  - And more generally, which other show commands are desired to
    support output in JSON (in the near term)?

{
    "$schema": "http://json-schema.org/draft-04/schema#";,
    "oneOf": [
        {
            "title": "Info",
            "description": "Info about HAProxy status",
            "type": "array",
            "items": {
                "properties": {
                "title": "Info Item",
                "type": "object",
                    "field": { "$ref": "#/definitions/field" },
                    "processNum": { "$ref": "#/definitions/processNum" },
                    "tags": { "$ref": "#/definitions/tags" },
                    "value": { "$ref": "#/definitions/typedValue" }
                },
                "required": ["field", "processNum", "tags", "value"]
            }
        },
        {
            "title": "Stat",
            "description": "HAProxy statistics",
            "type": "array",
            "items": {
                "title": "Info Item",
                "type": "object",
                "properties": {
                    "objType": {
                        "enum": ["F", // Frontend
                                 "B", // Backend
                                 "L", // Listener
                                 "S"  // Server
                        ]
                    },
                    "proxyId": {
                        "type": "integer",
                        "minimum": 0
                    },
                    "id": {
                        "description": "Unique identifyier of object within 
proxy",
                        "type": "integer",
                        "minimum": 0
                    },
                    "field": { "$ref": "#/definitions/field" },
                    "processNum": { "$ref": "#/definitions/processNum" },
                    "tags": { "$ref": "#/definitions/tags" },
                    "typedValue": { "$ref": "#/definitions/typedValue" }
                },
                "required": ["objType", "proxyId", "id", "field", "processNum",
                             "tags", "value"]
            }
        }
    ],
    "definitions": {
        "field": {
            "type": "object",
            "pos": {
                "description": "Position of field",
                "type": "integer",
                "minimum": 0
            },
            "name": {
                "description": "Name of field",
                "type": "string"
            },
            "required": ["pos", "name"]
        },
        "processNum": {
            "description": "Relative process number",
            "type": "integer",
            "minimum": 1
        },
        "tags": {
            "type": "object",
            "origin": {
                "description": "Origin value was extracted from",
                "type": "string",
                "enum": ["M", // Metric
                         "S", // Status
                         "K", // Sorting Key
                         "C", // From Configuration
                         "P"  // From Product
                ]
            },
            "nature": {
                "description": "Nature of information carried by field",
                "type": "string",
                "enum": ["A", // Age since last event
                         "a", // Averaged value
                         "C", // Cumulative counter
                         "D", // Duration for a status
                         "G", // Gague - measure at one instant
                         "L", // Limit
                         "M", // Maximum
                         "m", // Minimum
                         "N", // Name
                         "O", // Free text output
                         "R", // Event rate - measure at one instant
                         "T"  // Date or time
                ]
            },
            "scope": {
                "description": "Extent of value",
                "type": "string",
                "enum": ["C", // Cluster
                         "P", // Process
                         "S", // Service
                         "s"  // System
                ]
            },
            "required": ["origin", "nature", "scope" ]
        },
        "typedValue": {
            "type": "object",
            "oneOf": [
                { "$ref": "#/definitions/typedValue/definitions/s32Value" },
                { "$ref": "#/definitions/typedValue/definitions/s64Value" },
                { "$ref": "#/definitions/typedValue/definitions/u32Value" },
                { "$ref": "#/definitions/typedValue/definitions/u64Value" },
                { "$ref": "#/definitions/typedValue/definitions/strValue" }
            ],
            "definitions": {
                "s32Value": {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [ "s32" ]
                        },
                        "value": {
                            "type": "integer",
                            "minimum": -2147483648,
                            "maximim": 2147483647
                        }
                    },
                    "required": ["type", "value"]
                },
                "s64Value": {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [ "s64" ]
                        },
                        "value": {
                            "type": "integer",
                            "minimum": -9223372036854775808,
                            "maximim": 9223372036854775807
                        }
                    },
                    "required": ["type", "value"]
                },
                "u32Value": {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [ "u32" ]
                        },
                        "value": {
                            "type": "integer",
                            "minimum": 0,
                            "maximim": 4294967295
                        }
                    },
                    "required": ["type", "value"]
                },
                "u64Value": {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [ "u64" ]
                        },
                        "value": {
                            "type": "integer",
                            "minimum": 0,
                            "maximim": 18446744073709551615
                        }
                    },
                    "required": ["type", "value"]
                },
                "strValue": {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [ "str" ]
                        },
                        "value": { "type": "string" }
                    },
                    "required": ["type", "value"]
                }
            }
        }
    }
}

Reply via email to