Update last run time and active count (#568)

* Update last run time and active count

We will collect the active peer min and max versions

* Get UI client usage
This commit is contained in:
Maycon Santos 2022-11-18 16:35:13 +01:00 committed by GitHub
parent c8ace8bbbe
commit 9cb66bdb5d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 2 deletions

1
go.mod
View File

@ -36,6 +36,7 @@ require (
github.com/getlantern/systray v1.2.1 github.com/getlantern/systray v1.2.1
github.com/gliderlabs/ssh v0.3.4 github.com/gliderlabs/ssh v0.3.4
github.com/google/nftables v0.0.0-20220808154552-2eca00135732 github.com/google/nftables v0.0.0-20220808154552-2eca00135732
github.com/hashicorp/go-version v1.6.0
github.com/libp2p/go-netroute v0.2.0 github.com/libp2p/go-netroute v0.2.0
github.com/magiconair/properties v1.8.5 github.com/magiconair/properties v1.8.5
github.com/miekg/dns v1.1.41 github.com/miekg/dns v1.1.41

2
go.sum
View File

@ -347,6 +347,8 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=

View File

@ -5,11 +5,14 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/hashicorp/go-version"
"github.com/netbirdio/netbird/client/system" "github.com/netbirdio/netbird/client/system"
"github.com/netbirdio/netbird/management/server" "github.com/netbirdio/netbird/management/server"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"io" "io"
"net/http" "net/http"
"regexp"
"sort"
"strings" "strings"
"time" "time"
) )
@ -85,6 +88,7 @@ func (w *Worker) Run() {
if err != nil { if err != nil {
log.Error(err) log.Error(err)
} }
w.lastRun = time.Now()
} }
} }
} }
@ -161,11 +165,15 @@ func (w *Worker) generateProperties() properties {
groups int groups int
routes int routes int
nameservers int nameservers int
uiClient int
version string version string
peerActiveVersions []string
osUIClients map[string]int
) )
start := time.Now() start := time.Now()
metricsProperties := make(properties) metricsProperties := make(properties)
osPeers = make(map[string]int) osPeers = make(map[string]int)
osUIClients = make(map[string]int)
uptime = time.Since(w.startupTime).Seconds() uptime = time.Since(w.startupTime).Seconds()
connections := w.connManager.GetAllConnectedPeers() connections := w.connManager.GetAllConnectedPeers()
version = system.NetbirdVersion() version = system.NetbirdVersion()
@ -184,7 +192,7 @@ func (w *Worker) generateProperties() properties {
for _, peer := range account.Peers { for _, peer := range account.Peers {
peers++ peers++
if peer.SetupKey != "" { if peer.SetupKey == "" {
userPeers++ userPeers++
} }
@ -192,16 +200,25 @@ func (w *Worker) generateProperties() properties {
osCount := osPeers[osKey] osCount := osPeers[osKey]
osPeers[osKey] = osCount + 1 osPeers[osKey] = osCount + 1
if peer.Meta.UIVersion != "" {
uiClient++
uiOSKey := strings.ToLower(fmt.Sprintf("ui_client_os_%s", peer.Meta.GoOS))
osUICount := osUIClients[uiOSKey]
osUIClients[uiOSKey] = osUICount + 1
}
_, connected := connections[peer.Key] _, connected := connections[peer.Key]
if connected || peer.Status.LastSeen.After(w.lastRun) { if connected || peer.Status.LastSeen.After(w.lastRun) {
activePeersLastDay++ activePeersLastDay++
osActiveKey := osKey + "_active" osActiveKey := osKey + "_active"
osActiveCount := osPeers[osActiveKey] osActiveCount := osPeers[osActiveKey]
osPeers[osActiveKey] = osActiveCount + 1 osPeers[osActiveKey] = osActiveCount + 1
peerActiveVersions = append(peerActiveVersions, peer.Meta.WtVersion)
} }
} }
} }
minActivePeerVersion, maxActivePeerVersion := getMinMaxVersion(peerActiveVersions)
metricsProperties["uptime"] = uptime metricsProperties["uptime"] = uptime
metricsProperties["accounts"] = accounts metricsProperties["accounts"] = accounts
metricsProperties["users"] = users metricsProperties["users"] = users
@ -214,11 +231,17 @@ func (w *Worker) generateProperties() properties {
metricsProperties["routes"] = routes metricsProperties["routes"] = routes
metricsProperties["nameservers"] = nameservers metricsProperties["nameservers"] = nameservers
metricsProperties["version"] = version metricsProperties["version"] = version
metricsProperties["min_active_peer_version"] = minActivePeerVersion
metricsProperties["max_active_peer_version"] = maxActivePeerVersion
metricsProperties["ui_clients"] = uiClient
for os, count := range osPeers { for os, count := range osPeers {
metricsProperties[os] = count metricsProperties[os] = count
} }
for os, count := range osUIClients {
metricsProperties[os] = count
}
metricsProperties["metric_generation_time"] = time.Since(start).Milliseconds() metricsProperties["metric_generation_time"] = time.Since(start).Milliseconds()
return metricsProperties return metricsProperties
@ -284,3 +307,31 @@ func createPostRequest(ctx context.Context, endpoint string, payloadStr string)
return req, nil return req, nil
} }
func getMinMaxVersion(inputList []string) (string, string) {
reg, err := regexp.Compile(version.SemverRegexpRaw)
if err != nil {
return "", ""
}
versions := make([]*version.Version, 0)
for _, raw := range inputList {
if raw != "" && reg.MatchString(raw) {
v, err := version.NewVersion(raw)
if err == nil {
versions = append(versions, v)
}
}
}
switch len(versions) {
case 0:
return "", ""
case 1:
v := versions[0].String()
return v, v
default:
sort.Sort(version.Collection(versions))
return versions[0].String(), versions[len(versions)-1].String()
}
}