diff --git a/documentation/api/metricsAPI.yml b/documentation/api/metricsAPI.yml index 17175bf..dfa75be 100644 --- a/documentation/api/metricsAPI.yml +++ b/documentation/api/metricsAPI.yml @@ -234,6 +234,9 @@ "string", "null" ] + }, + "value": { + "type": "number" } } } diff --git a/metrics-service/handlers/sensor_handler.go b/metrics-service/handlers/sensor_handler.go index 46ac0c1..eb98c4f 100644 --- a/metrics-service/handlers/sensor_handler.go +++ b/metrics-service/handlers/sensor_handler.go @@ -4,6 +4,7 @@ import ( "fmt" "metrics-service/models" "metrics-service/services" + "strconv" "github.com/gin-gonic/gin" ) @@ -21,7 +22,7 @@ func NewSensorHandler(victoriaMetricsService *services.VictoriaMetricsService) * func (handler *SensorHandler) GetSensorStatus(context *gin.Context) { sensorID := context.Param("sensorId") - query := fmt.Sprintf(`timestamp(temperature_celsius{device_id="%s"}[31d])`, sensorID) + query := fmt.Sprintf(`last_over_time(temperature_celsius{device_id="%s"}[31d])`, sensorID) var response models.VictoriaMetricsResponse if queryError := handler.victoriaMetricsService.QueryStruct(query, &response); queryError != nil { @@ -32,11 +33,20 @@ func (handler *SensorHandler) GetSensorStatus(context *gin.Context) { formattedResponse := models.SensorStatusResponse{ DeviceID: sensorID, LastSeen: nil, + Value: 0, } if len(response.Data.Result) > 0 && len(response.Data.Result[0].Value) > 1 { - if lastSeenUnixStr, ok := response.Data.Result[0].Value[1].(string); ok { - formattedResponse.LastSeen = lastSeenUnixStr + if valueString, ok := response.Data.Result[0].Value[1].(string); ok { + if floatValue, err := strconv.ParseFloat(valueString, 64); err == nil { + formattedResponse.Value = floatValue + } + } else if floatValue, ok := response.Data.Result[0].Value[1].(float64); ok { + formattedResponse.Value = floatValue + } + + if timestampFloat, ok := response.Data.Result[0].Value[0].(float64); ok { + formattedResponse.LastSeen = fmt.Sprintf("%d", int64(timestampFloat)) } } diff --git a/metrics-service/models/models.go b/metrics-service/models/models.go index 9a9e30e..bf49ac7 100644 --- a/metrics-service/models/models.go +++ b/metrics-service/models/models.go @@ -20,6 +20,7 @@ type SensorStatusResponse struct { Status string `json:"status"` DeviceID string `json:"device_id"` LastSeen interface{} `json:"last_seen"` + Value float64 `json:"value"` } type VictoriaMetricsResponse struct { diff --git a/metrics-service/tests/helpers_test.go b/metrics-service/tests/helpers_test.go index 2c9710c..0e52983 100644 --- a/metrics-service/tests/helpers_test.go +++ b/metrics-service/tests/helpers_test.go @@ -53,15 +53,18 @@ func setupMockVMServer(status int, body string) *httptest.Server { } func vmJSON(val string) string { + if val == "" { + return `{"status":"success","data":{"resultType":"vector","result":[]}}` + } return `{"data":{"result":[{"value":[1704067200,"` + val + `"]}]}}` } func setup(testingState *testing.T, mockStatus int, mockBody string) (*testHelper, func()) { - mockVM := setupMockVMServer(mockStatus, mockBody) - helper := &testHelper{ - router: setupTestRouter(mockVM.URL), - t: testingState, - } - - return helper, func() { mockVM.Close() } -} \ No newline at end of file + mockVM := setupMockVMServer(mockStatus, mockBody) + helper := &testHelper{ + router: setupTestRouter(mockVM.URL), + t: testingState, + } + + return helper, func() { mockVM.Close() } +}