Openstatus www.openstatus.dev

๐Ÿ—ƒ๏ธ add id and status in TB (#1249)

* ๐Ÿ—ƒ๏ธ add id and status in TB

* ๐Ÿ—ƒ๏ธ add go mod

* ๐Ÿ˜‚ fix

authored by

Thibault Le Ouay and committed by
GitHub
b302a29a 29bbd02e

+87 -12
+1 -1
apps/checker/go.mod
··· 5 5 require ( 6 6 github.com/cenkalti/backoff/v4 v4.3.0 7 7 github.com/gin-gonic/gin v1.9.1 8 + github.com/google/uuid v1.6.0 8 9 github.com/rs/zerolog v1.32.0 9 10 github.com/stretchr/testify v1.10.0 10 11 go.opentelemetry.io/otel v1.34.0 ··· 27 28 github.com/go-playground/universal-translator v0.18.1 // indirect 28 29 github.com/go-playground/validator/v10 v10.19.0 // indirect 29 30 github.com/goccy/go-json v0.10.2 // indirect 30 - github.com/google/uuid v1.6.0 // indirect 31 31 github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect 32 32 github.com/json-iterator/go v1.1.12 // indirect 33 33 github.com/klauspost/cpuid/v2 v2.2.7 // indirect
+39 -2
apps/checker/handlers/checker.go
··· 8 8 9 9 "github.com/cenkalti/backoff/v4" 10 10 "github.com/gin-gonic/gin" 11 + "github.com/google/uuid" 11 12 "github.com/rs/zerolog/log" 12 13 13 14 "github.com/openstatushq/openstatus/apps/checker" ··· 23 24 } 24 25 25 26 type PingData struct { 27 + ID string `json:"id"` 26 28 WorkspaceID string `json:"workspaceId"` 27 29 MonitorID string `json:"monitorId"` 28 30 URL string `json:"url"` ··· 33 35 Assertions string `json:"assertions"` 34 36 Body string `json:"body,omitempty"` 35 37 Trigger string `json:"trigger,omitempty"` 38 + RequestStatus string `json:"requestStatus,omitempty"` 36 39 Latency int64 `json:"latency"` 37 40 CronTimestamp int64 `json:"cronTimestamp"` 38 41 Timestamp int64 `json:"timestamp"` ··· 109 112 headersAsString, err := json.Marshal(res.Headers) 110 113 if err != nil { 111 114 return fmt.Errorf("error while parsing headers %s: %w", req.URL, err) 115 + } 116 + 117 + id, err := uuid.NewV7() 118 + if err != nil { 119 + return fmt.Errorf("error while generating uuid %w", err) 120 + } 121 + 122 + var requestStatus = "" 123 + switch req.Status { 124 + case "active": 125 + requestStatus = "success" 126 + break 127 + case "error": 128 + requestStatus = "error" 129 + break 130 + case "degraded": 131 + requestStatus = "degraded" 132 + break 112 133 } 113 134 114 135 data := PingData{ 136 + ID: id.String(), 115 137 Latency: res.Latency, 116 138 StatusCode: res.Status, 117 139 MonitorID: req.MonitorID, ··· 124 146 Headers: string(headersAsString), 125 147 Body: string(res.Body), 126 148 Trigger: trigger, 149 + RequestStatus: requestStatus, 127 150 } 128 151 129 152 statusCode := statusCode(res.Status) ··· 209 232 CronTimestamp: req.CronTimestamp, 210 233 Latency: res.Latency, 211 234 }) 235 + data.RequestStatus = "error" 212 236 } 213 237 // it's degraded 214 238 if isSuccessfull && req.DegradedAfter > 0 && res.Latency > req.DegradedAfter && req.Status != "degraded" { ··· 220 244 CronTimestamp: req.CronTimestamp, 221 245 Latency: res.Latency, 222 246 }) 247 + data.RequestStatus = "degraded" 223 248 } 224 249 // it's active 225 250 if isSuccessfull && req.DegradedAfter == 0 && req.Status != "active" { ··· 231 256 CronTimestamp: req.CronTimestamp, 232 257 Latency: res.Latency, 233 258 }) 259 + data.RequestStatus = "success" 234 260 } 235 261 // it's active 236 262 if isSuccessfull && res.Latency < req.DegradedAfter && req.DegradedAfter != 0 && req.Status != "active" { ··· 241 267 StatusCode: res.Status, 242 268 CronTimestamp: req.CronTimestamp, 243 269 }) 270 + data.RequestStatus = "success" 244 271 } 245 272 246 273 if err := h.TbClient.SendEvent(ctx, data, dataSourceName); err != nil { ··· 251 278 } 252 279 253 280 if err := backoff.Retry(op, backoff.WithMaxRetries(backoff.NewExponentialBackOff(), 3)); err != nil { 254 - if err := h.TbClient.SendEvent(ctx, PingData{ 281 + id, e := uuid.NewV7() 282 + if e != nil { 283 + log.Ctx(ctx).Error().Err(e).Msg("failed to send event to tinybird") 284 + return 285 + } 286 + 287 + data := PingData{ 288 + ID: id.String(), 255 289 URL: req.URL, 256 290 Region: h.Region, 257 291 Message: err.Error(), ··· 263 297 Assertions: assertionAsString, 264 298 Body: "", 265 299 Trigger: trigger, 266 - }, dataSourceName); err != nil { 300 + RequestStatus: "error", 301 + } 302 + 303 + if err := h.TbClient.SendEvent(ctx, data, dataSourceName); err != nil { 267 304 log.Ctx(ctx).Error().Err(err).Msg("failed to send event to tinybird") 268 305 } 269 306
+47 -9
apps/checker/handlers/tcp.go
··· 9 9 10 10 "github.com/cenkalti/backoff/v4" 11 11 "github.com/gin-gonic/gin" 12 + "github.com/google/uuid" 12 13 "github.com/openstatushq/openstatus/apps/checker" 13 14 otelOS "github.com/openstatushq/openstatus/apps/checker/pkg/otel" 14 15 "github.com/openstatushq/openstatus/apps/checker/request" ··· 17 18 18 19 // Only used for Tinybird. 19 20 type TCPData struct { 20 - Timing string `json:"timing"` 21 - ErrorMessage string `json:"errorMessage"` 22 - Region string `json:"region"` 23 - Trigger string `json:"trigger"` 24 - URI string `json:"uri"` 21 + ID string `json:"id"` 22 + Timing string `json:"timing"` 23 + ErrorMessage string `json:"errorMessage"` 24 + Region string `json:"region"` 25 + Trigger string `json:"trigger"` 26 + URI string `json:"uri"` 27 + RequestStatus string `json:"requestStatus,omitempty"` 25 28 26 29 RequestId int64 `json:"requestId,omitempty"` 27 30 WorkspaceID int64 `json:"workspaceId"` ··· 102 105 103 106 latency := res.TCPDone - res.TCPStart 104 107 108 + var requestStatus = "" 109 + switch req.Status { 110 + case "active": 111 + requestStatus = "success" 112 + break 113 + case "error": 114 + requestStatus = "error" 115 + break 116 + case "degraded": 117 + requestStatus = "degraded" 118 + break 119 + } 120 + 121 + 122 + id, err := uuid.NewV7() 123 + if err != nil { 124 + return fmt.Errorf("error while generating uuid %w", err) 125 + } 126 + 105 127 data := TCPData{ 128 + ID: id.String(), 106 129 WorkspaceID: workspaceId, 107 130 Timestamp: res.TCPStart, 108 131 Error: 0, ··· 114 137 CronTimestamp: req.CronTimestamp, 115 138 Trigger: trigger, 116 139 URI: req.URI, 140 + RequestStatus: requestStatus, 117 141 } 118 142 119 143 response = checker.TCPResponse{ ··· 127 151 JobType: "tcp", 128 152 } 129 153 130 - if req.DegradedAfter == 0 && req.Status != "active" { 154 + if req.DegradedAfter == 0 && req.Status != "active" { 131 155 checker.UpdateStatus(ctx, checker.UpdateData{ 132 156 MonitorId: req.MonitorID, 133 157 Status: "active", ··· 135 159 CronTimestamp: req.CronTimestamp, 136 160 Latency: latency, 137 161 }) 162 + data.RequestStatus = "success" 138 163 } 139 164 140 165 if (req.DegradedAfter > 0 && latency < req.DegradedAfter) && req.Status != "active" { ··· 145 170 CronTimestamp: req.CronTimestamp, 146 171 Latency: latency, 147 172 }) 173 + data.RequestStatus = "success" 174 + 148 175 } 149 176 150 - if req.DegradedAfter > 0 && latency > req.DegradedAfter && req.Status != "degraded" { 177 + if req.DegradedAfter > 0 && latency > req.DegradedAfter && req.Status != "degraded" { 151 178 checker.UpdateStatus(ctx, checker.UpdateData{ 152 179 MonitorId: req.MonitorID, 153 180 Status: "degraded", ··· 155 182 CronTimestamp: req.CronTimestamp, 156 183 Latency: latency, 157 184 }) 185 + data.RequestStatus = "degraded" 186 + 158 187 } 159 188 160 189 if err := h.TbClient.SendEvent(ctx, data, dataSourceName); err != nil { ··· 165 194 } 166 195 167 196 if err := backoff.Retry(op, backoff.WithMaxRetries(backoff.NewExponentialBackOff(), 3)); err != nil { 168 - if err := h.TbClient.SendEvent(ctx, TCPData{ 197 + 198 + id, e := uuid.NewV7() 199 + if e != nil { 200 + log.Ctx(ctx).Error().Err(e).Msg("failed to send event to tinybird") 201 + return 202 + } 203 + data := TCPData{ 204 + ID: id.String(), 169 205 WorkspaceID: workspaceId, 170 206 CronTimestamp: req.CronTimestamp, 171 207 ErrorMessage: err.Error(), ··· 174 210 Error: 1, 175 211 Trigger: trigger, 176 212 URI: req.URI, 177 - }, dataSourceName); err != nil { 213 + RequestStatus: "error", 214 + } 215 + if err := h.TbClient.SendEvent(ctx, data, dataSourceName); err != nil { 178 216 log.Ctx(ctx).Error().Err(err).Msg("failed to send event to tinybird") 179 217 } 180 218 checker.UpdateStatus(ctx, checker.UpdateData{