mirror of
https://github.com/openziti/zrok.git
synced 2025-06-25 20:22:45 +02:00
prevent sparklines handler crashing when no configured metrics subsystem (#905)
This commit is contained in:
parent
9c7cb65213
commit
6361a3ced3
@ -70,7 +70,7 @@ func Run(inCfg *config.Config) error {
|
||||
api.MetadataConfigurationHandler = newConfigurationHandler(cfg)
|
||||
api.MetadataClientVersionCheckHandler = metadata.ClientVersionCheckHandlerFunc(clientVersionCheckHandler)
|
||||
api.MetadataGetAccountDetailHandler = newAccountDetailHandler()
|
||||
api.MetadataGetSparklinesHandler = newSparklinesHandler()
|
||||
api.MetadataGetSparklinesHandler = newSparklinesHandler(cfg)
|
||||
if cfg.Metrics != nil && cfg.Metrics.Influx != nil {
|
||||
api.MetadataGetAccountMetricsHandler = newGetAccountMetricsHandler(cfg.Metrics.Influx)
|
||||
api.MetadataGetEnvironmentMetricsHandler = newGetEnvironmentMetricsHandler(cfg.Metrics.Influx)
|
||||
|
@ -2,6 +2,7 @@ package controller
|
||||
|
||||
import (
|
||||
"github.com/go-openapi/runtime/middleware"
|
||||
"github.com/openziti/zrok/controller/config"
|
||||
"github.com/openziti/zrok/controller/store"
|
||||
"github.com/openziti/zrok/rest_model_zrok"
|
||||
"github.com/openziti/zrok/rest_server_zrok/operations/metadata"
|
||||
@ -10,96 +11,99 @@ import (
|
||||
)
|
||||
|
||||
type sparklinesHandler struct {
|
||||
cfg *config.Config
|
||||
}
|
||||
|
||||
func newSparklinesHandler() *sparklinesHandler {
|
||||
return &sparklinesHandler{}
|
||||
func newSparklinesHandler(cfg *config.Config) *sparklinesHandler {
|
||||
return &sparklinesHandler{cfg: cfg}
|
||||
}
|
||||
|
||||
func (h *sparklinesHandler) Handle(params metadata.GetSparklinesParams, principal *rest_model_zrok.Principal) middleware.Responder {
|
||||
trx, err := str.Begin()
|
||||
if err != nil {
|
||||
logrus.Errorf("error beginning transaction: %v", err)
|
||||
return metadata.NewGetSparklinesInternalServerError()
|
||||
}
|
||||
defer func() { _ = trx.Rollback() }()
|
||||
|
||||
out := &metadata.GetSparklinesOKBody{}
|
||||
|
||||
if len(params.Body.Environments) > 0 {
|
||||
if envs, err := str.FindEnvironmentsForAccount(int(principal.ID), trx); err == nil {
|
||||
var selectedEnvs []*store.Environment
|
||||
selectedEnvsIdIdx := make(map[int]*store.Environment)
|
||||
for _, envZId := range params.Body.Environments {
|
||||
if idx := slices.IndexFunc(envs, func(env *store.Environment) bool { return env.ZId == envZId }); idx > -1 {
|
||||
selectedEnvs = append(selectedEnvs, envs[idx])
|
||||
selectedEnvsIdIdx[envs[idx].Id] = envs[idx]
|
||||
} else {
|
||||
logrus.Warnf("requested sparkdata for environment '%v' not owned by '%v'", envZId, principal.Email)
|
||||
}
|
||||
}
|
||||
envsRxSparkdata, envsTxSparkdata, err := sparkDataForEnvironments(selectedEnvs)
|
||||
if err != nil {
|
||||
logrus.Errorf("error getting sparkdata for selected environments for '%v': %v", principal.Email, err)
|
||||
return metadata.NewGetSparklinesInternalServerError()
|
||||
}
|
||||
for envId, rx := range envsRxSparkdata {
|
||||
tx := envsTxSparkdata[envId]
|
||||
forEnv := selectedEnvsIdIdx[envId]
|
||||
|
||||
var samples []*rest_model_zrok.MetricsSample
|
||||
for i := 0; i < len(rx) && i < len(tx); i++ {
|
||||
samples = append(samples, &rest_model_zrok.MetricsSample{
|
||||
Rx: float64(rx[i]),
|
||||
Tx: float64(tx[i]),
|
||||
})
|
||||
}
|
||||
out.Sparklines = append(out.Sparklines, &rest_model_zrok.Metrics{
|
||||
Scope: "environment",
|
||||
ID: forEnv.ZId,
|
||||
Samples: samples,
|
||||
})
|
||||
}
|
||||
} else {
|
||||
logrus.Errorf("error finding environments for '%v': %v", principal.Email, err)
|
||||
if h.cfg.Metrics != nil && h.cfg.Metrics.Influx != nil {
|
||||
trx, err := str.Begin()
|
||||
if err != nil {
|
||||
logrus.Errorf("error beginning transaction: %v", err)
|
||||
return metadata.NewGetSparklinesInternalServerError()
|
||||
}
|
||||
}
|
||||
defer func() { _ = trx.Rollback() }()
|
||||
|
||||
if len(params.Body.Shares) > 0 {
|
||||
if shrs, err := str.FindAllSharesForAccount(int(principal.ID), trx); err == nil {
|
||||
var selectedShares []*store.Share
|
||||
for _, selectedShareToken := range params.Body.Shares {
|
||||
if idx := slices.IndexFunc(shrs, func(shr *store.Share) bool { return shr.Token == selectedShareToken }); idx > -1 {
|
||||
selectedShares = append(selectedShares, shrs[idx])
|
||||
} else {
|
||||
logrus.Warnf("requested sparkdata for share '%v' not owned by '%v'", selectedShareToken, principal.Email)
|
||||
if len(params.Body.Environments) > 0 {
|
||||
if envs, err := str.FindEnvironmentsForAccount(int(principal.ID), trx); err == nil {
|
||||
var selectedEnvs []*store.Environment
|
||||
selectedEnvsIdIdx := make(map[int]*store.Environment)
|
||||
for _, envZId := range params.Body.Environments {
|
||||
if idx := slices.IndexFunc(envs, func(env *store.Environment) bool { return env.ZId == envZId }); idx > -1 {
|
||||
selectedEnvs = append(selectedEnvs, envs[idx])
|
||||
selectedEnvsIdIdx[envs[idx].Id] = envs[idx]
|
||||
} else {
|
||||
logrus.Warnf("requested sparkdata for environment '%v' not owned by '%v'", envZId, principal.Email)
|
||||
}
|
||||
}
|
||||
}
|
||||
shrsRxSparkdata, shrsTxSparkdata, err := sparkDataForShares(selectedShares)
|
||||
if err != nil {
|
||||
logrus.Errorf("error getting sparkdata for selected shares for '%v': %v", principal.Email, err)
|
||||
return metadata.NewGetSparklinesInternalServerError()
|
||||
}
|
||||
for shrToken, rx := range shrsRxSparkdata {
|
||||
tx := shrsTxSparkdata[shrToken]
|
||||
envsRxSparkdata, envsTxSparkdata, err := sparkDataForEnvironments(selectedEnvs)
|
||||
if err != nil {
|
||||
logrus.Errorf("error getting sparkdata for selected environments for '%v': %v", principal.Email, err)
|
||||
return metadata.NewGetSparklinesInternalServerError()
|
||||
}
|
||||
for envId, rx := range envsRxSparkdata {
|
||||
tx := envsTxSparkdata[envId]
|
||||
forEnv := selectedEnvsIdIdx[envId]
|
||||
|
||||
var samples []*rest_model_zrok.MetricsSample
|
||||
for i := 0; i < len(rx) && i < len(tx); i++ {
|
||||
samples = append(samples, &rest_model_zrok.MetricsSample{
|
||||
Rx: float64(rx[i]),
|
||||
Tx: float64(tx[i]),
|
||||
var samples []*rest_model_zrok.MetricsSample
|
||||
for i := 0; i < len(rx) && i < len(tx); i++ {
|
||||
samples = append(samples, &rest_model_zrok.MetricsSample{
|
||||
Rx: float64(rx[i]),
|
||||
Tx: float64(tx[i]),
|
||||
})
|
||||
}
|
||||
out.Sparklines = append(out.Sparklines, &rest_model_zrok.Metrics{
|
||||
Scope: "environment",
|
||||
ID: forEnv.ZId,
|
||||
Samples: samples,
|
||||
})
|
||||
}
|
||||
out.Sparklines = append(out.Sparklines, &rest_model_zrok.Metrics{
|
||||
Scope: "share",
|
||||
ID: shrToken,
|
||||
Samples: samples,
|
||||
})
|
||||
} else {
|
||||
logrus.Errorf("error finding environments for '%v': %v", principal.Email, err)
|
||||
return metadata.NewGetSparklinesInternalServerError()
|
||||
}
|
||||
}
|
||||
|
||||
if len(params.Body.Shares) > 0 {
|
||||
if shrs, err := str.FindAllSharesForAccount(int(principal.ID), trx); err == nil {
|
||||
var selectedShares []*store.Share
|
||||
for _, selectedShareToken := range params.Body.Shares {
|
||||
if idx := slices.IndexFunc(shrs, func(shr *store.Share) bool { return shr.Token == selectedShareToken }); idx > -1 {
|
||||
selectedShares = append(selectedShares, shrs[idx])
|
||||
} else {
|
||||
logrus.Warnf("requested sparkdata for share '%v' not owned by '%v'", selectedShareToken, principal.Email)
|
||||
}
|
||||
}
|
||||
shrsRxSparkdata, shrsTxSparkdata, err := sparkDataForShares(selectedShares)
|
||||
if err != nil {
|
||||
logrus.Errorf("error getting sparkdata for selected shares for '%v': %v", principal.Email, err)
|
||||
return metadata.NewGetSparklinesInternalServerError()
|
||||
}
|
||||
for shrToken, rx := range shrsRxSparkdata {
|
||||
tx := shrsTxSparkdata[shrToken]
|
||||
|
||||
var samples []*rest_model_zrok.MetricsSample
|
||||
for i := 0; i < len(rx) && i < len(tx); i++ {
|
||||
samples = append(samples, &rest_model_zrok.MetricsSample{
|
||||
Rx: float64(rx[i]),
|
||||
Tx: float64(tx[i]),
|
||||
})
|
||||
}
|
||||
out.Sparklines = append(out.Sparklines, &rest_model_zrok.Metrics{
|
||||
Scope: "share",
|
||||
ID: shrToken,
|
||||
Samples: samples,
|
||||
})
|
||||
}
|
||||
} else {
|
||||
logrus.Errorf("error finding shares for '%v': %v", principal.Email, err)
|
||||
return metadata.NewGetSparklinesInternalServerError()
|
||||
}
|
||||
} else {
|
||||
logrus.Errorf("error finding shares for '%v': %v", principal.Email, err)
|
||||
return metadata.NewGetSparklinesInternalServerError()
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user