This commit is contained in:
@@ -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.
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user