feat(BRIDGE-122): Observability support; type definitions, helper methods in fake server

This commit is contained in:
ElectroNafta
2024-08-27 11:27:20 +02:00
committed by ElectroNafta
parent dd607af0f9
commit ca6bb6449b
7 changed files with 94 additions and 11 deletions

13
observability.go Normal file
View File

@@ -0,0 +1,13 @@
package proton
import (
"context"
"github.com/go-resty/resty/v2"
)
func (c *Client) SendObservabilityBatch(ctx context.Context, req ObservabilityBatch) error {
return c.do(ctx, func(r *resty.Request) (*resty.Response, error) {
return r.SetHeader("Priority", "u=6").SetBody(req).Post("/data/v1/metrics")
})
}

12
observability_types.go Normal file
View File

@@ -0,0 +1,12 @@
package proton
type ObservabilityBatch struct {
Metrics []ObservabilityMetric `json:"Metrics"`
}
type ObservabilityMetric struct {
Name string `json:"Name"`
Version int `json:"Version"`
Timestamp int64 `json:"Timestamp"` // Unix timestamp
Data interface{} `json:"Data"`
}

View File

@@ -50,6 +50,8 @@ type unsafeBackend struct {
csTicket []string
featureFlags []proton.FeatureToggle
observabilityStatistics ObservabilityStatistics
}
func readBackendRet[T any](b *Backend, f func(b *unsafeBackend) T) T {
@@ -101,6 +103,7 @@ func New(authLife time.Duration, domain string, enableDedup bool) *Backend {
srp: make(map[string]*srp.Server),
authLife: authLife,
enableDedup: enableDedup,
observabilityStatistics: NewObservabilityStatistics(),
},
}
}

View File

@@ -0,0 +1,32 @@
package backend
import (
"time"
"github.com/ProtonMail/go-proton-api"
)
type ObservabilityStatistics struct {
Metrics []proton.ObservabilityMetric
RequestTime []time.Time
}
func NewObservabilityStatistics() ObservabilityStatistics {
return ObservabilityStatistics{
Metrics: make([]proton.ObservabilityMetric, 0),
RequestTime: make([]time.Time, 0),
}
}
func (b *Backend) PushObservabilityMetrics(metrics []proton.ObservabilityMetric) {
writeBackend(b, func(b *unsafeBackend) {
b.observabilityStatistics.Metrics = append(b.observabilityStatistics.Metrics, metrics...)
b.observabilityStatistics.RequestTime = append(b.observabilityStatistics.RequestTime, time.Now())
})
}
func (b *Backend) GetObservabilityStatistics() ObservabilityStatistics {
return readBackendRet(b, func(b *unsafeBackend) ObservabilityStatistics {
return b.observabilityStatistics
})
}

View File

@@ -1,9 +1,10 @@
package server
import (
"net/http"
"github.com/ProtonMail/go-proton-api"
"github.com/gin-gonic/gin"
"net/http"
)
func (s *Server) handlePostDataStats() gin.HandlerFunc {
@@ -51,3 +52,19 @@ func (s *Server) handlePostDataStatsMultiple() gin.HandlerFunc {
func validateSendStatReq(req *proton.SendStatsReq) bool {
return req.MeasurementGroup != ""
}
func (s *Server) handleObservabilityPost() gin.HandlerFunc {
return func(c *gin.Context) {
var req proton.ObservabilityBatch
if err := c.BindJSON(&req); err != nil {
c.AbortWithStatus(http.StatusBadRequest)
return
}
s.b.PushObservabilityMetrics(req.Metrics)
c.JSON(http.StatusOK, gin.H{
"Code": proton.SuccessCode,
})
}
}

View File

@@ -129,6 +129,8 @@ func initRouter(s *Server) {
stats.POST("", s.handlePostDataStats())
stats.POST("/multiple", s.handlePostDataStatsMultiple())
}
// Observability endpoint
data.POST("/metrics", s.handleObservabilityPost())
}
// Top level auth routes don't need authentication.

View File

@@ -260,3 +260,7 @@ func (s *Server) PushFeatureFlag(flagName string) {
func (s *Server) DeleteFeatureFlags() {
s.b.DeleteFeatureFlags()
}
func (s *Server) GetObservabilityStatistics() backend.ObservabilityStatistics {
return s.b.GetObservabilityStatistics()
}