Skip to content

Commit

Permalink
review fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrey Kolkov committed Mar 9, 2021
1 parent 4a94689 commit 4c07929
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 137 deletions.
25 changes: 16 additions & 9 deletions api/controller/trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,19 +166,26 @@ func SetTriggerMaintenance(database moira.Database, triggerID string, triggerMai
}

//PullTrigger returns raw trigger from database
func PullTrigger(database moira.Database, logger moira.Logger, triggerID string) (*moira.Trigger, *api.ErrorResponse) {
func GetTriggerDump(database moira.Database, logger moira.Logger, triggerID string) (*dto.TriggerDump, *api.ErrorResponse) {
trigger, err := support.HandlePullTrigger(logger, database, triggerID)
if err != nil {
return nil, api.ErrorInternalServer(err)
}
return trigger, nil
}

//PullTrigger returns raw trigger metrics from database
func PullTriggerMetrics(database moira.Database, logger moira.Logger, triggerID string) ([]support.PatternMetrics, *api.ErrorResponse) {
metrics, err := support.HandlePullTriggerMetrics(logger, database, triggerID)
if err != nil {
return nil, api.ErrorInternalServer(err)
metrics, errMetrics := support.HandlePullTriggerMetrics(logger, database, triggerID)
if errMetrics != nil {
return nil, api.ErrorInternalServer(errMetrics)
}
return metrics, nil

lastCheck, errLastCheck := GetTriggerLastCheck(database, triggerID)
if errLastCheck != nil {
return nil, errLastCheck
}

return &dto.TriggerDump{
Created: time.Now().UTC().String(),
LastCheck: *lastCheck.CheckData,
Trigger: *trigger,
Metrics: metrics,
}, nil
}
13 changes: 13 additions & 0 deletions api/dto/triggers.go
Original file line number Diff line number Diff line change
Expand Up @@ -384,3 +384,16 @@ type TriggerMetrics map[string]map[string][]moira.MetricValue
func (*TriggerMetrics) Render(w http.ResponseWriter, r *http.Request) error {
return nil
}

type PatternMetrics struct {
Pattern string `json:"pattern"`
Metrics map[string][]*moira.MetricValue `json:"metrics"`
Retentions map[string]int64 `json:"retention"`
}

type TriggerDump struct {
Created string `json:"created"`
LastCheck moira.CheckData `json:"last_check,omitempty"`
Trigger moira.Trigger `json:"trigger"`
Metrics []PatternMetrics `json:"metrics"`
}
25 changes: 3 additions & 22 deletions api/handler/trigger.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package handler

import (
"fmt"
"net/http"
"time"

Expand Down Expand Up @@ -149,30 +148,12 @@ func setTriggerMaintenance(writer http.ResponseWriter, request *http.Request) {

func triggerDump(writer http.ResponseWriter, request *http.Request) {
triggerID, log := prepareTriggerContext(request)
response := map[string]interface{}{}
errors := []string{}

if trigger, err := controller.PullTrigger(database, log, triggerID); err != nil {
errors = append(errors, fmt.Sprintf("get_trigger_error: %s", err.ErrorText))
} else {
response["trigger"] = trigger
}

if metrics, err := controller.PullTriggerMetrics(database, log, triggerID); err != nil {
errors = append(errors, fmt.Sprintf("get_metrics_error: %s", err.ErrorText))
} else {
response["metrics"] = metrics
}

if lastCheck, err := controller.GetTriggerLastCheck(database, triggerID); err != nil {
errors = append(errors, fmt.Sprintf("get_last_check_error: %s", err.ErrorText))
if dump, err := controller.GetTriggerDump(database, log, triggerID); err != nil {
render.Render(writer, request, err) //nolint
} else {
response["last_check"] = lastCheck.CheckData
render.JSON(writer, request, dump)
}

response["errors"] = errors
response["created"] = time.Now().UTC()
render.JSON(writer, request, response)
}

func prepareTriggerContext(request *http.Request) (triggerID string, log moira.Logger) {
Expand Down
104 changes: 8 additions & 96 deletions cmd/cli/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strings"

"github.com/moira-alert/moira"
"github.com/moira-alert/moira/api/dto"
"github.com/moira-alert/moira/cmd"
"github.com/moira-alert/moira/database/redis"
logging "github.com/moira-alert/moira/logging/zerolog_adapter"
Expand Down Expand Up @@ -51,14 +52,8 @@ var (
)

var (
pullTrigger = flag.String("pull-trigger", "", "Get trigger from redis and save it to file")
pullTriggerMetrics = flag.String("pull-trigger-metrics", "", "Get trigger patterns and metrics from redis and save it to file")
pushTrigger = flag.Bool("push-trigger", false, "Get trigger in JSON from file and save it to redis")
pushTriggerMetricsByID = flag.String("push-trigger-metrics", "", "Get trigger patterns and metrics in JSON from stdin and save it to redis")
pushTriggerDump = flag.Bool("push-trigger-dump", false, "Get trigger dump in JSON from stdin and save it to redis")
triggerFile = flag.String("trigger-file", "", "File that holds trigger JSON")
triggerMetricsFile = flag.String("trigger-metrics-file", "", "File that holds trigger metrics JSON")
triggerDumpFile = flag.String("trigger-dump-file", "", "File that holds trigger dump JSON from api method response")
pushTriggerDump = flag.Bool("push-trigger-dump", false, "Get trigger dump in JSON from stdin and save it to redis")
triggerDumpFile = flag.String("trigger-dump-file", "", "File that holds trigger dump JSON from api method response")
)

func main() { //nolint
Expand Down Expand Up @@ -111,73 +106,6 @@ func main() { //nolint
}
}

if *pullTrigger != "" {
f, err := openFile(*triggerFile, os.O_RDWR|os.O_CREATE)
if err != nil {
logger.Fatal(err)
}
defer closeFile(f, logger)

t, err := support.HandlePullTrigger(logger, dataBase, *pullTrigger)
if err != nil {
logger.Fatal(err)
}
if err := json.NewEncoder(f).Encode(t); err != nil {
logger.Fatal("cannot marshall trigger: ", err.Error())
}
}

if *pullTriggerMetrics != "" {
f, err := openFile(*triggerMetricsFile, os.O_RDWR|os.O_CREATE)
if err != nil {
logger.Fatal(err)
}
defer closeFile(f, logger)

m, err := support.HandlePullTriggerMetrics(logger, dataBase, *pullTriggerMetrics)
if err != nil {
logger.Fatal(err)
}
if err := json.NewEncoder(f).Encode(m); err != nil {
logger.Fatal("cannot marshall trigger metrics: ", err.Error())
}
}

if *pushTrigger {
f, err := openFile(*triggerFile, os.O_RDONLY)
if err != nil {
logger.Fatal(err)
}
defer closeFile(f, logger)

var trigger moira.Trigger
if err := json.NewDecoder(f).Decode(&trigger); err != nil {
logger.Fatal("cannot decode trigger: ", err.Error())
}

if err := support.HandlePushTrigger(logger, dataBase, &trigger); err != nil {
logger.Fatal(err)
}
}

if *pushTriggerMetricsByID != "" {
f, err := openFile(*triggerMetricsFile, os.O_RDONLY)
if err != nil {
logger.Fatal(err)
}
defer closeFile(f, logger)

var metrics []support.PatternMetrics
err = json.NewDecoder(f).Decode(&metrics)
if err != nil {
logger.Fatal("cannot decode trigger metrics: ", err.Error())
}

if err := support.HandlePushTriggerMetrics(logger, dataBase, *pushTriggerMetricsByID, metrics); err != nil {
logger.Fatal(err)
}
}

if *pushTriggerDump {
logger.Info("Dump push started")
f, err := openFile(*triggerDumpFile, os.O_RDONLY)
Expand All @@ -186,20 +114,13 @@ func main() { //nolint
}
defer closeFile(f, logger)

dump := &TriggerDump{}
dump := &dto.TriggerDump{}
err = json.NewDecoder(f).Decode(dump)
if err != nil {
logger.Fatal("cannot decode trigger dump: ", err.Error())
}
if len(dump.Errors) > 0 {
logger.Error("Dump has errors, please check it.\n")
for _, e := range dump.Errors {
logger.Error(e)
}
return
}

logger.Info(dump.GetBriefInfo())
logger.Info(GetDumpBriefInfo(dump))
if err := support.HandlePushTrigger(logger, dataBase, &dump.Trigger); err != nil {
logger.Fatal(err)
}
Expand All @@ -214,22 +135,13 @@ func main() { //nolint
}
}

type TriggerDump struct {
Created string `json:"created"`
Errors []string `json:"errors,omitempty"`
LastCheck moira.CheckData `json:"last_check,omitempty"`
Trigger moira.Trigger `json:"trigger,omitempty"`
Metrics []support.PatternMetrics `json:"metrics,omitempty"`
}

func (dump TriggerDump) GetBriefInfo() string {
func GetDumpBriefInfo(dump *dto.TriggerDump) string {
return fmt.Sprintf("\nDump info:\n"+
" - created: %s\n"+
" - trigger.id: %s\n"+
" - metrics count: %d\n"+
" - last_succesfull_check: %d\n"+
" - errors count: %d\n",
dump.Created, dump.Trigger.ID, len(dump.Metrics), dump.LastCheck.LastSuccessfulCheckTimestamp, len(dump.Errors))
" - last_succesfull_check: %d\n",
dump.Created, dump.Trigger.ID, len(dump.Metrics), dump.LastCheck.LastSuccessfulCheckTimestamp)
}

func initApp() (cleanupConfig, moira.Logger, moira.Database) {
Expand Down
15 changes: 5 additions & 10 deletions support/trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,10 @@ import (
"time"

"github.com/moira-alert/moira"
"github.com/moira-alert/moira/api/dto"
"github.com/moira-alert/moira/metric_source/local"
)

type PatternMetrics struct {
Pattern string `json:"pattern"`
Metrics map[string][]*moira.MetricValue `json:"metrics"`
Retentions map[string]int64 `json:"retention"`
}

const defaultRetention = 10

func HandlePullTrigger(logger moira.Logger, database moira.Database, triggerID string) (*moira.Trigger, error) {
Expand All @@ -26,7 +21,7 @@ func HandlePullTrigger(logger moira.Logger, database moira.Database, triggerID s
return &trigger, nil
}

func HandlePullTriggerMetrics(logger moira.Logger, database moira.Database, triggerID string) ([]PatternMetrics, error) {
func HandlePullTriggerMetrics(logger moira.Logger, database moira.Database, triggerID string) ([]dto.PatternMetrics, error) {
logger.Infof("Pulling info about trigger %s metrics", triggerID)
source := local.Create(database)

Expand All @@ -37,7 +32,7 @@ func HandlePullTriggerMetrics(logger moira.Logger, database moira.Database, trig
ttl := database.GetMetricsTTLSeconds()
until := time.Now().Unix()
from := until - ttl
result := []PatternMetrics{}
result := []dto.PatternMetrics{}
for _, target := range trigger.Targets {
fetchResult, errFetch := source.Fetch(target, from, until, trigger.IsSimple())
if errFetch != nil {
Expand All @@ -48,7 +43,7 @@ func HandlePullTriggerMetrics(logger moira.Logger, database moira.Database, trig
return nil, fmt.Errorf("cannot get patterns for target %s: %w", target, errPatterns)
}
for _, pattern := range patterns {
patternResult := PatternMetrics{
patternResult := dto.PatternMetrics{
Pattern: pattern,
Retentions: make(map[string]int64),
}
Expand Down Expand Up @@ -84,7 +79,7 @@ func HandlePushTrigger(logger moira.Logger, database moira.Database, trigger *mo
return nil
}

func HandlePushTriggerMetrics(logger moira.Logger, database moira.Database, triggerID string, patternsMetrics []PatternMetrics) error {
func HandlePushTriggerMetrics(logger moira.Logger, database moira.Database, triggerID string, patternsMetrics []dto.PatternMetrics) error {
logger.Info("Save trigger metrics")

buffer := make(map[string]*moira.MatchedMetric, len(patternsMetrics))
Expand Down

0 comments on commit 4c07929

Please sign in to comment.