mirror of
https://github.com/juanfont/headscale.git
synced 2025-11-10 01:20:58 +01:00
mapper: add generation metrics
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
parent
a613e8a8ce
commit
a380ad8bd2
@ -8,12 +8,22 @@ import (
|
|||||||
"github.com/juanfont/headscale/hscontrol/state"
|
"github.com/juanfont/headscale/hscontrol/state"
|
||||||
"github.com/juanfont/headscale/hscontrol/types"
|
"github.com/juanfont/headscale/hscontrol/types"
|
||||||
"github.com/juanfont/headscale/hscontrol/types/change"
|
"github.com/juanfont/headscale/hscontrol/types/change"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||||
"github.com/puzpuzpuz/xsync/v4"
|
"github.com/puzpuzpuz/xsync/v4"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
"tailscale.com/types/ptr"
|
"tailscale.com/types/ptr"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
mapResponseGenerated = promauto.NewCounterVec(prometheus.CounterOpts{
|
||||||
|
Namespace: "headscale",
|
||||||
|
Name: "mapresponse_generated_total",
|
||||||
|
Help: "total count of mapresponses generated by response type and change type",
|
||||||
|
}, []string{"response_type", "change_type"})
|
||||||
|
)
|
||||||
|
|
||||||
type batcherFunc func(cfg *types.Config, state *state.State) Batcher
|
type batcherFunc func(cfg *types.Config, state *state.State) Batcher
|
||||||
|
|
||||||
// Batcher defines the common interface for all batcher implementations.
|
// Batcher defines the common interface for all batcher implementations.
|
||||||
@ -77,19 +87,30 @@ func generateMapResponse(nodeID types.NodeID, version tailcfg.CapabilityVersion,
|
|||||||
var (
|
var (
|
||||||
mapResp *tailcfg.MapResponse
|
mapResp *tailcfg.MapResponse
|
||||||
err error
|
err error
|
||||||
|
responseType string
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Record metric when function exits
|
||||||
|
defer func() {
|
||||||
|
if err == nil && mapResp != nil && responseType != "" {
|
||||||
|
mapResponseGenerated.WithLabelValues(responseType, c.Change.String()).Inc()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
switch c.Change {
|
switch c.Change {
|
||||||
case change.DERP:
|
case change.DERP:
|
||||||
|
responseType = "derp"
|
||||||
mapResp, err = mapper.derpMapResponse(nodeID)
|
mapResp, err = mapper.derpMapResponse(nodeID)
|
||||||
|
|
||||||
case change.NodeCameOnline, change.NodeWentOffline:
|
case change.NodeCameOnline, change.NodeWentOffline:
|
||||||
if c.IsSubnetRouter {
|
if c.IsSubnetRouter {
|
||||||
// TODO(kradalby): This can potentially be a peer update of the old and new subnet router.
|
// TODO(kradalby): This can potentially be a peer update of the old and new subnet router.
|
||||||
|
responseType = "full"
|
||||||
mapResp, err = mapper.fullMapResponse(nodeID, version)
|
mapResp, err = mapper.fullMapResponse(nodeID, version)
|
||||||
} else {
|
} else {
|
||||||
// Trust the change type for online/offline status to avoid race conditions
|
// Trust the change type for online/offline status to avoid race conditions
|
||||||
// between NodeStore updates and change processing
|
// between NodeStore updates and change processing
|
||||||
|
responseType = "patch"
|
||||||
onlineStatus := c.Change == change.NodeCameOnline
|
onlineStatus := c.Change == change.NodeCameOnline
|
||||||
|
|
||||||
mapResp, err = mapper.peerChangedPatchResponse(nodeID, []*tailcfg.PeerChange{
|
mapResp, err = mapper.peerChangedPatchResponse(nodeID, []*tailcfg.PeerChange{
|
||||||
@ -105,21 +126,26 @@ func generateMapResponse(nodeID types.NodeID, version tailcfg.CapabilityVersion,
|
|||||||
// to ensure the node sees changes to its own properties (e.g., hostname/DNS name changes)
|
// to ensure the node sees changes to its own properties (e.g., hostname/DNS name changes)
|
||||||
// without losing its view of peer status during rapid reconnection cycles
|
// without losing its view of peer status during rapid reconnection cycles
|
||||||
if c.IsSelfUpdate(nodeID) {
|
if c.IsSelfUpdate(nodeID) {
|
||||||
|
responseType = "self"
|
||||||
mapResp, err = mapper.selfMapResponse(nodeID, version)
|
mapResp, err = mapper.selfMapResponse(nodeID, version)
|
||||||
} else {
|
} else {
|
||||||
|
responseType = "change"
|
||||||
mapResp, err = mapper.peerChangeResponse(nodeID, version, c.NodeID)
|
mapResp, err = mapper.peerChangeResponse(nodeID, version, c.NodeID)
|
||||||
}
|
}
|
||||||
|
|
||||||
case change.NodeRemove:
|
case change.NodeRemove:
|
||||||
|
responseType = "remove"
|
||||||
mapResp, err = mapper.peerRemovedResponse(nodeID, c.NodeID)
|
mapResp, err = mapper.peerRemovedResponse(nodeID, c.NodeID)
|
||||||
|
|
||||||
case change.NodeKeyExpiry:
|
case change.NodeKeyExpiry:
|
||||||
// If the node is the one whose key is expiring, we send a "full" self update
|
// If the node is the one whose key is expiring, we send a "full" self update
|
||||||
// as nodes will ignore patch updates about themselves (?).
|
// as nodes will ignore patch updates about themselves (?).
|
||||||
if c.IsSelfUpdate(nodeID) {
|
if c.IsSelfUpdate(nodeID) {
|
||||||
|
responseType = "self"
|
||||||
mapResp, err = mapper.selfMapResponse(nodeID, version)
|
mapResp, err = mapper.selfMapResponse(nodeID, version)
|
||||||
// mapResp, err = mapper.fullMapResponse(nodeID, version)
|
// mapResp, err = mapper.fullMapResponse(nodeID, version)
|
||||||
} else {
|
} else {
|
||||||
|
responseType = "patch"
|
||||||
mapResp, err = mapper.peerChangedPatchResponse(nodeID, []*tailcfg.PeerChange{
|
mapResp, err = mapper.peerChangedPatchResponse(nodeID, []*tailcfg.PeerChange{
|
||||||
{
|
{
|
||||||
NodeID: c.NodeID.NodeID(),
|
NodeID: c.NodeID.NodeID(),
|
||||||
@ -155,6 +181,7 @@ func generateMapResponse(nodeID types.NodeID, version tailcfg.CapabilityVersion,
|
|||||||
default:
|
default:
|
||||||
// The following will always hit this:
|
// The following will always hit this:
|
||||||
// change.Full, change.Policy
|
// change.Full, change.Policy
|
||||||
|
responseType = "full"
|
||||||
mapResp, err = mapper.fullMapResponse(nodeID, version)
|
mapResp, err = mapper.fullMapResponse(nodeID, version)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user