Add basic architecture of metrics collection service.
diff --git a/metrics/main.go b/metrics/main.go
new file mode 100644
index 0000000..a714ae7
--- /dev/null
+++ b/metrics/main.go
@@ -0,0 +1,46 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "time"
+
+ "github.com/fweikert/continuous-integration/metrics/clients"
+ "github.com/fweikert/continuous-integration/metrics/collectors"
+ "github.com/fweikert/continuous-integration/metrics/publishers"
+ "github.com/fweikert/continuous-integration/metrics/service"
+)
+
+var (
+ org = flag.String("buildkite_org", "bazel", "Buildkite orginization slug")
+ apiToken = flag.String("buildkite_token", "", "Buildkite API access token that grants read access. See https://buildkite.com/docs/apis/rest-api#authentication")
+ debug = flag.Bool("debug", false, "Enable debugging")
+ pipelines = flag.String("pipelines", "", "Comma separated list of slugs of pipelines whose performance statistics should be exported.")
+ sqlUser = flag.String("sql_user", "", "User name for the CloudSQL publisher.")
+ sqlPassword = flag.String("sql_password", "", "Password for the CloudSQL publisher.")
+ sqlInstance = flag.String("sql_instance", "", "Instance name for the CloudSQL publisher.")
+)
+
+func handleError(metricName string, err error) {
+ fmt.Printf("[%s] %v", metricName, err)
+}
+
+func main() {
+ flag.Parse()
+
+ bk, err := clients.CreateBuildkiteClient(*org, *apiToken, *debug)
+ if err != nil {
+ log.Fatalf("Cannot create Buildkite client: %v", err)
+ }
+
+ cloudSql := publishers.CreateCloudSqlPublisher()
+ presubmitPerformance := collectors.CreatePresubmitPerformanceCollector(bk)
+
+ srv := service.CreateService(handleError)
+ srv.AddMetric("presubmit_performance", 10, presubmitPerformance, cloudSql)
+
+ srv.Start()
+ time.Sleep(30 * time.Second)
+ srv.Stop()
+}