mirror of
https://github.com/ProtonMail/go-proton-api.git
synced 2025-12-23 23:57:50 -05:00
feat(BRIDGE-122): Observability support; type definitions, helper methods in fake server
This commit is contained in:
committed by
ElectroNafta
parent
dd607af0f9
commit
ca6bb6449b
13
observability.go
Normal file
13
observability.go
Normal 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
12
observability_types.go
Normal 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"`
|
||||
}
|
||||
@@ -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(),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
32
server/backend/observability.go
Normal file
32
server/backend/observability.go
Normal 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
|
||||
})
|
||||
}
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user