From 9ae512880049a61eb04dee27846f22a4cf9a20cd Mon Sep 17 00:00:00 2001 From: leandrofars Date: Sat, 13 Apr 2024 15:30:45 -0300 Subject: [PATCH 1/4] fix: return general data info when a mtp is down --- .../services/controller/internal/api/info.go | 16 ++++------ .../controller/internal/bridge/bridge.go | 32 +++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/backend/services/controller/internal/api/info.go b/backend/services/controller/internal/api/info.go index 737d904..a96af6b 100644 --- a/backend/services/controller/internal/api/info.go +++ b/backend/services/controller/internal/api/info.go @@ -73,28 +73,24 @@ func (a *Api) generalInfo(w http.ResponseWriter, r *http.Request) { result.ProductClassCount = productclasscount.Msg now := time.Now() - _, err = bridge.NatsReq[time.Duration]( + _, err = bridge.NatsReqWithoutHttpSet[time.Duration]( local.NATS_WS_ADAPTER_SUBJECT_PREFIX+"rtt", []byte(""), - w, a.nc, ) - if err != nil { - return + if err == nil { + result.WebsocketsRtt = time.Until(now).String() } - result.WebsocketsRtt = time.Until(now).String() now = time.Now() - _, err = bridge.NatsReq[time.Duration]( + _, err = bridge.NatsReqWithoutHttpSet[time.Duration]( local.NATS_MQTT_ADAPTER_SUBJECT_PREFIX+"rtt", []byte(""), - w, a.nc, ) - if err != nil { - return + if err == nil { + result.MqttRtt = time.Until(now).String() } - result.MqttRtt = time.Until(now).String() err = json.NewEncoder(w).Encode(result) if err != nil { diff --git a/backend/services/controller/internal/bridge/bridge.go b/backend/services/controller/internal/bridge/bridge.go index 6f3a66d..af3bc1a 100644 --- a/backend/services/controller/internal/bridge/bridge.go +++ b/backend/services/controller/internal/bridge/bridge.go @@ -172,3 +172,35 @@ func NatsReq[T entity.DataType]( return answer, nil } + +func NatsReqWithoutHttpSet[T entity.DataType]( + subj string, + body []byte, + nc *nats.Conn, +) (*entity.MsgAnswer[T], error) { + + var answer *entity.MsgAnswer[T] + + msg, err := nc.Request(subj, body, local.NATS_REQUEST_TIMEOUT) + if err != nil { + log.Println(err) + return nil, err + } + + err = json.Unmarshal(msg.Data, &answer) + if err != nil { + + var errMsg *entity.MsgAnswer[*string] + err = json.Unmarshal(msg.Data, &errMsg) + + if err != nil { + log.Println("Bad answer message formatting: ", err.Error()) + return nil, err + } + + log.Printf("Error message received, msg: %s, code: %d", *errMsg.Msg, errMsg.Code) + return nil, errNatsMsgReceivedWithErrorData + } + + return answer, nil +} From decac3324411c9d6372df542d2ba0b495124f816 Mon Sep 17 00:00:00 2001 From: leandrofars Date: Sun, 14 Apr 2024 13:15:26 -0300 Subject: [PATCH 2/4] feat(api): stomp rtt --- .../services/controller/internal/api/info.go | 11 ++++++++++ .../services/controller/internal/nats/nats.go | 21 ++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/backend/services/controller/internal/api/info.go b/backend/services/controller/internal/api/info.go index a96af6b..7610985 100644 --- a/backend/services/controller/internal/api/info.go +++ b/backend/services/controller/internal/api/info.go @@ -20,6 +20,7 @@ type StatusCount struct { type GeneralInfo struct { MqttRtt string WebsocketsRtt string + StompRtt string ProductClassCount []entity.ProductClassCount StatusCount StatusCount VendorsCount []entity.VendorsCount @@ -82,6 +83,16 @@ func (a *Api) generalInfo(w http.ResponseWriter, r *http.Request) { result.WebsocketsRtt = time.Until(now).String() } + now = time.Now() + _, err = bridge.NatsReqWithoutHttpSet[time.Duration]( + local.NATS_STOMP_ADAPTER_SUBJECT_PREFIX+"rtt", + []byte(""), + a.nc, + ) + if err == nil { + result.StompRtt = time.Until(now).String() + } + now = time.Now() _, err = bridge.NatsReqWithoutHttpSet[time.Duration]( local.NATS_MQTT_ADAPTER_SUBJECT_PREFIX+"rtt", diff --git a/backend/services/controller/internal/nats/nats.go b/backend/services/controller/internal/nats/nats.go index a24e65a..f2b4998 100644 --- a/backend/services/controller/internal/nats/nats.go +++ b/backend/services/controller/internal/nats/nats.go @@ -10,16 +10,17 @@ import ( ) const ( - NATS_ACCOUNT_SUBJ_PREFIX = "account-manager.v1." - NATS_REQUEST_TIMEOUT = 10 * time.Second - NATS_MQTT_SUBJECT_PREFIX = "mqtt.usp.v1." - NATS_MQTT_ADAPTER_SUBJECT_PREFIX = "mqtt-adapter.usp.v1." - NATS_ADAPTER_SUBJECT = "adapter.usp.v1." - NATS_WS_SUBJECT_PREFIX = "ws.usp.v1." - NATS_WS_ADAPTER_SUBJECT_PREFIX = "ws-adapter.usp.v1." - DEVICE_SUBJECT_PREFIX = "device.usp.v1." - BUCKET_NAME = "devices-auth" - BUCKET_DESCRIPTION = "Devices authentication" + NATS_ACCOUNT_SUBJ_PREFIX = "account-manager.v1." + NATS_REQUEST_TIMEOUT = 10 * time.Second + NATS_MQTT_SUBJECT_PREFIX = "mqtt.usp.v1." + NATS_MQTT_ADAPTER_SUBJECT_PREFIX = "mqtt-adapter.usp.v1." + NATS_ADAPTER_SUBJECT = "adapter.usp.v1." + NATS_WS_SUBJECT_PREFIX = "ws.usp.v1." + NATS_WS_ADAPTER_SUBJECT_PREFIX = "ws-adapter.usp.v1." + NATS_STOMP_ADAPTER_SUBJECT_PREFIX = "stomp-adapter.usp.v1." + DEVICE_SUBJECT_PREFIX = "device.usp.v1." + BUCKET_NAME = "devices-auth" + BUCKET_DESCRIPTION = "Devices authentication" ) func StartNatsClient(c config.Nats) (jetstream.JetStream, *nats.Conn, jetstream.KeyValue) { From 50d8f210169b69d4a0f18db7e078a1a3e805b27f Mon Sep 17 00:00:00 2001 From: leandrofars Date: Sun, 14 Apr 2024 13:17:14 -0300 Subject: [PATCH 3/4] feat(frontend): show mtps status and rtt | closes #226 --- frontend/public/assets/mtp/boot-stomp.svg | 1 + frontend/public/assets/mtp/websocket.svg | 1 + frontend/src/pages/index.js | 26 +++++-- .../overview/overview-tasks-progress.js | 69 ++++++++++++++++--- 4 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 frontend/public/assets/mtp/boot-stomp.svg create mode 100644 frontend/public/assets/mtp/websocket.svg diff --git a/frontend/public/assets/mtp/boot-stomp.svg b/frontend/public/assets/mtp/boot-stomp.svg new file mode 100644 index 0000000..289c0b1 --- /dev/null +++ b/frontend/public/assets/mtp/boot-stomp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/assets/mtp/websocket.svg b/frontend/public/assets/mtp/websocket.svg new file mode 100644 index 0000000..522ad53 --- /dev/null +++ b/frontend/public/assets/mtp/websocket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/pages/index.js b/frontend/src/pages/index.js index b98018e..1ba7351 100644 --- a/frontend/src/pages/index.js +++ b/frontend/src/pages/index.js @@ -143,12 +143,6 @@ const Page = () => { container spacing={3} > - - { > + + + @@ -176,6 +184,12 @@ const Page = () => { sm={6} lg={3} > + { - var { value, sx } = props; + var { value, mtp, sx, type } = props; var valueRaw; if( value !== undefined) { valueRaw = value.substring(1); + console.log("rtt:", valueRaw) } + const formatMilliseconds = (timeString) => { + + if (timeString === "") { + return ""; + } + // Regular expression to extract value and unit + const regex = /^(\d+(\.\d+)?)\s*([mµ]?s|s)?$/; + + // Extract value and unit + const matches = timeString.match(regex); + if (!matches) { + return "Invalid time format"; + } + + let value = parseFloat(matches[1]); + const unit = matches[3] || "ms"; + + // Convert units to milliseconds + switch (unit) { + case "s": + value *= 1000; + break; + case "µs": + value /= 1000; + break; + default: + // For "ms", do nothing + break; + } + + // Round the number to two decimal places + const roundedValue = value.toFixed(2); + + return `${roundedValue}ms`; +} + +const showIcon = (mtpType) => { + if (valueRaw === "") { + return + } + switch (mtpType) { + case "mqtt": + return + case "stomp": + return STOMP; + case "websocket": + return WebSocket; + default: + return ; + } +} + return ( @@ -34,10 +89,10 @@ export const OverviewTasksProgress = (props) => { gutterBottom variant="overline" > - Conexão MQTT + {mtp} - {valueRaw} + {formatMilliseconds(valueRaw)} { width: 56 }} > - - - + {showIcon(type)} From f6d88ace69d509332375e774eece85e72ee50516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leandro=20Ant=C3=B4nio=20Farias=20Machado?= <83298718+leandrofars@users.noreply.github.com> Date: Sun, 14 Apr 2024 13:23:44 -0300 Subject: [PATCH 4/4] docs(readme): dashboard ui image --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 009ce85..cb05965 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,9 @@ Run app using Docker: user@user-laptop:~$ cd oktopus/deploy/compose user@user-laptop:~/oktopus/deploy/compose$ COMPOSE_PROFILES=nats,controller,mqtt,stomp,ws,adapter,frontend,portainer docker compose up -d + UI will open at port 3000: + +
  • Device test agent (obuspa):