Add Open-telemetry support (#517)

This PR brings open-telemetry metrics to the
Management service.
The Management service exposes new HTTP endpoint
/metrics on 8081 port by default.
The port can be changed by specifying
--metrics-port PORT flag when starting the service.
This commit is contained in:
Misha Bragin
2022-10-21 16:24:13 +02:00
committed by GitHub
parent 08ddf04c5f
commit 4f1f0df7d2
7 changed files with 296 additions and 58 deletions

View File

@@ -8,8 +8,14 @@ import (
"flag"
"fmt"
"github.com/google/uuid"
"github.com/gorilla/mux"
httpapi "github.com/netbirdio/netbird/management/server/http"
"github.com/netbirdio/netbird/management/server/metrics"
prometheus2 "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/otel/exporters/prometheus"
metric2 "go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/sdk/metric"
"golang.org/x/crypto/acme/autocert"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
@@ -20,6 +26,7 @@ import (
"net/url"
"os"
"path"
"reflect"
"strings"
"time"
@@ -42,6 +49,7 @@ const ManagementLegacyPort = 33073
var (
mgmtPort int
mgmtMetricsPort int
mgmtLetsencryptDomain string
mgmtSingleAccModeDomain string
certFile string
@@ -155,8 +163,17 @@ var (
tlsEnabled = true
}
metricsListener, err := net.Listen("tcp4", fmt.Sprintf("localhost:%d", mgmtMetricsPort))
if err != nil {
return err
}
meter, err := exposeMetrics(metricsListener)
if err != nil {
return err
}
httpAPIHandler, err := httpapi.APIHandler(accountManager,
config.HttpConfig.AuthIssuer, config.HttpConfig.AuthAudience, config.HttpConfig.AuthKeysLocation)
config.HttpConfig.AuthIssuer, config.HttpConfig.AuthAudience, config.HttpConfig.AuthKeysLocation, meter)
if err != nil {
return fmt.Errorf("failed creating HTTP API handler: %v", err)
}
@@ -229,6 +246,7 @@ var (
SetupCloseHandler()
<-stopCh
_ = metricsListener.Close()
_ = listener.Close()
if certManager != nil {
_ = certManager.Listener().Close()
@@ -241,6 +259,29 @@ var (
}
)
func exposeMetrics(lis net.Listener) (metric2.Meter, error) {
exporter, err := prometheus.New()
if err != nil {
return nil, err
}
pkg := reflect.TypeOf(ManagementLegacyPort).PkgPath()
provider := metric.NewMeterProvider(metric.WithReader(exporter))
meter := provider.Meter(pkg)
rootRouter := mux.NewRouter()
rootRouter.Handle("/metrics", promhttp.HandlerFor(
prometheus2.DefaultGatherer,
promhttp.HandlerOpts{EnableOpenMetrics: true}))
go func() {
err := http.Serve(lis, rootRouter)
if err != nil {
return
}
}()
log.Infof("metrics enabled for package %v and listening on %s", pkg, lis.Addr().String())
return meter, nil
}
func notifyStop(msg string) {
select {
case stopCh <- 1: