internal/telemetry: add the ability to flush telemetry data

Change-Id: I5de33edc352a5202fdf9e38538a224dd6adafedb
Reviewed-on: https://go-review.googlesource.com/c/tools/+/190799
Run-TryBot: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
diff --git a/internal/lsp/debug/rpc.go b/internal/lsp/debug/rpc.go
index e9167e0..9ed01d5 100644
--- a/internal/lsp/debug/rpc.go
+++ b/internal/lsp/debug/rpc.go
@@ -93,6 +93,8 @@
 func (r *rpcs) StartSpan(ctx context.Context, span *telemetry.Span)  {}
 func (r *rpcs) FinishSpan(ctx context.Context, span *telemetry.Span) {}
 func (r *rpcs) Log(ctx context.Context, event telemetry.Event)       {}
+func (r *rpcs) Flush()                                               {}
+
 func (r *rpcs) Metric(ctx context.Context, data telemetry.MetricData) {
 	for i, group := range data.Groups() {
 		set := &r.Inbound
diff --git a/internal/lsp/debug/trace.go b/internal/lsp/debug/trace.go
index 590c4dc..4fd3de4 100644
--- a/internal/lsp/debug/trace.go
+++ b/internal/lsp/debug/trace.go
@@ -134,6 +134,8 @@
 
 func (t *traces) Metric(ctx context.Context, data telemetry.MetricData) {}
 
+func (t *traces) Flush() {}
+
 func (t *traces) getData(req *http.Request) interface{} {
 	if len(t.sets) == 0 {
 		return nil
diff --git a/internal/lsp/protocol/context.go b/internal/lsp/protocol/context.go
index c48f853..d024e00 100644
--- a/internal/lsp/protocol/context.go
+++ b/internal/lsp/protocol/context.go
@@ -27,8 +27,11 @@
 // context.
 type logExporter struct{}
 
-func (logExporter) StartSpan(context.Context, *telemetry.Span)  {}
-func (logExporter) FinishSpan(context.Context, *telemetry.Span) {}
+func (logExporter) StartSpan(context.Context, *telemetry.Span)   {}
+func (logExporter) FinishSpan(context.Context, *telemetry.Span)  {}
+func (logExporter) Metric(context.Context, telemetry.MetricData) {}
+func (logExporter) Flush()                                       {}
+
 func (logExporter) Log(ctx context.Context, event telemetry.Event) {
 	client, ok := ctx.Value(clientKey).(Client)
 	if !ok {
@@ -40,4 +43,3 @@
 	}
 	go client.LogMessage(xcontext.Detach(ctx), msg)
 }
-func (logExporter) Metric(context.Context, telemetry.MetricData) {}
diff --git a/internal/telemetry/export/export.go b/internal/telemetry/export/export.go
index 355d46f..8ed8cd3 100644
--- a/internal/telemetry/export/export.go
+++ b/internal/telemetry/export/export.go
@@ -26,6 +26,8 @@
 	Log(context.Context, telemetry.Event)
 
 	Metric(context.Context, telemetry.MetricData)
+
+	Flush()
 }
 
 var (
@@ -90,3 +92,9 @@
 	defer exporterMu.Unlock()
 	exporter.Metric(ctx, data)
 }
+
+func Flush() {
+	exporterMu.Lock()
+	defer exporterMu.Unlock()
+	exporter.Flush()
+}
diff --git a/internal/telemetry/export/log.go b/internal/telemetry/export/log.go
index 4e7bffd..d840e53 100644
--- a/internal/telemetry/export/log.go
+++ b/internal/telemetry/export/log.go
@@ -35,3 +35,4 @@
 	fmt.Fprintf(w.writer, "%v\n", event)
 }
 func (w *logWriter) Metric(context.Context, telemetry.MetricData) {}
+func (w *logWriter) Flush()                                       {}
diff --git a/internal/telemetry/export/multi.go b/internal/telemetry/export/multi.go
index 8de0e2c..df19f2c 100644
--- a/internal/telemetry/export/multi.go
+++ b/internal/telemetry/export/multi.go
@@ -48,3 +48,8 @@
 		o.Metric(ctx, data)
 	}
 }
+func (m multi) Flush() {
+	for _, o := range m {
+		o.Flush()
+	}
+}
diff --git a/internal/telemetry/export/null.go b/internal/telemetry/export/null.go
index 6dd404d..cc01ba7 100644
--- a/internal/telemetry/export/null.go
+++ b/internal/telemetry/export/null.go
@@ -21,3 +21,4 @@
 func (null) FinishSpan(context.Context, *telemetry.Span)  {}
 func (null) Log(context.Context, telemetry.Event)         {}
 func (null) Metric(context.Context, telemetry.MetricData) {}
+func (null) Flush()                                       {}
diff --git a/internal/telemetry/export/prometheus/prometheus.go b/internal/telemetry/export/prometheus/prometheus.go
index 903c685..ccbdf96 100644
--- a/internal/telemetry/export/prometheus/prometheus.go
+++ b/internal/telemetry/export/prometheus/prometheus.go
@@ -28,6 +28,8 @@
 func (e *Exporter) StartSpan(ctx context.Context, span *telemetry.Span)  {}
 func (e *Exporter) FinishSpan(ctx context.Context, span *telemetry.Span) {}
 func (e *Exporter) Log(ctx context.Context, event telemetry.Event)       {}
+func (e *Exporter) Flush()                                               {}
+
 func (e *Exporter) Metric(ctx context.Context, data telemetry.MetricData) {
 	e.mu.Lock()
 	defer e.mu.Unlock()