mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-04 20:10:41 +08:00
feat: dashboard metadata with no rateLimit
This commit is contained in:
parent
18bbb3cf36
commit
aad962d07d
@ -1,8 +1,11 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
_ "net/http/pprof" // http profiler
|
_ "net/http/pprof" // http profiler
|
||||||
@ -235,15 +238,62 @@ func (lrw *loggingResponseWriter) Flush() {
|
|||||||
lrw.ResponseWriter.(http.Flusher).Flush()
|
lrw.ResponseWriter.(http.Flusher).Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func extractDashboardMetaData(path string, r *http.Request) (map[string]interface{}, bool) {
|
||||||
|
pathToExtractBodyFrom := "/api/v2/metrics/query_range"
|
||||||
|
var requestBody map[string]interface{}
|
||||||
|
data := map[string]interface{}{}
|
||||||
|
|
||||||
|
if path == pathToExtractBodyFrom && (r.Method == "POST") {
|
||||||
|
bodyBytes, _ := ioutil.ReadAll(r.Body)
|
||||||
|
r.Body.Close() // must close
|
||||||
|
r.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
|
||||||
|
|
||||||
|
json.Unmarshal(bodyBytes, &requestBody)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
compositeMetricQuery, compositeMetricQueryExists := requestBody["compositeMetricQuery"]
|
||||||
|
compositeMetricQueryMap := compositeMetricQuery.(map[string]interface{})
|
||||||
|
if compositeMetricQueryExists {
|
||||||
|
queryType, queryTypeExists := compositeMetricQueryMap["queryType"]
|
||||||
|
if queryTypeExists {
|
||||||
|
data["queryType"] = queryType
|
||||||
|
}
|
||||||
|
panelType, panelTypeExists := compositeMetricQueryMap["panelType"]
|
||||||
|
if panelTypeExists {
|
||||||
|
data["panelType"] = panelType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
datasource, datasourceExists := requestBody["dataSource"]
|
||||||
|
if datasourceExists {
|
||||||
|
data["datasource"] = datasource
|
||||||
|
}
|
||||||
|
|
||||||
|
telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_DASHBOARDS_METADATA, data, false)
|
||||||
|
|
||||||
|
return data, true
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) analyticsMiddleware(next http.Handler) http.Handler {
|
func (s *Server) analyticsMiddleware(next http.Handler) http.Handler {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
route := mux.CurrentRoute(r)
|
route := mux.CurrentRoute(r)
|
||||||
path, _ := route.GetPathTemplate()
|
path, _ := route.GetPathTemplate()
|
||||||
|
|
||||||
|
dashboardMetadata, metadataExists := extractDashboardMetaData(path, r)
|
||||||
|
|
||||||
lrw := NewLoggingResponseWriter(w)
|
lrw := NewLoggingResponseWriter(w)
|
||||||
next.ServeHTTP(lrw, r)
|
next.ServeHTTP(lrw, r)
|
||||||
|
|
||||||
data := map[string]interface{}{"path": path, "statusCode": lrw.statusCode}
|
data := map[string]interface{}{"path": path, "statusCode": lrw.statusCode}
|
||||||
|
if metadataExists {
|
||||||
|
for key, value := range dashboardMetadata {
|
||||||
|
data[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if telemetry.GetInstance().IsSampled() {
|
if telemetry.GetInstance().IsSampled() {
|
||||||
if _, ok := telemetry.IgnoredPaths()[path]; !ok {
|
if _, ok := telemetry.IgnoredPaths()[path]; !ok {
|
||||||
telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_PATH, data)
|
telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_PATH, data)
|
||||||
|
@ -34,6 +34,7 @@ const (
|
|||||||
TELEMETRY_EVENT_LANGUAGE = "Language"
|
TELEMETRY_EVENT_LANGUAGE = "Language"
|
||||||
TELEMETRY_EVENT_LOGS_FILTERS = "Logs Filters"
|
TELEMETRY_EVENT_LOGS_FILTERS = "Logs Filters"
|
||||||
TELEMETRY_EVENT_DISTRIBUTED = "Distributed"
|
TELEMETRY_EVENT_DISTRIBUTED = "Distributed"
|
||||||
|
TELEMETRY_EVENT_DASHBOARDS_METADATA = "Dashboards Metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
const api_key = "4Gmoa4ixJAUHx2BpJxsjwA1bEfnwEeRz"
|
const api_key = "4Gmoa4ixJAUHx2BpJxsjwA1bEfnwEeRz"
|
||||||
@ -213,7 +214,12 @@ func (a *Telemetry) checkEvents(event string) bool {
|
|||||||
return sendEvent
|
return sendEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Telemetry) SendEvent(event string, data map[string]interface{}) {
|
func (a *Telemetry) SendEvent(event string, data map[string]interface{}, opts ...bool) {
|
||||||
|
|
||||||
|
rateLimitFlag := true
|
||||||
|
if len(opts) > 0 {
|
||||||
|
rateLimitFlag = opts[0]
|
||||||
|
}
|
||||||
|
|
||||||
if !a.isTelemetryEnabled() {
|
if !a.isTelemetryEnabled() {
|
||||||
return
|
return
|
||||||
@ -224,11 +230,13 @@ func (a *Telemetry) SendEvent(event string, data map[string]interface{}) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if rateLimitFlag {
|
||||||
if a.rateLimits[event] < RATE_LIMIT_VALUE {
|
if a.rateLimits[event] < RATE_LIMIT_VALUE {
|
||||||
a.rateLimits[event] += 1
|
a.rateLimits[event] += 1
|
||||||
} else {
|
} else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// zap.S().Info(data)
|
// zap.S().Info(data)
|
||||||
properties := analytics.NewProperties()
|
properties := analytics.NewProperties()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user