| 
									
										
										
										
											2013-02-07 18:38:01 +08:00
										 |  |  | // Copyright 2013 Prometheus Team
 | 
					
						
							| 
									
										
										
										
											2012-11-27 03:11:34 +08:00
										 |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-24 19:33:34 +08:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2013-01-23 02:32:56 +08:00
										 |  |  | 	"flag" | 
					
						
							| 
									
										
										
										
											2013-01-28 01:49:45 +08:00
										 |  |  | 	"github.com/prometheus/prometheus/config" | 
					
						
							|  |  |  | 	"github.com/prometheus/prometheus/retrieval" | 
					
						
							|  |  |  | 	"github.com/prometheus/prometheus/retrieval/format" | 
					
						
							|  |  |  | 	"github.com/prometheus/prometheus/rules" | 
					
						
							| 
									
										
										
										
											2013-02-09 01:03:26 +08:00
										 |  |  | 	"github.com/prometheus/prometheus/storage/metric" | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 	"github.com/prometheus/prometheus/storage/raw/leveldb" | 
					
						
							| 
									
										
										
										
											2013-02-08 21:49:55 +08:00
										 |  |  | 	"github.com/prometheus/prometheus/web" | 
					
						
							| 
									
										
										
										
											2013-05-06 01:32:04 +08:00
										 |  |  | 	"github.com/prometheus/prometheus/web/api" | 
					
						
							| 
									
										
										
										
											2012-12-12 03:46:16 +08:00
										 |  |  | 	"log" | 
					
						
							|  |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2013-01-07 06:30:46 +08:00
										 |  |  | 	"os/signal" | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 	"sync" | 
					
						
							| 
									
										
										
										
											2013-02-09 01:03:26 +08:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2012-11-24 19:33:34 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	deletionBatchSize = 100 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 02:32:56 +08:00
										 |  |  | // Commandline flags.
 | 
					
						
							|  |  |  | var ( | 
					
						
							| 
									
										
										
										
											2013-04-25 17:47:48 +08:00
										 |  |  | 	printVersion                 = flag.Bool("version", false, "print version information") | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:01 +08:00
										 |  |  | 	configFile                   = flag.String("configFile", "prometheus.conf", "Prometheus configuration file name.") | 
					
						
							|  |  |  | 	metricsStoragePath           = flag.String("metricsStoragePath", "/tmp/metrics", "Base path for metrics storage.") | 
					
						
							|  |  |  | 	scrapeResultsQueueCapacity   = flag.Int("scrapeResultsQueueCapacity", 4096, "The size of the scrape results queue.") | 
					
						
							|  |  |  | 	ruleResultsQueueCapacity     = flag.Int("ruleResultsQueueCapacity", 4096, "The size of the rule results queue.") | 
					
						
							|  |  |  | 	concurrentRetrievalAllowance = flag.Int("concurrentRetrievalAllowance", 15, "The number of concurrent metrics retrieval requests allowed.") | 
					
						
							| 
									
										
										
										
											2013-04-16 23:13:29 +08:00
										 |  |  | 	diskAppendQueueCapacity      = flag.Int("queue.diskAppendCapacity", 1000000, "The size of the queue for items that are pending writing to disk.") | 
					
						
							| 
									
										
										
										
											2013-04-30 19:22:33 +08:00
										 |  |  | 	memoryAppendQueueCapacity    = flag.Int("queue.memoryAppendCapacity", 10000, "The size of the queue for items that are pending writing to memory.") | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	headCompactInterval = flag.Duration("compact.headInterval", 10*3*time.Minute, "The amount of time between head compactions.") | 
					
						
							|  |  |  | 	bodyCompactInterval = flag.Duration("compact.bodyInterval", 10*5*time.Minute, "The amount of time between body compactions.") | 
					
						
							|  |  |  | 	tailCompactInterval = flag.Duration("compact.tailInterval", 10*7*time.Minute, "The amount of time between tail compactions.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	headGroupSize = flag.Int("compact.headGroupSize", 50, "The minimum group size for head samples.") | 
					
						
							|  |  |  | 	bodyGroupSize = flag.Int("compact.bodyGroupSize", 250, "The minimum group size for body samples.") | 
					
						
							|  |  |  | 	tailGroupSize = flag.Int("compact.tailGroupSize", 5000, "The minimum group size for tail samples.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	headAge = flag.Duration("compact.headAgeInclusiveness", 5*time.Minute, "The relative inclusiveness of head samples.") | 
					
						
							|  |  |  | 	bodyAge = flag.Duration("compact.bodyAgeInclusiveness", time.Hour, "The relative inclusiveness of body samples.") | 
					
						
							|  |  |  | 	tailAge = flag.Duration("compact.tailAgeInclusiveness", 24*time.Hour, "The relative inclusiveness of tail samples.") | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	deleteInterval = flag.Duration("delete.interval", 10*11*time.Minute, "The amount of time between deletion of old values.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	deleteAge = flag.Duration("delete.ageMaximum", 10*24*time.Hour, "The relative maximum age for values before they are deleted.") | 
					
						
							| 
									
										
										
										
											2013-05-14 23:50:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	arenaFlushInterval = flag.Duration("arena.flushInterval", 15*time.Minute, "The period at which the in-memory arena is flushed to disk.") | 
					
						
							|  |  |  | 	arenaTTL           = flag.Duration("arena.ttl", 10*time.Minute, "The relative age of values to purge to disk from memory.") | 
					
						
							| 
									
										
										
										
											2013-01-23 02:32:56 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | type prometheus struct { | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 	headCompactionTimer      *time.Ticker | 
					
						
							|  |  |  | 	bodyCompactionTimer      *time.Ticker | 
					
						
							|  |  |  | 	tailCompactionTimer      *time.Ticker | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 	deletionTimer            *time.Ticker | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 	reportDatabasesTimer     *time.Ticker | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 	curationMutex            sync.Mutex | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 	curationState            chan metric.CurationState | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 	databaseStates           chan []leveldb.DatabaseState | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 	stopBackgroundOperations chan bool | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | 	ruleResults   chan *rules.Result | 
					
						
							| 
									
										
										
										
											2013-05-06 01:32:04 +08:00
										 |  |  | 	scrapeResults chan format.Result | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	storage *metric.TieredStorage | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | func (p *prometheus) interruptHandler() { | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | 	notifier := make(chan os.Signal) | 
					
						
							|  |  |  | 	signal.Notify(notifier, os.Interrupt) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	<-notifier | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	log.Println("Received SIGINT; Exiting Gracefully...") | 
					
						
							|  |  |  | 	p.close() | 
					
						
							|  |  |  | 	os.Exit(0) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | func (p *prometheus) compact(olderThan time.Duration, groupSize int) error { | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 	p.curationMutex.Lock() | 
					
						
							|  |  |  | 	defer p.curationMutex.Unlock() | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	processor := &metric.CompactionProcessor{ | 
					
						
							|  |  |  | 		MaximumMutationPoolBatch: groupSize * 3, | 
					
						
							|  |  |  | 		MinimumGroupSize:         groupSize, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	curator := metric.Curator{ | 
					
						
							|  |  |  | 		Stop: p.stopBackgroundOperations, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return curator.Run(olderThan, time.Now(), processor, p.storage.DiskStorage.CurationRemarks, p.storage.DiskStorage.MetricSamples, p.storage.DiskStorage.MetricHighWatermarks, p.curationState) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | func (p *prometheus) delete(olderThan time.Duration, batchSize int) error { | 
					
						
							|  |  |  | 	p.curationMutex.Lock() | 
					
						
							|  |  |  | 	defer p.curationMutex.Unlock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	processor := &metric.DeletionProcessor{ | 
					
						
							|  |  |  | 		MaximumMutationPoolBatch: batchSize, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	curator := metric.Curator{ | 
					
						
							|  |  |  | 		Stop: p.stopBackgroundOperations, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return curator.Run(olderThan, time.Now(), processor, p.storage.DiskStorage.CurationRemarks, p.storage.DiskStorage.MetricSamples, p.storage.DiskStorage.MetricHighWatermarks, p.curationState) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | func (p *prometheus) close() { | 
					
						
							|  |  |  | 	if p.headCompactionTimer != nil { | 
					
						
							|  |  |  | 		p.headCompactionTimer.Stop() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if p.bodyCompactionTimer != nil { | 
					
						
							|  |  |  | 		p.bodyCompactionTimer.Stop() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if p.tailCompactionTimer != nil { | 
					
						
							|  |  |  | 		p.tailCompactionTimer.Stop() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 	if p.deletionTimer != nil { | 
					
						
							|  |  |  | 		p.deletionTimer.Stop() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 	if p.reportDatabasesTimer != nil { | 
					
						
							|  |  |  | 		p.reportDatabasesTimer.Stop() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 	if len(p.stopBackgroundOperations) == 0 { | 
					
						
							|  |  |  | 		p.stopBackgroundOperations <- true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 	p.curationMutex.Lock() | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | 	p.storage.Close() | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 	close(p.stopBackgroundOperations) | 
					
						
							|  |  |  | 	close(p.curationState) | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 	close(p.databaseStates) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (p *prometheus) reportDatabaseState() { | 
					
						
							|  |  |  | 	for _ = range p.reportDatabasesTimer.C { | 
					
						
							|  |  |  | 		// BUG(matt): Per Julius, ...
 | 
					
						
							|  |  |  | 		// These channel magic tricks confuse me and seem a bit awkward just to
 | 
					
						
							|  |  |  | 		// pass a status around. Now that we have Go 1.1, would it be maybe be
 | 
					
						
							|  |  |  | 		// nicer to pass ts.DiskStorage.States as a method value
 | 
					
						
							|  |  |  | 		// (http://tip.golang.org/ref/spec#Method_values) to the web layer
 | 
					
						
							|  |  |  | 		// instead of doing this?
 | 
					
						
							|  |  |  | 		select { | 
					
						
							|  |  |  | 		case <-p.databaseStates: | 
					
						
							|  |  |  | 			// Reset the future database state if nobody consumes it.
 | 
					
						
							|  |  |  | 		case p.databaseStates <- p.storage.DiskStorage.States(): | 
					
						
							|  |  |  | 			// Set the database state so someone can consume it if they want.
 | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			// Don't block.
 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-24 19:33:34 +08:00
										 |  |  | func main() { | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | 	// TODO(all): Future additions to main should be, where applicable, glumped
 | 
					
						
							|  |  |  | 	// into the prometheus struct above---at least where the scoping of the entire
 | 
					
						
							|  |  |  | 	// server is concerned.
 | 
					
						
							| 
									
										
										
										
											2013-01-23 02:32:56 +08:00
										 |  |  | 	flag.Parse() | 
					
						
							| 
									
										
										
										
											2013-04-25 17:47:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-25 19:14:50 +08:00
										 |  |  | 	versionInfoTmpl.Execute(os.Stdout, BuildInfo) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-25 17:47:48 +08:00
										 |  |  | 	if *printVersion { | 
					
						
							|  |  |  | 		os.Exit(0) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 02:32:56 +08:00
										 |  |  | 	conf, err := config.LoadFromFile(*configFile) | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2013-01-25 07:21:29 +08:00
										 |  |  | 		log.Fatalf("Error loading configuration from %s: %v", *configFile, err) | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 23:50:52 +08:00
										 |  |  | 	ts, err := metric.NewTieredStorage(uint(*diskAppendQueueCapacity), 100, *arenaFlushInterval, *arenaTTL, *metricsStoragePath) | 
					
						
							| 
									
										
										
										
											2013-03-27 18:25:05 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		log.Fatalf("Error opening storage: %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-05-03 00:27:12 +08:00
										 |  |  | 	if ts == nil { | 
					
						
							|  |  |  | 		log.Fatalln("Nil tiered storage.") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	scrapeResults := make(chan format.Result, *scrapeResultsQueueCapacity) | 
					
						
							|  |  |  | 	ruleResults := make(chan *rules.Result, *ruleResultsQueueCapacity) | 
					
						
							| 
									
										
										
										
											2013-05-06 01:32:04 +08:00
										 |  |  | 	curationState := make(chan metric.CurationState, 1) | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 	databaseStates := make(chan []leveldb.DatabaseState, 1) | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 	// Coprime numbers, fool!
 | 
					
						
							|  |  |  | 	headCompactionTimer := time.NewTicker(*headCompactInterval) | 
					
						
							|  |  |  | 	bodyCompactionTimer := time.NewTicker(*bodyCompactInterval) | 
					
						
							|  |  |  | 	tailCompactionTimer := time.NewTicker(*tailCompactInterval) | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 	deletionTimer := time.NewTicker(*deleteInterval) | 
					
						
							| 
									
										
										
										
											2013-05-06 01:32:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Queue depth will need to be exposed
 | 
					
						
							|  |  |  | 	targetManager := retrieval.NewTargetManager(scrapeResults, *concurrentRetrievalAllowance) | 
					
						
							|  |  |  | 	targetManager.AddTargetsFromConfig(conf) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 	flags := map[string]string{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	flag.VisitAll(func(f *flag.Flag) { | 
					
						
							|  |  |  | 		flags[f.Name] = f.Value.String() | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 01:32:04 +08:00
										 |  |  | 	statusHandler := &web.StatusHandler{ | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 		PrometheusStatus: &web.PrometheusStatus{ | 
					
						
							|  |  |  | 			BuildInfo:   BuildInfo, | 
					
						
							|  |  |  | 			Config:      conf.String(), | 
					
						
							|  |  |  | 			TargetPools: targetManager.Pools(), | 
					
						
							|  |  |  | 			Flags:       flags, | 
					
						
							| 
									
										
										
										
											2013-05-24 16:44:34 +08:00
										 |  |  | 			Birth:       time.Now(), | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2013-05-06 01:32:04 +08:00
										 |  |  | 		CurationState: curationState, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 	databasesHandler := &web.DatabasesHandler{ | 
					
						
							|  |  |  | 		Incoming: databaseStates, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-05-06 01:32:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	metricsService := &api.MetricsService{ | 
					
						
							|  |  |  | 		Config:        &conf, | 
					
						
							|  |  |  | 		TargetManager: targetManager, | 
					
						
							|  |  |  | 		Storage:       ts, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	webService := &web.WebService{ | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 		StatusHandler:    statusHandler, | 
					
						
							|  |  |  | 		MetricsHandler:   metricsService, | 
					
						
							|  |  |  | 		DatabasesHandler: databasesHandler, | 
					
						
							| 
									
										
										
										
											2013-05-06 01:32:04 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	prometheus := prometheus{ | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 		bodyCompactionTimer: bodyCompactionTimer, | 
					
						
							|  |  |  | 		headCompactionTimer: headCompactionTimer, | 
					
						
							|  |  |  | 		tailCompactionTimer: tailCompactionTimer, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		deletionTimer: deletionTimer, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 		reportDatabasesTimer: time.NewTicker(15 * time.Minute), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		curationState:  curationState, | 
					
						
							|  |  |  | 		databaseStates: databaseStates, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 		ruleResults:   ruleResults, | 
					
						
							|  |  |  | 		scrapeResults: scrapeResults, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 		stopBackgroundOperations: make(chan bool, 1), | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		storage: ts, | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer prometheus.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-22 01:06:15 +08:00
										 |  |  | 	go ts.Serve() | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | 	go prometheus.interruptHandler() | 
					
						
							| 
									
										
										
										
											2013-05-14 17:21:27 +08:00
										 |  |  | 	go prometheus.reportDatabaseState() | 
					
						
							| 
									
										
										
										
											2012-12-12 03:46:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 	go func() { | 
					
						
							|  |  |  | 		for _ = range prometheus.headCompactionTimer.C { | 
					
						
							|  |  |  | 			log.Println("Starting head compaction...") | 
					
						
							|  |  |  | 			err := prometheus.compact(*headAge, *headGroupSize) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				log.Printf("could not compact due to %s", err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			log.Println("Done") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go func() { | 
					
						
							|  |  |  | 		for _ = range prometheus.bodyCompactionTimer.C { | 
					
						
							|  |  |  | 			log.Println("Starting body compaction...") | 
					
						
							|  |  |  | 			err := prometheus.compact(*bodyAge, *bodyGroupSize) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				log.Printf("could not compact due to %s", err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			log.Println("Done") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go func() { | 
					
						
							|  |  |  | 		for _ = range prometheus.tailCompactionTimer.C { | 
					
						
							|  |  |  | 			log.Println("Starting tail compaction...") | 
					
						
							|  |  |  | 			err := prometheus.compact(*tailAge, *tailGroupSize) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				log.Printf("could not compact due to %s", err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			log.Println("Done") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-13 16:53:24 +08:00
										 |  |  | 	go func() { | 
					
						
							|  |  |  | 		for _ = range prometheus.deletionTimer.C { | 
					
						
							|  |  |  | 			log.Println("Starting deletion of stale values...") | 
					
						
							|  |  |  | 			err := prometheus.delete(*deleteAge, deletionBatchSize) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				log.Printf("could not delete due to %s", err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			log.Println("Done") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 23:14:04 +08:00
										 |  |  | 	// Queue depth will need to be exposed
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-07 19:15:10 +08:00
										 |  |  | 	ruleManager := rules.NewRuleManager(ruleResults, conf.EvaluationInterval(), ts) | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	err = ruleManager.AddRulesFromConfig(conf) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2013-01-23 02:32:56 +08:00
										 |  |  | 		log.Fatalf("Error loading rule files: %v", err) | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-12-25 20:50:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 01:32:04 +08:00
										 |  |  | 	go func() { | 
					
						
							|  |  |  | 		err := webService.ServeForever() | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			log.Fatal(err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							| 
									
										
										
										
											2013-01-05 00:55:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-29 17:17:56 +08:00
										 |  |  | 	// TODO(all): Migrate this into prometheus.serve().
 | 
					
						
							| 
									
										
										
										
											2013-01-04 21:41:47 +08:00
										 |  |  | 	for { | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 		select { | 
					
						
							|  |  |  | 		case scrapeResult := <-scrapeResults: | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:01 +08:00
										 |  |  | 			if scrapeResult.Err == nil { | 
					
						
							| 
									
										
										
										
											2013-04-29 22:55:18 +08:00
										 |  |  | 				ts.AppendSamples(scrapeResult.Samples) | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-02-09 01:03:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 		case ruleResult := <-ruleResults: | 
					
						
							| 
									
										
										
										
											2013-04-09 19:47:20 +08:00
										 |  |  | 			if ruleResult.Err == nil { | 
					
						
							| 
									
										
										
										
											2013-04-29 22:55:18 +08:00
										 |  |  | 				ts.AppendSamples(ruleResult.Samples) | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2012-12-25 20:50:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-11-24 19:33:34 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |