blob: 141152fd62c5f3bc006415f47635d72f7341943c [file] [log] [blame]
package main
import (
"flag"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"github.com/fweikert/continuous-integration/metrics/clients"
"github.com/fweikert/continuous-integration/metrics/metrics"
"github.com/fweikert/continuous-integration/metrics/publishers"
"github.com/fweikert/continuous-integration/metrics/service"
)
var (
projectID = flag.String("project_id", "bazel-untrusted", "ID of the GCP project.")
datastoreSettingsName = flag.String("datastore_settings_name", "MetricSettings", "Name of the settings entity in Datastore.")
testMode = flag.Bool("test", false, "If true, the service will collect and publish all metrics immediately and only once.")
)
const megaByte = 1024 * 1024
func handleError(metricName string, err error) {
fmt.Printf("[%s] %v\n", metricName, err)
}
func main() {
flag.Parse()
settings, err := ReadSettingsFromDatastore(*projectID, *datastoreSettingsName)
if err != nil {
log.Fatalf("Could not read settings from Datastore: %v", err)
}
if len(settings.BuildkitePipelines) == 0 {
log.Fatalf("No pipelines were specified.")
}
bk, err := clients.CreateBuildkiteClient(settings.BuildkiteOrg, settings.BuildkiteApiToken, settings.BuildkiteDebug)
if err != nil {
log.Fatalf("Cannot create Buildkite client: %v", err)
}
/*
gcs, err := clients.CreateGcsClient()
if err != nil {
log.Fatalf("Cannot create GCS client: %v", err)
}
*/
stackdriverClient, err := clients.CreateStackdriverClient()
if err != nil {
log.Fatalf("Cannot create Stackdriver client: %v", err)
}
/*
cloudSql, err := publishers.CreateCloudSqlPublisher(settings.CloudSqlUser, settings.CloudSqlPassword, settings.CloudSqlInstance, settings.CloudSqlDatabase, settings.CloudSqlLocalPort)
if err != nil {
log.Fatalf("Failed to set up Cloud SQL publisher: %v", err)
}
*/
stackdriver := publishers.CreateStackdriverPublisher(stackdriverClient, *projectID)
stdout := publishers.CreateStdoutPublisher(publishers.Csv)
srv := service.CreateService(handleError)
platformLoad := metrics.CreatePlatformLoad(bk, 100)
srv.AddMetric(platformLoad, 60, stdout, stackdriver)
/*
buildsPerChange := metrics.CreateBuildsPerChange(bk, 500, settings.BuildkitePipelines...)
srv.AddMetric(buildsPerChange, 60, stdout)
buildSuccess := metrics.CreateBuildSuccess(bk, 200, settings.BuildkitePipelines...)
srv.AddMetric(buildSuccess, 60, stdout)
// TODO(fweikert): use real settings instead of hardcoded values
flakiness := metrics.CreateFlakiness(gcs, "bazel-buildkite-stats", "flaky-tests-bep", "google-bazel-presubmit") // TODO: settings.BuildkitePipelines...)
srv.AddMetric(flakiness, 60, stdout)
macPerformance := metrics.CreateMacPerformance(bk, 20, "google-bazel-presubmit") // TODO: settings.BuildkitePipelines...)
srv.AddMetric(macPerformance, 60, stdout)
pipelinePerformance := metrics.CreatePipelinePerformance(bk, 20, settings.BuildkitePipelines...)
srv.AddMetric(pipelinePerformance, 60, stdout)
platformSignificance := metrics.CreatePlatformSignificance(bk, 100, settings.BuildkitePipelines...)
srv.AddMetric(platformSignificance, 24*60, stdout)
platformUsage := metrics.CreatePlatformUsage(bk, 100)
srv.AddMetric(platformUsage, 60, stdout)
releaseDownloads := metrics.CreateReleaseDownloads(settings.GitHubOrg,
settings.GitHubRepo,
settings.GitHubApiToken, megaByte)
srv.AddMetric(releaseDownloads, 12*60, stdout)
workerAvailability := metrics.CreateWorkerAvailability(bk)
srv.AddMetric(workerAvailability, 60, stdout)
*/
if *testMode {
log.Println("[Test mode] Running all jobs exactly once...")
srv.RunJobsOnce()
} else {
srv.Start()
exitSignal := make(chan os.Signal)
signal.Notify(exitSignal, syscall.SIGINT, syscall.SIGTERM)
<-exitSignal
srv.Stop()
}
}