feat(api): support optional systemInfo in submissions
All checks were successful
Build and Publish Docker Image / deploy (push) Successful in 1m17s
All checks were successful
Build and Publish Docker Image / deploy (push) Successful in 1m17s
Extend the submission contract to accept a `systemInfo` object and persist it with each submission, including deep-copy support for `extra` metadata. Also update client-facing docs and HTTP examples (JSON and multipart) and document that the schema is available at `GET /api/schema`, so clients can reliably implement the updated payload format.feat(api): support optional systemInfo in submissions Extend the submission contract to accept a `systemInfo` object and persist it with each submission, including deep-copy support for `extra` metadata. Also update client-facing docs and HTTP examples (JSON and multipart) and document that the schema is available at `GET /api/schema`, so clients can reliably implement the updated payload format.
This commit is contained in:
306
docs/submit-schema.json
Normal file
306
docs/submit-schema.json
Normal file
@@ -0,0 +1,306 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://cpu-benchmarker.local/schemas/submit-schema.json",
|
||||
"title": "CPU Benchmark Submission",
|
||||
"description": "Request body for POST /api/submit. Older clients may omit systemInfo.",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"submitter": {
|
||||
"type": "string",
|
||||
"description": "Human-readable device or user label."
|
||||
},
|
||||
"platform": {
|
||||
"type": "string",
|
||||
"enum": ["windows", "linux", "macos"],
|
||||
"description": "Normalized platform value."
|
||||
},
|
||||
"systemInfo": {
|
||||
"$ref": "#/$defs/systemInfo"
|
||||
},
|
||||
"benchmark": {
|
||||
"$ref": "#/$defs/benchmarkResult"
|
||||
},
|
||||
"result": {
|
||||
"$ref": "#/$defs/benchmarkResult"
|
||||
},
|
||||
"data": {
|
||||
"$ref": "#/$defs/benchmarkResult"
|
||||
},
|
||||
"config": {
|
||||
"$ref": "#/$defs/benchmarkConfig"
|
||||
},
|
||||
"cpuInfo": {
|
||||
"$ref": "#/$defs/cpuInfo"
|
||||
},
|
||||
"startedAt": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"duration": {
|
||||
"type": "integer",
|
||||
"description": "Benchmark duration in nanoseconds."
|
||||
},
|
||||
"totalOps": {
|
||||
"type": "integer"
|
||||
},
|
||||
"mOpsPerSec": {
|
||||
"type": "number"
|
||||
},
|
||||
"score": {
|
||||
"type": "integer"
|
||||
},
|
||||
"coreResults": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/$defs/coreResult"
|
||||
}
|
||||
}
|
||||
},
|
||||
"anyOf": [
|
||||
{
|
||||
"required": ["benchmark"]
|
||||
},
|
||||
{
|
||||
"required": ["result"]
|
||||
},
|
||||
{
|
||||
"required": ["data"]
|
||||
},
|
||||
{
|
||||
"required": ["config", "cpuInfo", "startedAt", "duration", "totalOps", "mOpsPerSec", "score", "coreResults"]
|
||||
}
|
||||
],
|
||||
"$defs": {
|
||||
"benchmarkConfig": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"durationSecs": {
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"intensity": {
|
||||
"type": "integer"
|
||||
},
|
||||
"coreFilter": {
|
||||
"type": "integer"
|
||||
},
|
||||
"multiCore": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": ["durationSecs", "intensity", "coreFilter", "multiCore"]
|
||||
},
|
||||
"cpuInfo": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"brandString": {
|
||||
"type": "string"
|
||||
},
|
||||
"vendorID": {
|
||||
"type": "string"
|
||||
},
|
||||
"physicalCores": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"logicalCores": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"baseClockMHz": {
|
||||
"type": "integer",
|
||||
"description": "Current server schema expects an integer MHz value."
|
||||
},
|
||||
"boostClockMHz": {
|
||||
"type": "integer"
|
||||
},
|
||||
"l1DataKB": {
|
||||
"type": "integer"
|
||||
},
|
||||
"l2KB": {
|
||||
"type": "integer"
|
||||
},
|
||||
"l3MB": {
|
||||
"type": "integer"
|
||||
},
|
||||
"isHybrid": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"has3DVCache": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"pCoreCount": {
|
||||
"type": "integer"
|
||||
},
|
||||
"eCoreCount": {
|
||||
"type": "integer"
|
||||
},
|
||||
"cores": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/$defs/cpuCoreDescriptor"
|
||||
}
|
||||
},
|
||||
"supportedFeatures": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["brandString", "physicalCores", "logicalCores"]
|
||||
},
|
||||
"cpuCoreDescriptor": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"LogicalID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"PhysicalID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"CoreID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"Type": {
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"required": ["LogicalID", "PhysicalID", "CoreID", "Type"]
|
||||
},
|
||||
"coreResult": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"logicalID": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"coreType": {
|
||||
"type": "string"
|
||||
},
|
||||
"mOpsPerSec": {
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"totalOps": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": ["logicalID", "coreType", "mOpsPerSec", "totalOps"]
|
||||
},
|
||||
"benchmarkResult": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"config": {
|
||||
"$ref": "#/$defs/benchmarkConfig"
|
||||
},
|
||||
"cpuInfo": {
|
||||
"$ref": "#/$defs/cpuInfo"
|
||||
},
|
||||
"startedAt": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"duration": {
|
||||
"type": "integer"
|
||||
},
|
||||
"totalOps": {
|
||||
"type": "integer"
|
||||
},
|
||||
"mOpsPerSec": {
|
||||
"type": "number"
|
||||
},
|
||||
"score": {
|
||||
"type": "integer"
|
||||
},
|
||||
"coreResults": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/$defs/coreResult"
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["config", "cpuInfo", "startedAt", "duration", "totalOps", "mOpsPerSec", "score", "coreResults"]
|
||||
},
|
||||
"systemInfo": {
|
||||
"type": "object",
|
||||
"description": "Optional analytics and environment metadata. Clients may omit this entire object.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"hostname": {
|
||||
"type": "string"
|
||||
},
|
||||
"osName": {
|
||||
"type": "string"
|
||||
},
|
||||
"osVersion": {
|
||||
"type": "string"
|
||||
},
|
||||
"distro": {
|
||||
"type": "string"
|
||||
},
|
||||
"kernelVersion": {
|
||||
"type": "string"
|
||||
},
|
||||
"kernelArch": {
|
||||
"type": "string"
|
||||
},
|
||||
"architecture": {
|
||||
"type": "string"
|
||||
},
|
||||
"locale": {
|
||||
"type": "string"
|
||||
},
|
||||
"timezone": {
|
||||
"type": "string"
|
||||
},
|
||||
"region": {
|
||||
"type": "string"
|
||||
},
|
||||
"country": {
|
||||
"type": "string"
|
||||
},
|
||||
"city": {
|
||||
"type": "string"
|
||||
},
|
||||
"isp": {
|
||||
"type": "string"
|
||||
},
|
||||
"sessionID": {
|
||||
"type": "string"
|
||||
},
|
||||
"userID": {
|
||||
"type": "string"
|
||||
},
|
||||
"clientVersion": {
|
||||
"type": "string"
|
||||
},
|
||||
"appVersion": {
|
||||
"type": "string"
|
||||
},
|
||||
"ipAddress": {
|
||||
"type": "string",
|
||||
"description": "May be supplied by the client, and may also be enriched by the server from the request."
|
||||
},
|
||||
"forwardedFor": {
|
||||
"type": "string"
|
||||
},
|
||||
"userAgent": {
|
||||
"type": "string"
|
||||
},
|
||||
"extra": {
|
||||
"type": "object",
|
||||
"description": "Free-form extension point for future analytics.",
|
||||
"additionalProperties": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user