func main() { flag.Parse() conf, err := config.LoadFromFile(*configFile) if err != nil { log.Fatalf("Error loading configuration from %s: %v", *configFile, err) } ts, err := metric.NewTieredStorage(5000, 5000, 100, time.Second*30, time.Second*1, time.Second*20, *metricsStoragePath) if err != nil { log.Fatalf("Error opening storage: %s", err) } go ts.Serve() go func() { notifier := make(chan os.Signal) signal.Notify(notifier, os.Interrupt) <-notifier ts.Close() os.Exit(0) }() // Queue depth will need to be exposed scrapeResults := make(chan format.Result, *scrapeResultsQueueCapacity) targetManager := retrieval.NewTargetManager(scrapeResults, *concurrentRetrievalAllowance) targetManager.AddTargetsFromConfig(conf) ruleResults := make(chan *rules.Result, *ruleResultsQueueCapacity) ast.SetStorage(ts) ruleManager := rules.NewRuleManager(ruleResults, conf.Global.EvaluationInterval) err = ruleManager.AddRulesFromConfig(conf) if err != nil { log.Fatalf("Error loading rule files: %v", err) } appState := &appstate.ApplicationState{ Config: conf, RuleManager: ruleManager, Storage: ts, TargetManager: targetManager, } web.StartServing(appState) for { select { case scrapeResult := <-scrapeResults: if scrapeResult.Err == nil { ts.AppendSample(scrapeResult.Sample) } case ruleResult := <-ruleResults: for _, sample := range ruleResult.Samples { ts.AppendSample(sample) } } } }
func TestExpressions(t *testing.T) { temporaryDirectory := test.NewTemporaryDirectory("rule_expression_tests", t) defer temporaryDirectory.Close() tieredStorage, err := metric.NewTieredStorage(5000, 5000, 100, time.Second*30, time.Second*1, time.Second*20, temporaryDirectory.Path()) if err != nil { t.Fatalf("Error opening storage: %s", err) } go tieredStorage.Serve() ast.SetStorage(tieredStorage) storeMatrix(tieredStorage, testMatrix) tieredStorage.Flush() for i, exprTest := range expressionTests { expectedLines := annotateWithTime(exprTest.output) testExpr, err := LoadExprFromString(exprTest.expr) if err != nil { if exprTest.shouldFail { continue } t.Errorf("%d Error during parsing: %v", i, err) t.Errorf("%d Expression: %v", i, exprTest.expr) } else { if exprTest.shouldFail { t.Errorf("%d Test should fail, but didn't", i) } failed := false resultStr := ast.EvalToString(testExpr, testEvalTime, ast.TEXT) resultLines := strings.Split(resultStr, "\n") if len(exprTest.output) != len(resultLines) { t.Errorf("%d Number of samples in expected and actual output don't match", i) failed = true } if exprTest.checkOrder { for j, expectedSample := range expectedLines { if resultLines[j] != expectedSample { t.Errorf("%d.%d Expected sample '%v', got '%v'", i, j, resultLines[j], expectedSample) failed = true } } } else { for j, expectedSample := range expectedLines { found := false for _, actualSample := range resultLines { if actualSample == expectedSample { found = true } } if !found { t.Errorf("%d.%d Couldn't find expected sample in output: '%v'", i, j, expectedSample) failed = true } } } analyzer := ast.NewQueryAnalyzer() analyzer.AnalyzeQueries(testExpr) if exprTest.fullRanges != len(analyzer.FullRanges) { t.Errorf("%d Count of full ranges didn't match: %v vs %v", i, exprTest.fullRanges, len(analyzer.FullRanges)) failed = true } if exprTest.intervalRanges != len(analyzer.IntervalRanges) { t.Errorf("%d Count of interval ranges didn't match: %v vs %v", i, exprTest.intervalRanges, len(analyzer.IntervalRanges)) failed = true } if failed { t.Errorf("%d Expression: %v\n%v", i, exprTest.expr, vectorComparisonString(expectedLines, resultLines)) } } } }