mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-13 22:35:53 +08:00
feat: add flag to switch to span metrics for service level latency metrics (#3134)
This commit is contained in:
parent
206e8b8dc3
commit
433f930956
@ -15,13 +15,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type APIHandlerOptions struct {
|
type APIHandlerOptions struct {
|
||||||
DataConnector interfaces.DataConnector
|
DataConnector interfaces.DataConnector
|
||||||
SkipConfig *basemodel.SkipConfig
|
SkipConfig *basemodel.SkipConfig
|
||||||
PreferDelta bool
|
PreferDelta bool
|
||||||
AppDao dao.ModelDao
|
PreferSpanMetrics bool
|
||||||
RulesManager *rules.Manager
|
AppDao dao.ModelDao
|
||||||
FeatureFlags baseint.FeatureLookup
|
RulesManager *rules.Manager
|
||||||
LicenseManager *license.Manager
|
FeatureFlags baseint.FeatureLookup
|
||||||
|
LicenseManager *license.Manager
|
||||||
}
|
}
|
||||||
|
|
||||||
type APIHandler struct {
|
type APIHandler struct {
|
||||||
@ -33,12 +34,13 @@ type APIHandler struct {
|
|||||||
func NewAPIHandler(opts APIHandlerOptions) (*APIHandler, error) {
|
func NewAPIHandler(opts APIHandlerOptions) (*APIHandler, error) {
|
||||||
|
|
||||||
baseHandler, err := baseapp.NewAPIHandler(baseapp.APIHandlerOpts{
|
baseHandler, err := baseapp.NewAPIHandler(baseapp.APIHandlerOpts{
|
||||||
Reader: opts.DataConnector,
|
Reader: opts.DataConnector,
|
||||||
SkipConfig: opts.SkipConfig,
|
SkipConfig: opts.SkipConfig,
|
||||||
PerferDelta: opts.PreferDelta,
|
PerferDelta: opts.PreferDelta,
|
||||||
AppDao: opts.AppDao,
|
PreferSpanMetrics: opts.PreferSpanMetrics,
|
||||||
RuleManager: opts.RulesManager,
|
AppDao: opts.AppDao,
|
||||||
FeatureFlags: opts.FeatureFlags})
|
RuleManager: opts.RulesManager,
|
||||||
|
FeatureFlags: opts.FeatureFlags})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
basemodel "go.signoz.io/signoz/pkg/query-service/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (ah *APIHandler) getFeatureFlags(w http.ResponseWriter, r *http.Request) {
|
func (ah *APIHandler) getFeatureFlags(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -10,5 +12,13 @@ func (ah *APIHandler) getFeatureFlags(w http.ResponseWriter, r *http.Request) {
|
|||||||
ah.HandleError(w, err, http.StatusInternalServerError)
|
ah.HandleError(w, err, http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if ah.opts.PreferSpanMetrics {
|
||||||
|
for idx := range featureSet {
|
||||||
|
feature := &featureSet[idx]
|
||||||
|
if feature.Name == basemodel.UseSpanMetrics {
|
||||||
|
featureSet[idx].Active = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
ah.Respond(w, featureSet)
|
ah.Respond(w, featureSet)
|
||||||
}
|
}
|
||||||
|
@ -54,9 +54,10 @@ type ServerOptions struct {
|
|||||||
HTTPHostPort string
|
HTTPHostPort string
|
||||||
PrivateHostPort string
|
PrivateHostPort string
|
||||||
// alert specific params
|
// alert specific params
|
||||||
DisableRules bool
|
DisableRules bool
|
||||||
RuleRepoURL string
|
RuleRepoURL string
|
||||||
PreferDelta bool
|
PreferDelta bool
|
||||||
|
PreferSpanMetrics bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Server runs HTTP api service
|
// Server runs HTTP api service
|
||||||
@ -169,13 +170,14 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
|||||||
telemetry.GetInstance().SetReader(reader)
|
telemetry.GetInstance().SetReader(reader)
|
||||||
|
|
||||||
apiOpts := api.APIHandlerOptions{
|
apiOpts := api.APIHandlerOptions{
|
||||||
DataConnector: reader,
|
DataConnector: reader,
|
||||||
SkipConfig: skipConfig,
|
SkipConfig: skipConfig,
|
||||||
PreferDelta: serverOptions.PreferDelta,
|
PreferDelta: serverOptions.PreferDelta,
|
||||||
AppDao: modelDao,
|
PreferSpanMetrics: serverOptions.PreferSpanMetrics,
|
||||||
RulesManager: rm,
|
AppDao: modelDao,
|
||||||
FeatureFlags: lm,
|
RulesManager: rm,
|
||||||
LicenseManager: lm,
|
FeatureFlags: lm,
|
||||||
|
LicenseManager: lm,
|
||||||
}
|
}
|
||||||
|
|
||||||
apiHandler, err := api.NewAPIHandler(apiOpts)
|
apiHandler, err := api.NewAPIHandler(apiOpts)
|
||||||
|
@ -84,11 +84,13 @@ func main() {
|
|||||||
|
|
||||||
var enableQueryServiceLogOTLPExport bool
|
var enableQueryServiceLogOTLPExport bool
|
||||||
var preferDelta bool
|
var preferDelta bool
|
||||||
|
var preferSpanMetrics bool
|
||||||
|
|
||||||
flag.StringVar(&promConfigPath, "config", "./config/prometheus.yml", "(prometheus config to read metrics)")
|
flag.StringVar(&promConfigPath, "config", "./config/prometheus.yml", "(prometheus config to read metrics)")
|
||||||
flag.StringVar(&skipTopLvlOpsPath, "skip-top-level-ops", "", "(config file to skip top level operations)")
|
flag.StringVar(&skipTopLvlOpsPath, "skip-top-level-ops", "", "(config file to skip top level operations)")
|
||||||
flag.BoolVar(&disableRules, "rules.disable", false, "(disable rule evaluation)")
|
flag.BoolVar(&disableRules, "rules.disable", false, "(disable rule evaluation)")
|
||||||
flag.BoolVar(&preferDelta, "prefer-delta", false, "(prefer delta over raw metrics)")
|
flag.BoolVar(&preferDelta, "prefer-delta", false, "(prefer delta over cumulative metrics)")
|
||||||
|
flag.BoolVar(&preferSpanMetrics, "prefer-span-metrics", false, "(prefer span metrics for service level metrics)")
|
||||||
flag.StringVar(&ruleRepoURL, "rules.repo-url", baseconst.AlertHelpPage, "(host address used to build rule link in alert messages)")
|
flag.StringVar(&ruleRepoURL, "rules.repo-url", baseconst.AlertHelpPage, "(host address used to build rule link in alert messages)")
|
||||||
flag.BoolVar(&enableQueryServiceLogOTLPExport, "enable.query.service.log.otlp.export", false, "(enable query service log otlp export)")
|
flag.BoolVar(&enableQueryServiceLogOTLPExport, "enable.query.service.log.otlp.export", false, "(enable query service log otlp export)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
@ -105,6 +107,7 @@ func main() {
|
|||||||
PromConfigPath: promConfigPath,
|
PromConfigPath: promConfigPath,
|
||||||
SkipTopLvlOpsPath: skipTopLvlOpsPath,
|
SkipTopLvlOpsPath: skipTopLvlOpsPath,
|
||||||
PreferDelta: preferDelta,
|
PreferDelta: preferDelta,
|
||||||
|
PreferSpanMetrics: preferSpanMetrics,
|
||||||
PrivateHostPort: baseconst.PrivateHostPort,
|
PrivateHostPort: baseconst.PrivateHostPort,
|
||||||
DisableRules: disableRules,
|
DisableRules: disableRules,
|
||||||
RuleRepoURL: ruleRepoURL,
|
RuleRepoURL: ruleRepoURL,
|
||||||
|
@ -60,6 +60,13 @@ var BasicPlan = basemodel.FeatureSet{
|
|||||||
UsageLimit: 5,
|
UsageLimit: 5,
|
||||||
Route: "",
|
Route: "",
|
||||||
},
|
},
|
||||||
|
basemodel.Feature{
|
||||||
|
Name: basemodel.UseSpanMetrics,
|
||||||
|
Active: false,
|
||||||
|
Usage: 0,
|
||||||
|
UsageLimit: -1,
|
||||||
|
Route: "",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var ProPlan = basemodel.FeatureSet{
|
var ProPlan = basemodel.FeatureSet{
|
||||||
@ -105,6 +112,13 @@ var ProPlan = basemodel.FeatureSet{
|
|||||||
UsageLimit: -1,
|
UsageLimit: -1,
|
||||||
Route: "",
|
Route: "",
|
||||||
},
|
},
|
||||||
|
basemodel.Feature{
|
||||||
|
Name: basemodel.UseSpanMetrics,
|
||||||
|
Active: false,
|
||||||
|
Usage: 0,
|
||||||
|
UsageLimit: -1,
|
||||||
|
Route: "",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var EnterprisePlan = basemodel.FeatureSet{
|
var EnterprisePlan = basemodel.FeatureSet{
|
||||||
@ -150,4 +164,11 @@ var EnterprisePlan = basemodel.FeatureSet{
|
|||||||
UsageLimit: -1,
|
UsageLimit: -1,
|
||||||
Route: "",
|
Route: "",
|
||||||
},
|
},
|
||||||
|
basemodel.Feature{
|
||||||
|
Name: basemodel.UseSpanMetrics,
|
||||||
|
Active: false,
|
||||||
|
Usage: 0,
|
||||||
|
UsageLimit: -1,
|
||||||
|
Route: "",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
@ -61,17 +61,18 @@ func NewRouter() *mux.Router {
|
|||||||
type APIHandler struct {
|
type APIHandler struct {
|
||||||
// queryService *querysvc.QueryService
|
// queryService *querysvc.QueryService
|
||||||
// queryParser queryParser
|
// queryParser queryParser
|
||||||
basePath string
|
basePath string
|
||||||
apiPrefix string
|
apiPrefix string
|
||||||
reader interfaces.Reader
|
reader interfaces.Reader
|
||||||
skipConfig *model.SkipConfig
|
skipConfig *model.SkipConfig
|
||||||
appDao dao.ModelDao
|
appDao dao.ModelDao
|
||||||
alertManager am.Manager
|
alertManager am.Manager
|
||||||
ruleManager *rules.Manager
|
ruleManager *rules.Manager
|
||||||
featureFlags interfaces.FeatureLookup
|
featureFlags interfaces.FeatureLookup
|
||||||
ready func(http.HandlerFunc) http.HandlerFunc
|
ready func(http.HandlerFunc) http.HandlerFunc
|
||||||
queryBuilder *queryBuilder.QueryBuilder
|
queryBuilder *queryBuilder.QueryBuilder
|
||||||
preferDelta bool
|
preferDelta bool
|
||||||
|
preferSpanMetrics bool
|
||||||
|
|
||||||
// SetupCompleted indicates if SigNoz is ready for general use.
|
// SetupCompleted indicates if SigNoz is ready for general use.
|
||||||
// at the moment, we mark the app ready when the first user
|
// at the moment, we mark the app ready when the first user
|
||||||
@ -86,7 +87,8 @@ type APIHandlerOpts struct {
|
|||||||
|
|
||||||
SkipConfig *model.SkipConfig
|
SkipConfig *model.SkipConfig
|
||||||
|
|
||||||
PerferDelta bool
|
PerferDelta bool
|
||||||
|
PreferSpanMetrics bool
|
||||||
// dao layer to perform crud on app objects like dashboard, alerts etc
|
// dao layer to perform crud on app objects like dashboard, alerts etc
|
||||||
AppDao dao.ModelDao
|
AppDao dao.ModelDao
|
||||||
|
|
||||||
@ -106,13 +108,14 @@ func NewAPIHandler(opts APIHandlerOpts) (*APIHandler, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
aH := &APIHandler{
|
aH := &APIHandler{
|
||||||
reader: opts.Reader,
|
reader: opts.Reader,
|
||||||
appDao: opts.AppDao,
|
appDao: opts.AppDao,
|
||||||
skipConfig: opts.SkipConfig,
|
skipConfig: opts.SkipConfig,
|
||||||
preferDelta: opts.PerferDelta,
|
preferDelta: opts.PerferDelta,
|
||||||
alertManager: alertManager,
|
preferSpanMetrics: opts.PreferSpanMetrics,
|
||||||
ruleManager: opts.RuleManager,
|
alertManager: alertManager,
|
||||||
featureFlags: opts.FeatureFlags,
|
ruleManager: opts.RuleManager,
|
||||||
|
featureFlags: opts.FeatureFlags,
|
||||||
}
|
}
|
||||||
|
|
||||||
builderOpts := queryBuilder.QueryBuilderOptions{
|
builderOpts := queryBuilder.QueryBuilderOptions{
|
||||||
@ -1668,6 +1671,14 @@ func (aH *APIHandler) getFeatureFlags(w http.ResponseWriter, r *http.Request) {
|
|||||||
aH.HandleError(w, err, http.StatusInternalServerError)
|
aH.HandleError(w, err, http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if aH.preferSpanMetrics {
|
||||||
|
for idx := range featureSet {
|
||||||
|
feature := &featureSet[idx]
|
||||||
|
if feature.Name == model.UseSpanMetrics {
|
||||||
|
featureSet[idx].Active = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
aH.Respond(w, featureSet)
|
aH.Respond(w, featureSet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,9 +46,10 @@ type ServerOptions struct {
|
|||||||
HTTPHostPort string
|
HTTPHostPort string
|
||||||
PrivateHostPort string
|
PrivateHostPort string
|
||||||
// alert specific params
|
// alert specific params
|
||||||
DisableRules bool
|
DisableRules bool
|
||||||
RuleRepoURL string
|
RuleRepoURL string
|
||||||
PreferDelta bool
|
PreferDelta bool
|
||||||
|
PreferSpanMetrics bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Server runs HTTP, Mux and a grpc server
|
// Server runs HTTP, Mux and a grpc server
|
||||||
@ -124,12 +125,13 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
|
|||||||
|
|
||||||
telemetry.GetInstance().SetReader(reader)
|
telemetry.GetInstance().SetReader(reader)
|
||||||
apiHandler, err := NewAPIHandler(APIHandlerOpts{
|
apiHandler, err := NewAPIHandler(APIHandlerOpts{
|
||||||
Reader: reader,
|
Reader: reader,
|
||||||
SkipConfig: skipConfig,
|
SkipConfig: skipConfig,
|
||||||
PerferDelta: serverOptions.PreferDelta,
|
PerferDelta: serverOptions.PreferDelta,
|
||||||
AppDao: dao.DB(),
|
PreferSpanMetrics: serverOptions.PreferSpanMetrics,
|
||||||
RuleManager: rm,
|
AppDao: dao.DB(),
|
||||||
FeatureFlags: fm,
|
RuleManager: rm,
|
||||||
|
FeatureFlags: fm,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -87,6 +87,13 @@ var DEFAULT_FEATURE_SET = model.FeatureSet{
|
|||||||
UsageLimit: -1,
|
UsageLimit: -1,
|
||||||
Route: "",
|
Route: "",
|
||||||
},
|
},
|
||||||
|
model.Feature{
|
||||||
|
Name: model.UseSpanMetrics,
|
||||||
|
Active: false,
|
||||||
|
Usage: 0,
|
||||||
|
UsageLimit: -1,
|
||||||
|
Route: "",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetContextTimeout() time.Duration {
|
func GetContextTimeout() time.Duration {
|
||||||
|
@ -35,11 +35,13 @@ func main() {
|
|||||||
var ruleRepoURL string
|
var ruleRepoURL string
|
||||||
|
|
||||||
var preferDelta bool
|
var preferDelta bool
|
||||||
|
var preferSpanMetrics bool
|
||||||
|
|
||||||
flag.StringVar(&promConfigPath, "config", "./config/prometheus.yml", "(prometheus config to read metrics)")
|
flag.StringVar(&promConfigPath, "config", "./config/prometheus.yml", "(prometheus config to read metrics)")
|
||||||
flag.StringVar(&skipTopLvlOpsPath, "skip-top-level-ops", "", "(config file to skip top level operations)")
|
flag.StringVar(&skipTopLvlOpsPath, "skip-top-level-ops", "", "(config file to skip top level operations)")
|
||||||
flag.BoolVar(&disableRules, "rules.disable", false, "(disable rule evaluation)")
|
flag.BoolVar(&disableRules, "rules.disable", false, "(disable rule evaluation)")
|
||||||
flag.BoolVar(&preferDelta, "prefer-delta", false, "(prefer delta over gauge)")
|
flag.BoolVar(&preferDelta, "prefer-delta", false, "(prefer delta over cumulative metrics)")
|
||||||
|
flag.BoolVar(&preferSpanMetrics, "prefer-span-metrics", false, "(prefer span metrics for service level metrics)")
|
||||||
flag.StringVar(&ruleRepoURL, "rules.repo-url", constants.AlertHelpPage, "(host address used to build rule link in alert messages)")
|
flag.StringVar(&ruleRepoURL, "rules.repo-url", constants.AlertHelpPage, "(host address used to build rule link in alert messages)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
@ -55,6 +57,7 @@ func main() {
|
|||||||
PromConfigPath: promConfigPath,
|
PromConfigPath: promConfigPath,
|
||||||
SkipTopLvlOpsPath: skipTopLvlOpsPath,
|
SkipTopLvlOpsPath: skipTopLvlOpsPath,
|
||||||
PreferDelta: preferDelta,
|
PreferDelta: preferDelta,
|
||||||
|
PreferSpanMetrics: preferSpanMetrics,
|
||||||
PrivateHostPort: constants.PrivateHostPort,
|
PrivateHostPort: constants.PrivateHostPort,
|
||||||
DisableRules: disableRules,
|
DisableRules: disableRules,
|
||||||
RuleRepoURL: ruleRepoURL,
|
RuleRepoURL: ruleRepoURL,
|
||||||
|
@ -14,3 +14,4 @@ const CustomMetricsFunction = "CUSTOM_METRICS_FUNCTION"
|
|||||||
const OSS = "OSS"
|
const OSS = "OSS"
|
||||||
const QueryBuilderPanels = "QUERY_BUILDER_PANELS"
|
const QueryBuilderPanels = "QUERY_BUILDER_PANELS"
|
||||||
const QueryBuilderAlerts = "QUERY_BUILDER_ALERTS"
|
const QueryBuilderAlerts = "QUERY_BUILDER_ALERTS"
|
||||||
|
const UseSpanMetrics = "USE_SPAN_METRICS"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user