func run()

in perfdash/perfdash.go [83:147]


func run() error {
	initDownloaderOptions()
	pflag.Parse()
	initGlobalConfig()

	if options.DefaultBuildsCount > maxBuilds || options.DefaultBuildsCount < 0 {
		klog.Infof("Invalid number of builds: %d, setting to %d", options.DefaultBuildsCount, maxBuilds)
		options.DefaultBuildsCount = maxBuilds
	}

	var metricsBucket MetricsBucket
	var err error

	switch options.Mode {
	case gcsMode:
		metricsBucket, err = NewGCSMetricsBucket(*logsBucket, *logsPath, *credentialPath, *useADC)
	case s3Mode:
		metricsBucket, err = NewS3MetricsBucket(*logsBucket, *logsPath, *awsRegion)
	default:
		return fmt.Errorf("unexpected mode: %s", options.Mode)
	}

	if err != nil {
		return fmt.Errorf("error creating metrics bucket downloader: %v", err)
	}

	downloader := NewDownloader(options, metricsBucket, *allowParsersForAllTests)
	result := make(JobToCategoryData)

	if !*www {
		result, err = downloader.getData()
		if err != nil {
			return fmt.Errorf("fetching data failed: %v", err)
		}
		prettyResult, err := json.MarshalIndent(result, "", " ")
		if err != nil {
			return fmt.Errorf("formatting data failed: %v", err)
		}
		klog.Infof("Result: %v", string(prettyResult))
		return nil
	}

	go func() {
		for {
			klog.Infof("Fetching new data...")
			result, err = downloader.getData()
			if err != nil {
				klog.Errorf("Error fetching data: %v", err)
				time.Sleep(errorDelay)
				continue
			}
			klog.Infof("Data fetched, sleeping %v...", pollDuration)
			time.Sleep(pollDuration)
		}
	}()

	klog.Infof("Starting server...")
	http.Handle("/", http.FileServer(http.Dir(*wwwDir)))
	http.HandleFunc("/jobnames", result.ServeJobNames)
	http.HandleFunc("/metriccategorynames", result.ServeCategoryNames)
	http.HandleFunc("/metricnames", result.ServeMetricNames)
	http.HandleFunc("/buildsdata", result.ServeBuildsData)
	http.HandleFunc("/config", serveConfig)
	return http.ListenAndServe(*addr, nil)
}