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()