Publish ITWorx Pulse source
Public source validation / validate (push) Failing after 3m8s

This commit is contained in:
ITWorx Pulse release export
2026-09-03 02:09:19 +02:00
commit bd774932d5
614 changed files with 77116 additions and 0 deletions
+25
View File
@@ -0,0 +1,25 @@
# Configuration examples
Files in this directory are **schemas/examples**, not production secrets.
- `metrics/catalog.example.json`: initial semantic metric definitions.
- `dashboards/default-overview.example.json`: system overview template.
- `alerts/default-rules.example.json`: conservative baseline rules.
- `probes/probe.example.json`: disabled probe example.
Codex must:
- validate them against schemas;
- convert them to implementation-owned seed/migration mechanisms;
- version changes;
- never overwrite a user's customized dashboard/rule silently;
- never insert real credentials.
## Contract mapping
- `metrics/catalog.example.json``specs/metric-catalog.schema.json`
- `dashboards/default-overview.example.json``specs/dashboard.schema.json`
- `alerts/default-rules.example.json``specs/alert-rule-set.schema.json`
- `probes/probe.example.json``specs/probe.schema.json`
- `internal/alertdefaults/seed.json` is the implementation-owned, embedded v1 seed. It is reconciled at API startup without overwriting an existing rule ID or user customization.
+173
View File
@@ -0,0 +1,173 @@
{
"schemaVersion": 1,
"rules": [
{
"schemaVersion": 1,
"id": "71111111-1111-4111-8111-111111111111",
"name": "Monitoringbron levert geen recente gegevens",
"enabled": true,
"severity": "degraded",
"scope": {
"entityType": "data-source",
"required": true
},
"condition": {
"inputType": "datasource-health",
"operator": "==",
"threshold": "stale",
"windowSeconds": 120
},
"evaluationIntervalSeconds": 30,
"pendingSeconds": 120,
"resolveSeconds": 60,
"unknownBehavior": "become-unknown",
"groupBy": [
"source"
],
"suppressWhen": [],
"message": {
"titleKey": "alerts.datasourceStale.title",
"bodyKey": "alerts.datasourceStale.body"
}
},
{
"schemaVersion": 1,
"id": "81111111-1111-4111-8111-111111111111",
"name": "Container bevindt zich in een herstartlus",
"enabled": true,
"severity": "degraded",
"scope": {
"entityType": "container",
"excludeIntentionalStopped": true
},
"condition": {
"inputType": "event",
"operator": ">=",
"threshold": 3,
"aggregation": "count",
"windowSeconds": 900
},
"evaluationIntervalSeconds": 30,
"pendingSeconds": 0,
"resolveSeconds": 900,
"unknownBehavior": "become-unknown",
"groupBy": [
"container",
"application"
],
"suppressWhen": [
"host.unreachable"
],
"message": {
"titleKey": "alerts.containerRestartLoop.title",
"bodyKey": "alerts.containerRestartLoop.body"
}
},
{
"schemaVersion": 1,
"id": "91111111-1111-4111-8111-111111111111",
"name": "Disktemperatuur te hoog",
"enabled": true,
"severity": "degraded",
"scope": {
"entityType": "disk"
},
"condition": {
"inputType": "metric",
"metric": "storage.disk.temperature.maximum",
"operator": ">=",
"threshold": 50,
"recoveryThreshold": 46,
"aggregation": "max",
"windowSeconds": 300
},
"evaluationIntervalSeconds": 30,
"pendingSeconds": 300,
"resolveSeconds": 300,
"unknownBehavior": "retain-firing-as-unknown",
"groupBy": [
"disk",
"server"
],
"suppressWhen": [
"host.unreachable",
"storage.source.unavailable"
],
"message": {
"titleKey": "alerts.diskTemperature.title",
"bodyKey": "alerts.diskTemperature.body"
}
},
{
"schemaVersion": 1,
"id": "a1111111-1111-4111-8111-111111111111",
"name": "Service is niet bereikbaar",
"enabled": true,
"severity": "degraded",
"scope": {
"entityType": "service",
"critical": true
},
"condition": {
"inputType": "metric",
"metric": "service.availability.minimum",
"operator": "<",
"threshold": 1,
"aggregation": "min",
"windowSeconds": 90
},
"evaluationIntervalSeconds": 30,
"pendingSeconds": 90,
"resolveSeconds": 60,
"unknownBehavior": "become-unknown",
"groupBy": [
"service",
"application"
],
"suppressWhen": [
"host.unreachable",
"network.gateway.unreachable",
"dns.unavailable"
],
"message": {
"titleKey": "alerts.serviceUnavailable.title",
"bodyKey": "alerts.serviceUnavailable.body"
}
},
{
"schemaVersion": 1,
"id": "b1111111-1111-4111-8111-111111111111",
"name": "Opslagpool bijna vol",
"enabled": true,
"severity": "critical",
"scope": {
"entityType": "storage_pool"
},
"condition": {
"inputType": "metric",
"metric": "storage.pool.utilization",
"operator": ">=",
"threshold": 97,
"recoveryThreshold": 90,
"aggregation": "max",
"windowSeconds": 300
},
"evaluationIntervalSeconds": 60,
"pendingSeconds": 300,
"resolveSeconds": 300,
"unknownBehavior": "retain-firing-as-unknown",
"groupBy": [
"pool",
"server"
],
"suppressWhen": [
"host.unreachable",
"storage.source.unavailable"
],
"message": {
"titleKey": "alerts.storagePoolCritical.title",
"bodyKey": "alerts.storagePoolCritical.body"
}
}
]
}
@@ -0,0 +1,331 @@
{
"schemaVersion": 1,
"id": "11111111-1111-4111-8111-111111111111",
"slug": "overview",
"name": "Overzicht",
"description": "Standaard operationeel overzicht.",
"scope": "system",
"variables": [
{
"name": "server",
"type": "server",
"label": "Server",
"default": "primary"
},
{
"name": "timeRange",
"type": "time-range",
"label": "Periode",
"default": "1h"
}
],
"widgets": [
{
"id": "21111111-1111-4111-8111-111111111111",
"type": "stat",
"title": "Serverstatus",
"description": "Samengevoegde status met verklaringen.",
"data": {
"sourceType": "inventory",
"scope": {
"entityType": "server",
"variable": "server"
},
"transformations": []
},
"visualization": {
"legend": false,
"showSparkline": false,
"decimals": 0,
"thresholds": []
},
"behavior": {
"locked": false,
"hidden": false,
"hideWhenEmpty": false,
"showOnlyOnProblem": false,
"link": "/infrastructure/host",
"liveIntervalSeconds": 5,
"independentTimeRange": null
},
"layouts": {
"desktop": {
"x": 0,
"y": 0,
"w": 6,
"h": 4,
"visible": true
},
"tablet": {
"x": 0,
"y": 0,
"w": 4,
"h": 4,
"visible": true
},
"mobile": {
"x": 0,
"y": 0,
"w": 1,
"h": 4,
"visible": true
},
"wallboard": {
"x": 0,
"y": 0,
"w": 6,
"h": 4,
"visible": true
}
}
},
{
"id": "31111111-1111-4111-8111-111111111111",
"type": "timeseries",
"title": "CPU en belasting",
"data": {
"sourceType": "semantic-metric",
"metric": "host.cpu.utilization",
"scope": {
"serverId": "$server"
},
"range": "$timeRange",
"aggregation": "avg",
"groupBy": [
"instance"
],
"transformations": []
},
"visualization": {
"unit": "percent",
"decimals": 1,
"legend": true,
"showSparkline": false,
"min": 0,
"max": 100,
"thresholds": []
},
"behavior": {
"locked": false,
"hidden": false,
"hideWhenEmpty": false,
"showOnlyOnProblem": false,
"link": "/infrastructure/host",
"liveIntervalSeconds": 2,
"independentTimeRange": null
},
"layouts": {
"desktop": {
"x": 6,
"y": 0,
"w": 12,
"h": 8,
"visible": true
},
"tablet": {
"x": 4,
"y": 0,
"w": 4,
"h": 5,
"visible": true
},
"mobile": {
"x": 0,
"y": 4,
"w": 1,
"h": 5,
"visible": true
},
"wallboard": {
"x": 6,
"y": 0,
"w": 10,
"h": 6,
"visible": true
}
}
},
{
"id": "41111111-1111-4111-8111-111111111111",
"type": "storage-map",
"title": "Array en pools",
"data": {
"sourceType": "inventory",
"scope": {
"entityTypes": [
"array",
"pool",
"disk"
]
},
"transformations": []
},
"visualization": {
"legend": true,
"showSparkline": false,
"decimals": 1,
"thresholds": []
},
"behavior": {
"locked": false,
"hidden": false,
"hideWhenEmpty": false,
"showOnlyOnProblem": false,
"link": "/infrastructure/storage",
"liveIntervalSeconds": 15,
"independentTimeRange": null
},
"layouts": {
"desktop": {
"x": 0,
"y": 8,
"w": 9,
"h": 8,
"visible": true
},
"tablet": {
"x": 0,
"y": 5,
"w": 8,
"h": 7,
"visible": true
},
"mobile": {
"x": 0,
"y": 9,
"w": 1,
"h": 7,
"visible": true
},
"wallboard": {
"x": 0,
"y": 6,
"w": 12,
"h": 7,
"visible": true
}
}
},
{
"id": "51111111-1111-4111-8111-111111111111",
"type": "status-grid",
"title": "Applicaties",
"data": {
"sourceType": "inventory",
"scope": {
"entityType": "application"
},
"transformations": [],
"limit": 50
},
"visualization": {
"legend": true,
"showSparkline": false,
"decimals": 0,
"thresholds": []
},
"behavior": {
"locked": false,
"hidden": false,
"hideWhenEmpty": false,
"showOnlyOnProblem": false,
"link": "/applications",
"liveIntervalSeconds": 5,
"independentTimeRange": null
},
"layouts": {
"desktop": {
"x": 9,
"y": 8,
"w": 9,
"h": 8,
"visible": true
},
"tablet": {
"x": 0,
"y": 12,
"w": 8,
"h": 7,
"visible": true
},
"mobile": {
"x": 0,
"y": 16,
"w": 1,
"h": 7,
"visible": true
},
"wallboard": {
"x": 12,
"y": 6,
"w": 12,
"h": 7,
"visible": true
}
}
},
{
"id": "61111111-1111-4111-8111-111111111111",
"type": "event-timeline",
"title": "Recente gebeurtenissen",
"data": {
"sourceType": "events",
"scope": {},
"range": "$timeRange",
"transformations": [],
"limit": 100
},
"visualization": {
"legend": false,
"showSparkline": false,
"decimals": 0,
"thresholds": []
},
"behavior": {
"locked": false,
"hidden": false,
"hideWhenEmpty": false,
"showOnlyOnProblem": false,
"link": "/events",
"liveIntervalSeconds": 5,
"independentTimeRange": null
},
"layouts": {
"desktop": {
"x": 0,
"y": 16,
"w": 18,
"h": 7,
"visible": true
},
"tablet": {
"x": 0,
"y": 19,
"w": 8,
"h": 7,
"visible": true
},
"mobile": {
"x": 0,
"y": 23,
"w": 1,
"h": 7,
"visible": true
},
"wallboard": {
"x": 0,
"y": 13,
"w": 24,
"h": 6,
"visible": true
}
}
}
],
"settings": {
"defaultTimeRange": "1h",
"live": true,
"refreshSeconds": 5,
"rotationSeconds": null
}
}
+397
View File
@@ -0,0 +1,397 @@
{
"schemaVersion": 1,
"metrics": [
{
"semanticName": "host.cpu.utilization",
"version": 1,
"description": "Average host CPU utilization excluding idle time.",
"unit": "percent",
"valueKind": "gauge",
"sourceKind": "prometheus",
"queryTemplate": "100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\",instance={{instance}}}[{{window}}])) * 100)",
"requiredCapabilities": [
"node-exporter.cpu"
],
"allowedLabels": [
"instance"
],
"defaultAggregation": "avg",
"cardinalityBudget": 10,
"limits": {
"maxRangeSeconds": 2592000,
"maxSeries": 10,
"maxPoints": 20000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries",
"gauge"
],
"freshnessSeconds": 30,
"defaultThresholds": [
{
"state": "attention",
"operator": ">=",
"value": 75,
"durationSeconds": 300
},
{
"state": "degraded",
"operator": ">=",
"value": 90,
"durationSeconds": 300
}
]
},
{
"semanticName": "host.memory.utilization",
"version": 1,
"description": "Host memory utilization based on available memory.",
"unit": "percent",
"valueKind": "gauge",
"sourceKind": "prometheus",
"queryTemplate": "(1 - node_memory_MemAvailable_bytes{instance={{instance}}} / node_memory_MemTotal_bytes{instance={{instance}}}) * 100",
"requiredCapabilities": [
"node-exporter.memory"
],
"allowedLabels": [
"instance"
],
"defaultAggregation": "avg",
"cardinalityBudget": 10,
"limits": {
"maxRangeSeconds": 2592000,
"maxSeries": 10,
"maxPoints": 20000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries",
"gauge"
],
"freshnessSeconds": 30,
"defaultThresholds": [
{
"state": "attention",
"operator": ">=",
"value": 80,
"durationSeconds": 300
},
{
"state": "degraded",
"operator": ">=",
"value": 92,
"durationSeconds": 300
}
]
},
{
"semanticName": "container.cpu.utilization",
"version": 1,
"description": "Container CPU utilization normalized to a percentage of one core unless configured otherwise.",
"unit": "percent",
"valueKind": "gauge",
"sourceKind": "prometheus",
"queryTemplate": "rate(container_cpu_usage_seconds_total{name={{container}}}[{{window}}]) * 100",
"requiredCapabilities": [
"container.cpu"
],
"allowedLabels": [
"instance",
"container",
"image"
],
"defaultAggregation": "avg",
"cardinalityBudget": 500,
"limits": {
"maxRangeSeconds": 2592000,
"maxSeries": 200,
"maxPoints": 100000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries",
"ranked-list",
"table"
],
"freshnessSeconds": 30,
"defaultThresholds": []
},
{
"semanticName": "container.memory.used",
"version": 1,
"description": "Current working-set memory used by a container.",
"unit": "bytes",
"valueKind": "gauge",
"sourceKind": "prometheus",
"queryTemplate": "container_memory_working_set_bytes{name={{container}}}",
"requiredCapabilities": [
"container.memory"
],
"allowedLabels": [
"instance",
"container",
"image"
],
"defaultAggregation": "avg",
"cardinalityBudget": 500,
"limits": {
"maxRangeSeconds": 2592000,
"maxSeries": 200,
"maxPoints": 100000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries",
"ranked-list",
"table"
],
"freshnessSeconds": 30,
"defaultThresholds": []
},
{
"semanticName": "storage.disk.temperature",
"version": 1,
"description": "Observed disk temperature.",
"unit": "celsius",
"valueKind": "gauge",
"sourceKind": "prometheus",
"queryTemplate": "smartctl_device_temperature{device={{device}}}",
"requiredCapabilities": [
"smart.temperature"
],
"allowedLabels": [
"instance",
"device",
"model",
"serial_hash"
],
"defaultAggregation": "max",
"cardinalityBudget": 100,
"limits": {
"maxRangeSeconds": 7776000,
"maxSeries": 100,
"maxPoints": 100000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries",
"gauge",
"heatmap",
"table",
"storage-map"
],
"freshnessSeconds": 300,
"defaultThresholds": [
{
"state": "attention",
"operator": ">=",
"value": 45,
"durationSeconds": 300
},
{
"state": "degraded",
"operator": ">=",
"value": 50,
"durationSeconds": 300
},
{
"state": "critical",
"operator": ">=",
"value": 60,
"durationSeconds": 60
}
]
},
{
"semanticName": "storage.disk.temperature.maximum",
"version": 1,
"description": "Maximum observed disk temperature across the approved source set.",
"unit": "celsius",
"valueKind": "gauge",
"sourceKind": "prometheus",
"queryTemplate": "max(max_over_time(smartctl_device_temperature[{{window}}]))",
"requiredCapabilities": [
"smart.temperature"
],
"allowedLabels": [
"instance",
"device",
"model",
"serial_hash"
],
"defaultAggregation": "max",
"cardinalityBudget": 1,
"limits": {
"maxRangeSeconds": 7776000,
"maxSeries": 1,
"maxPoints": 100000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries",
"gauge"
],
"freshnessSeconds": 300,
"defaultThresholds": []
},
{
"semanticName": "storage.pool.utilization",
"version": 1,
"description": "Used capacity as a percentage of usable pool capacity.",
"unit": "percent",
"valueKind": "gauge",
"sourceKind": "derived",
"queryTemplate": "pulse_storage_pool_used_bytes{pool={{pool}}} / pulse_storage_pool_capacity_bytes{pool={{pool}}} * 100",
"requiredCapabilities": [
"storage.pool.capacity"
],
"allowedLabels": [
"instance",
"pool",
"filesystem"
],
"defaultAggregation": "max",
"cardinalityBudget": 100,
"limits": {
"maxRangeSeconds": 7776000,
"maxSeries": 100,
"maxPoints": 100000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries",
"gauge",
"table",
"storage-map"
],
"freshnessSeconds": 120,
"defaultThresholds": [
{
"state": "attention",
"operator": ">=",
"value": 80,
"durationSeconds": 600
},
{
"state": "degraded",
"operator": ">=",
"value": 90,
"durationSeconds": 600
},
{
"state": "critical",
"operator": ">=",
"value": 97,
"durationSeconds": 300
}
]
},
{
"semanticName": "service.response_time",
"version": 1,
"description": "End-to-end probe response time.",
"unit": "seconds",
"valueKind": "gauge",
"sourceKind": "prometheus",
"queryTemplate": "probe_duration_seconds{probe_id={{probe_id}}}",
"requiredCapabilities": [
"probe.duration"
],
"allowedLabels": [
"probe_id",
"service_id",
"probe_type"
],
"defaultAggregation": "p95",
"cardinalityBudget": 1000,
"limits": {
"maxRangeSeconds": 7776000,
"maxSeries": 500,
"maxPoints": 200000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries",
"ranked-list",
"table",
"heatmap",
"service-matrix"
],
"freshnessSeconds": 120,
"defaultThresholds": []
},
{
"semanticName": "service.availability",
"version": 1,
"description": "Probe success represented as 0 or 1 and aggregated to availability.",
"unit": "ratio",
"valueKind": "gauge",
"sourceKind": "prometheus",
"queryTemplate": "probe_success{probe_id={{probe_id}}}",
"requiredCapabilities": [
"probe.success"
],
"allowedLabels": [
"probe_id",
"service_id",
"probe_type"
],
"defaultAggregation": "avg",
"cardinalityBudget": 1000,
"limits": {
"maxRangeSeconds": 7776000,
"maxSeries": 500,
"maxPoints": 200000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries",
"table",
"service-matrix"
],
"freshnessSeconds": 120,
"defaultThresholds": []
},
{
"semanticName": "service.availability.minimum",
"version": 1,
"description": "Minimum probe availability across the approved service source set.",
"unit": "ratio",
"valueKind": "gauge",
"sourceKind": "prometheus",
"queryTemplate": "min(min_over_time(probe_success[{{window}}]))",
"requiredCapabilities": [
"probe.success"
],
"allowedLabels": [
"probe_id",
"service_id",
"probe_type"
],
"defaultAggregation": "min",
"cardinalityBudget": 1,
"limits": {
"maxRangeSeconds": 7776000,
"maxSeries": 1,
"maxPoints": 100000,
"timeoutSeconds": 10
},
"allowedVisualizations": [
"stat",
"timeseries"
],
"freshnessSeconds": 120,
"defaultThresholds": []
}
]
}
+23
View File
@@ -0,0 +1,23 @@
{
"schemaVersion": 1,
"id": "b1111111-1111-4111-8111-111111111111",
"name": "Pulse self-check",
"type": "http",
"target": {
"scheme": "https",
"host": "pulse.example.invalid",
"port": 443,
"path": "/health/ready"
},
"intervalSeconds": 30,
"timeoutSeconds": 5,
"enabled": false,
"expectedStatusCodes": [
200
],
"followRedirects": false,
"verifyTls": true,
"contentAssertion": null,
"secretReference": null,
"networkPolicyId": null
}