- Add Redpanda Console service (port 28080, Traefik integration) - Add Pulsar Distribution Service (Pulsar -> Brokers) - Create Grafana dashboards for Redpanda, Pulsar, and Smart City Ingestion - Configure Prometheus targets for Pulsar and Redpanda metrics - Fix FROST URL in distribution service - Create session resume for 2026-05-05
104 lines
3.3 KiB
JSON
104 lines
3.3 KiB
JSON
{
|
|
"annotations": {
|
|
"list": [
|
|
{
|
|
"builtIn": 1,
|
|
"datasource": "-- Grafana --",
|
|
"enable": true,
|
|
"hide": true,
|
|
"name": "Annotations & Alerts",
|
|
"type": "dashboard"
|
|
}
|
|
]
|
|
},
|
|
"editable": true,
|
|
"fiscalYearStartMonth": 0,
|
|
"graphTooltip": 0,
|
|
"id": null,
|
|
"links": [],
|
|
"panels": [
|
|
{
|
|
"title": "Smart City Data Ingeston",
|
|
"type": "row",
|
|
"gridPos": {"h": 1, "w": 24, "x": 0, "y": 0}
|
|
},
|
|
{
|
|
"title": "Messages/sec by Type",
|
|
"type": "timeseries",
|
|
"datasource": {"type": "influxdb", "uid": "InfluxDB-Simulator"},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\") |> group(columns: [\"type\"]) |> count()",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 1}
|
|
},
|
|
{
|
|
"title": "Temperature (Weather)",
|
|
"type": "timeseries",
|
|
"datasource": {"type": "influxdb", "uid": "InfluxDB-Simulator"},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"type\"] == \"weather\") |> filter(fn: (r) => r[\"_field\"] == \"temperature_celsius\") |> mean()",
|
|
"refId": "B"
|
|
}
|
|
],
|
|
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 1}
|
|
},
|
|
{
|
|
"title": "Air Quality (PM2.5)",
|
|
"type": "timeseries",
|
|
"datasource": {"type": "influxdb", "uid": "InfluxDB-Simulator"},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"type\"] == \"airquality\") |> filter(fn: (r) => r[\"_field\"] == \"pm25_ugm3\") |> mean()",
|
|
"refId": "C"
|
|
}
|
|
],
|
|
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 9}
|
|
},
|
|
{
|
|
"title": "Traffic Count",
|
|
"type": "timeseries",
|
|
"datasource": {"type": "influxdb", "uid": "InfluxDB-Simulator"},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"type\"] == \"traffic\") |> filter(fn: (r) => r[\"_field\"] == \"vehicle_count\") |> mean()",
|
|
"refId": "D"
|
|
}
|
|
],
|
|
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 9}
|
|
},
|
|
{
|
|
"title": "Pulsar Message Rates",
|
|
"type": "row",
|
|
"gridPos": {"h": 1, "w": 24, "x": 0, "y": 17}
|
|
},
|
|
{
|
|
"title": "Pulsar In/Out Bytes/sec",
|
|
"type": "timeseries",
|
|
"datasource": {"type": "prometheus", "uid": "prometheus"},
|
|
"targets": [
|
|
{
|
|
"expr": "rate(pulsar_in_bytes_total[1m])",
|
|
"legendFormat": "In Bytes/sec"
|
|
},
|
|
{
|
|
"expr": "rate(pulsar_out_bytes_total[1m])",
|
|
"legendFormat": "Out Bytes/sec"
|
|
}
|
|
],
|
|
"gridPos": {"h": 8, "w": 24, "x": 0, "y": 18}
|
|
}
|
|
],
|
|
"schemaVersion": 38,
|
|
"style": "dark",
|
|
"tags": ["smart-city", "influxdb", "pulsar"],
|
|
"templating": {"list": []},
|
|
"time": {"from": "now-1h", "to": "now"},
|
|
"title": "Smart City - Data Ingeston",
|
|
"uid": "smart-city-ingeston",
|
|
"version": 1
|
|
}
|