Skip to main content

Monitoring

The standard way to check the operating status of an Edge.


REST Endpoints

EndpointAuthPurpose
GET /api/v1/system/healthNot requiredTCP probe of 8 components (cassandra/redis/mqtt/node_red/opc_ua/edge_core/tse/grafana) + overall status. HTTP 503 if DEGRADED — recommended for OTA / k8s probes
GET /api/v1/system/readyNot requiredmonitor + V5 api_client readiness
GET /api/v1/system/versionNot requiredMetadata.VERSION + BUILD_DATE + image_tag + container_mode — recommended for fleet inventory
GET /api/v1/edgeRequiredEdge identity / version / uptime / cumulative transmission count
GET /api/v1/monitoringRequiredSystem metrics (CPU / memory / disk / network / JVM)
GET /api/v1/opcRequiredPer-OPC connection status / scan status / cumulative point count
GET /api/v1/opc/{opcId}/tagRequiredTag last value / timestamp / read status
GET /api/v1/transferRequiredTransmission channel health (API/MQTT/Sparkplug, queue depth)

One-line Edge Health Check

curl -s http://<edge-host>/api/v1/edge | jq '{started, uptime_ms, sended_count, version}'
{
"started": true,
"uptime_ms": 124500,
"sended_count": 8063,
"version": "2025"
}

If sended_count increases over time, the queue → transmission pipeline is running.


Per-OPC Status

curl -s http://<edge-host>/api/v1/opc \
| jq '.data.data[] | {opc_id, opc_type, connection_status, scan_status, tag_count, point_count}'
FieldPossible values / meaning
connection_statusCONNECTED / DISCONNECTED / ERROR
scan_statusSTART / STOP (scheduler status)
tag_countNumber of registered tags
point_countCumulative collected points (reset on restart)

To quickly view only problematic OPCs:

curl -s http://<edge-host>/api/v1/opc \
| jq '.data.data[] | select(.connection_status != "CONNECTED")'

Last Value per Tag

curl -s http://<edge-host>/api/v1/tag/<TAG_ID>/value | jq
{
"result": "OK",
"data": {
"tag_id": "TAG_UA_0004",
"value": "28.9688",
"value_time": "2026-05-06 20:59:39.000",
"value_read_status": "SUCCESS",
"value_read_error_message": ""
}
}

If value_read_status is ERROR, identify the cause in value_read_error_message.


System Metrics

curl -s http://<edge-host>/api/v1/monitoring | jq '.data | {cpu_usage, memory_usage, disk_usage, thread_count}'

Exposes all fields of MonitorBean as-is (varies with the field set at application build time).


Sparkplug Verification

If sparkplug.enable=true, you can verify by subscribing to spBv1.0/# with an external client such as paho-mqtt.

# 간단한 체크 스니펫 (참고용)
import os
import paho.mqtt.client as mqtt

def on_message(c, u, m):
print(m.topic, len(m.payload))

c = mqtt.Client()
c.username_pw_set(os.environ["MQTT_USER"], os.environ["MQTT_PASSWORD"])
c.on_message = on_message
c.connect("<edge-host>", 1883)
c.subscribe("spBv1.0/#")
c.loop_forever()

Expected:

TopicFrequency
spBv1.0/<group>/NBIRTH/<edge>Once at boot
spBv1.0/<group>/DBIRTH/<edge>/<opc>Once per OPC at boot
spBv1.0/<group>/DDATA/<edge>/<opc>1 message per point
spBv1.0/<group>/NDEATH/<edge>Once at shutdown (or automatically via will)

Log Keywords

grep patterns based on catalina.out:

PatternMeaning
Cassandra connectedDB OK
MQTT connectedMQTT broker OK
[SparkPlug] CONNECT / NBIRTHSPB lifecycle
LS connect success / LS connect failedLS driver connection
OPCUA connectOPCUA driver connection
PLC_READ_TIMEOUT_EXCEPTIONModbus timeout
restartCollectorCollector restart after OPC add/modify/delete
WARNThreshold exceeded (connection_warn_ms etc.)

Transmission Statistics — /api/v1/transfer

This endpoint is already provided. Example response:

{
"queue_depth": 1234,
"queue_capacity": 10000,
"transfers": [
{ "type": "API", "status": "OK", "sent": 12345, "errors": 0 },
{ "type": "MQTT", "status": "OK", "connected": true, "topic": "/edge/point" },
{ "type": "Sparkplug", "status": "OK", "connected": true, "bdSeq": 3, "seq": 142, "devices": 10 }
]
}

When more are added, usage examples on this page will be updated.