diff --git a/lib/connections/metrics.go b/lib/connections/metrics.go new file mode 100644 index 00000000000..e002833915d --- /dev/null +++ b/lib/connections/metrics.go @@ -0,0 +1,27 @@ +// Copyright (C) 2024 The Syncthing Authors. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at https://mozilla.org/MPL/2.0/. + +package connections + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ( + metricDeviceActiveConnections = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: "syncthing", + Subsystem: "connections", + Name: "active", + Help: "Number of currently active connections, per device. If value is 0, the device is disconnected.", + }, []string{"device"}) +) + +func registerDeviceMetrics(deviceID string) { + // Register metrics for this device, so that counters & gauges are present even + // when zero. + metricDeviceActiveConnections.WithLabelValues(deviceID) +} diff --git a/lib/connections/service.go b/lib/connections/service.go index 359dcff4d54..5b69f2f99a6 100644 --- a/lib/connections/service.go +++ b/lib/connections/service.go @@ -846,6 +846,7 @@ func (s *service) CommitConfiguration(from, to config.Configuration) bool { newDevices := make(map[protocol.DeviceID]bool, len(to.Devices)) for _, dev := range to.Devices { newDevices[dev.DeviceID] = true + registerDeviceMetrics(dev.DeviceID.String()) } for _, dev := range from.Devices { @@ -853,6 +854,7 @@ func (s *service) CommitConfiguration(from, to config.Configuration) bool { warningLimitersMut.Lock() delete(warningLimiters, dev.DeviceID) warningLimitersMut.Unlock() + metricDeviceActiveConnections.DeleteLabelValues(dev.DeviceID.String()) } } @@ -1378,6 +1380,9 @@ func (c *deviceConnectionTracker) accountAddedConnection(conn protocol.Connectio c.wantConnections[d] = int(h.NumConnections) l.Debugf("Added connection for %s (now %d), they want %d connections", d.Short(), len(c.connections[d]), h.NumConnections) + // Update active connections metric + metricDeviceActiveConnections.WithLabelValues(d.String()).Inc() + // Close any connections we no longer want to retain. c.closeWorsePriorityConnectionsLocked(d, conn.Priority()-upgradeThreshold) } @@ -1399,6 +1404,10 @@ func (c *deviceConnectionTracker) accountRemovedConnection(conn protocol.Connect delete(c.connections, d) delete(c.wantConnections, d) } + + // Update active connections metric + metricDeviceActiveConnections.WithLabelValues(d.String()).Dec() + l.Debugf("Removed connection for %s (now %d)", d.Short(), c.connections[d]) } diff --git a/lib/protocol/metrics.go b/lib/protocol/metrics.go index 1f57e51fd98..d1873b7d16b 100644 --- a/lib/protocol/metrics.go +++ b/lib/protocol/metrics.go @@ -58,5 +58,6 @@ func registerDeviceMetrics(deviceID string) { metricDeviceSentUncompressedBytes.WithLabelValues(deviceID) metricDeviceSentMessages.WithLabelValues(deviceID) metricDeviceRecvBytes.WithLabelValues(deviceID) + metricDeviceRecvDecompressedBytes.WithLabelValues(deviceID) metricDeviceRecvMessages.WithLabelValues(deviceID) }