61 lines
1.7 KiB
Go
61 lines
1.7 KiB
Go
package metrics
|
|
|
|
import (
|
|
"fmt"
|
|
"tailscale-exporter/pkg/tailscale"
|
|
"time"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
)
|
|
|
|
func collectKeys(client *tailscale.Client) []prometheus.Collector {
|
|
keyExpiry := prometheus.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "tailscale_keys_expiry_time",
|
|
Help: "The expiry time of auth keys",
|
|
ConstLabels: prometheus.Labels{
|
|
"tailnet": client.GetTailnet(),
|
|
},
|
|
},
|
|
[]string{"id", "created", "description", "type"},
|
|
)
|
|
|
|
keySecondsRemaining := prometheus.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "tailscale_keys_expiry_seconds_remaining",
|
|
Help: "The number of seconds remaining until a key expires",
|
|
ConstLabels: prometheus.Labels{
|
|
"tailnet": client.GetTailnet(),
|
|
},
|
|
},
|
|
[]string{"id", "created", "description", "type"},
|
|
)
|
|
|
|
go func() {
|
|
for {
|
|
keys, err := client.GetKeys()
|
|
if err != nil {
|
|
fmt.Println("Failed to get keys: ", err)
|
|
} else {
|
|
// Reset gauges so we don't leave old keys around
|
|
keyExpiry.Reset()
|
|
keySecondsRemaining.Reset()
|
|
|
|
for _, key := range keys {
|
|
remainingSeconds := time.Until(key.Expires).Seconds()
|
|
keyType := "auth_key"
|
|
if key.Capabilities == nil {
|
|
keyType = "api_access_token"
|
|
}
|
|
keyExpiry.With(prometheus.Labels{"id": key.ID, "created": key.Created.String(), "description": key.Description, "type": keyType}).Set(float64(key.Expires.Unix()))
|
|
keySecondsRemaining.With(prometheus.Labels{"id": key.ID, "created": key.Created.String(), "description": key.Description, "type": keyType}).Set(remainingSeconds)
|
|
}
|
|
}
|
|
|
|
time.Sleep(60 * time.Second)
|
|
}
|
|
}()
|
|
|
|
return []prometheus.Collector{keyExpiry, keySecondsRemaining}
|
|
}
|