diff --git a/logpolicy/logpolicy.go b/logpolicy/logpolicy.go index f7491783a..741e02fc7 100644 --- a/logpolicy/logpolicy.go +++ b/logpolicy/logpolicy.go @@ -662,6 +662,9 @@ func (opts Options) init(disableLogging bool) (*logtail.Config, *Policy) { } } lw := logtail.NewLogger(conf, opts.Logf) + if conf.MetricsDelta != nil { + exportClientMetrics(lw) + } var logOutput io.Writer = lw diff --git a/logpolicy/logtail_metrics.go b/logpolicy/logtail_metrics.go new file mode 100644 index 000000000..87fa7de89 --- /dev/null +++ b/logpolicy/logtail_metrics.go @@ -0,0 +1,29 @@ +// Copyright (c) Tailscale Inc & AUTHORS +// SPDX-License-Identifier: BSD-3-Clause + +//go:build !ts_omit_logtail && !ts_omit_clientmetrics + +package logpolicy + +import ( + "expvar" + + "tailscale.com/logtail" + "tailscale.com/util/clientmetric" +) + +func exportClientMetrics(logger *logtail.Logger) { + if m, _ := logger.ExpVar().(interface{ Get(string) expvar.Var }); m != nil { + if m2, _ := m.Get("buffer").(interface{ Get(string) expvar.Var }); m2 != nil { + if v, _ := m2.Get("counter_filched_bytes").(*expvar.Int); v != nil { + clientmetric.NewCounterFunc("logtail_filched_bytes", v.Value) + } + if v, _ := m2.Get("counter_dropped_bytes").(*expvar.Int); v != nil { + clientmetric.NewCounterFunc("logtail_dropped_bytes", v.Value) + } + if v, _ := m2.Get("gauge_stored_bytes").(*expvar.Int); v != nil { + clientmetric.NewGaugeFunc("logtail_stored_bytes", v.Value) + } + } + } +} diff --git a/logpolicy/logtail_nometrics.go b/logpolicy/logtail_nometrics.go new file mode 100644 index 000000000..51ce04689 --- /dev/null +++ b/logpolicy/logtail_nometrics.go @@ -0,0 +1,10 @@ +// Copyright (c) Tailscale Inc & AUTHORS +// SPDX-License-Identifier: BSD-3-Clause + +//go:build ts_omit_logtail || ts_omit_clientmetrics + +package logpolicy + +import "tailscale.com/logtail" + +func exportClientMetrics(logger *logtail.Logger) {}