22package metrix
33
44import (
5+ "crypto/x509"
56 "net/http"
67 "strconv"
78 "time"
89
910 "github.com/smallstep/certificates/authority/provisioner"
11+ "golang.org/x/crypto/ssh"
1012
1113 "github.com/prometheus/client_golang/prometheus"
1214 "github.com/prometheus/client_golang/prometheus/promhttp"
@@ -15,6 +17,8 @@ import (
1517// New initializes and returns a new [Meter].
1618func New () (m * Meter ) {
1719 initializedAt := time .Now ()
20+ defaultLabels := []string {"provisioner" , "success" }
21+ sshSignLabels := []string {"provisioner" , "success" , "type" }
1822
1923 m = & Meter {
2024 uptime : prometheus .NewGaugeFunc (
@@ -27,8 +31,8 @@ func New() (m *Meter) {
2731 return float64 (time .Since (initializedAt ) / time .Second )
2832 },
2933 ),
30- ssh : newProvisionerInstruments ("ssh" ),
31- x509 : newProvisionerInstruments ("x509" ),
34+ ssh : newProvisionerInstruments ("ssh" , sshSignLabels , defaultLabels ),
35+ x509 : newProvisionerInstruments ("x509" , defaultLabels , defaultLabels ),
3236 kms : & kms {
3337 signed : prometheus .NewCounter (prometheus .CounterOpts (opts ("kms" , "signed" , "Number of KMS-backed signatures" ))),
3438 errors : prometheus .NewCounter (prometheus .CounterOpts (opts ("kms" , "errors" , "Number of KMS-related errors" ))),
@@ -77,18 +81,18 @@ type Meter struct {
7781}
7882
7983// SSHRekeyed implements [authority.Meter] for [Meter].
80- func (m * Meter ) SSHRekeyed (p provisioner.Interface , err error ) {
81- incrProvisionerCounter (m .ssh .rekeyed , p , err )
84+ func (m * Meter ) SSHRekeyed (cert * ssh. Certificate , p provisioner.Interface , err error ) {
85+ incrProvisionerCounter (m .ssh .rekeyed , p , err , sshCertValues ( cert ) ... )
8286}
8387
8488// SSHRenewed implements [authority.Meter] for [Meter].
85- func (m * Meter ) SSHRenewed (p provisioner.Interface , err error ) {
86- incrProvisionerCounter (m .ssh .renewed , p , err )
89+ func (m * Meter ) SSHRenewed (cert * ssh. Certificate , p provisioner.Interface , err error ) {
90+ incrProvisionerCounter (m .ssh .renewed , p , err , sshCertValues ( cert ) ... )
8791}
8892
8993// SSHSigned implements [authority.Meter] for [Meter].
90- func (m * Meter ) SSHSigned (p provisioner.Interface , err error ) {
91- incrProvisionerCounter (m .ssh .signed , p , err )
94+ func (m * Meter ) SSHSigned (cert * ssh. Certificate , p provisioner.Interface , err error ) {
95+ incrProvisionerCounter (m .ssh .signed , p , err , sshCertValues ( cert ) ... )
9296}
9397
9498// SSHWebhookAuthorized implements [authority.Meter] for [Meter].
@@ -102,17 +106,17 @@ func (m *Meter) SSHWebhookEnriched(p provisioner.Interface, err error) {
102106}
103107
104108// X509Rekeyed implements [authority.Meter] for [Meter].
105- func (m * Meter ) X509Rekeyed (p provisioner.Interface , err error ) {
109+ func (m * Meter ) X509Rekeyed (_ [] * x509. Certificate , p provisioner.Interface , err error ) {
106110 incrProvisionerCounter (m .x509 .rekeyed , p , err )
107111}
108112
109113// X509Renewed implements [authority.Meter] for [Meter].
110- func (m * Meter ) X509Renewed (p provisioner.Interface , err error ) {
114+ func (m * Meter ) X509Renewed (_ [] * x509. Certificate , p provisioner.Interface , err error ) {
111115 incrProvisionerCounter (m .x509 .renewed , p , err )
112116}
113117
114118// X509Signed implements [authority.Meter] for [Meter].
115- func (m * Meter ) X509Signed (p provisioner.Interface , err error ) {
119+ func (m * Meter ) X509Signed (_ [] * x509. Certificate , p provisioner.Interface , err error ) {
116120 incrProvisionerCounter (m .x509 .signed , p , err )
117121}
118122
@@ -126,13 +130,27 @@ func (m *Meter) X509WebhookEnriched(p provisioner.Interface, err error) {
126130 incrProvisionerCounter (m .x509 .webhookEnriched , p , err )
127131}
128132
129- func incrProvisionerCounter (cv * prometheus.CounterVec , p provisioner.Interface , err error ) {
133+ func sshCertValues (cert * ssh.Certificate ) []string {
134+ switch cert .CertType {
135+ case ssh .UserCert :
136+ return []string {"user" }
137+ case ssh .HostCert :
138+ return []string {"host" }
139+ default :
140+ return []string {"unknown" }
141+ }
142+ }
143+
144+ func incrProvisionerCounter (cv * prometheus.CounterVec , p provisioner.Interface , err error , extraValues ... string ) {
130145 var name string
131146 if p != nil {
132147 name = p .GetName ()
133148 }
134149
135- cv .WithLabelValues (name , strconv .FormatBool (err == nil )).Inc ()
150+ values := append ([]string {
151+ name , strconv .FormatBool (err == nil ),
152+ }, extraValues ... )
153+ cv .WithLabelValues (values ... ).Inc ()
136154}
137155
138156// KMSSigned implements [authority.Meter] for [Meter].
@@ -154,28 +172,13 @@ type provisionerInstruments struct {
154172 webhookEnriched * prometheus.CounterVec
155173}
156174
157- func newProvisionerInstruments (subsystem string ) * provisionerInstruments {
175+ func newProvisionerInstruments (subsystem string , signLabels , webhookLabels [] string ) * provisionerInstruments {
158176 return & provisionerInstruments {
159- rekeyed : newCounterVec (subsystem , "rekeyed_total" , "Number of certificates rekeyed" ,
160- "provisioner" ,
161- "success" ,
162- ),
163- renewed : newCounterVec (subsystem , "renewed_total" , "Number of certificates renewed" ,
164- "provisioner" ,
165- "success" ,
166- ),
167- signed : newCounterVec (subsystem , "signed_total" , "Number of certificates signed" ,
168- "provisioner" ,
169- "success" ,
170- ),
171- webhookAuthorized : newCounterVec (subsystem , "webhook_authorized_total" , "Number of authorizing webhooks called" ,
172- "provisioner" ,
173- "success" ,
174- ),
175- webhookEnriched : newCounterVec (subsystem , "webhook_enriched_total" , "Number of enriching webhooks called" ,
176- "provisioner" ,
177- "success" ,
178- ),
177+ rekeyed : newCounterVec (subsystem , "rekeyed_total" , "Number of certificates rekeyed" , signLabels ... ),
178+ renewed : newCounterVec (subsystem , "renewed_total" , "Number of certificates renewed" , signLabels ... ),
179+ signed : newCounterVec (subsystem , "signed_total" , "Number of certificates signed" , signLabels ... ),
180+ webhookAuthorized : newCounterVec (subsystem , "webhook_authorized_total" , "Number of authorizing webhooks called" , webhookLabels ... ),
181+ webhookEnriched : newCounterVec (subsystem , "webhook_enriched_total" , "Number of enriching webhooks called" , webhookLabels ... ),
179182 }
180183}
181184
0 commit comments