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"] } } } } }