@@ -64,6 +64,8 @@ const (
6464 tunnelConnectorInfoMetricName MetricName = "cloudflare_tunnel_connector_info"
6565 tunnelConnectorActiveConnectionsMetricName MetricName = "cloudflare_tunnel_connector_active_connections"
6666 dnsFirewallQueryCountMetricName MetricName = "cloudflare_dns_firewall_query_count"
67+ kvRequestsMetricName MetricName = "cloudflare_kv_requests_count"
68+ kvLatencyMetricName MetricName = "cloudflare_kv_latency"
6769)
6870
6971type MetricsSet map [MetricName ]struct {}
@@ -336,6 +338,16 @@ var (
336338 Help : "Reports number of active connections for a Cloudflare Tunnel connector" ,
337339 }, []string {"account" , "tunnel_id" , "client_id" })
338340
341+ kvRequests = prometheus .NewGaugeVec (prometheus.GaugeOpts {
342+ Name : kvRequestsMetricName .String (),
343+ Help : "Number of KV operations by namespace and action type" ,
344+ }, []string {"namespace_name" , "action_type" , "account" })
345+
346+ kvLatency = prometheus .NewGaugeVec (prometheus.GaugeOpts {
347+ Name : kvLatencyMetricName .String (),
348+ Help : "KV operation latency quantiles (milliseconds)" ,
349+ }, []string {"namespace_name" , "action_type" , "account" , "quantile" })
350+
339351 dnsFirewallQueryCount = prometheus .NewGaugeVec (prometheus.GaugeOpts {
340352 Name : dnsFirewallQueryCountMetricName .String (),
341353 Help : "DNS Firewall query count by query type and response code" ,
@@ -388,6 +400,8 @@ func buildAllMetricsSet() MetricsSet {
388400 allMetricsSet .Add (tunnelConnectorInfoMetricName )
389401 allMetricsSet .Add (tunnelConnectorActiveConnectionsMetricName )
390402 allMetricsSet .Add (dnsFirewallQueryCountMetricName )
403+ allMetricsSet .Add (kvRequestsMetricName )
404+ allMetricsSet .Add (kvLatencyMetricName )
391405 return allMetricsSet
392406}
393407
@@ -537,6 +551,12 @@ func mustRegisterMetrics(deniedMetrics MetricsSet) {
537551 if ! deniedMetrics .Has (dnsFirewallQueryCountMetricName ) {
538552 prometheus .MustRegister (dnsFirewallQueryCount )
539553 }
554+ if ! deniedMetrics .Has (kvRequestsMetricName ) {
555+ prometheus .MustRegister (kvRequests )
556+ }
557+ if ! deniedMetrics .Has (kvLatencyMetricName ) {
558+ prometheus .MustRegister (kvLatency )
559+ }
540560}
541561
542562func fetchLoadblancerPoolsHealth (account cfaccounts.Account , wg * sync.WaitGroup ) {
@@ -607,6 +627,40 @@ func fetchWorkerAnalytics(account cfaccounts.Account, wg *sync.WaitGroup) {
607627 }
608628}
609629
630+ func fetchKVAnalytics (account cfaccounts.Account , wg * sync.WaitGroup ) {
631+ wg .Add (1 )
632+ defer wg .Done ()
633+
634+ namespaceMap , err := fetchKVNamespaces (account .ID )
635+ if err != nil {
636+ log .Error ("failed to fetch KV namespaces for account " , account .ID , ": " , err )
637+ return
638+ }
639+
640+ r , err := fetchKVOperations (account .ID )
641+ if err != nil {
642+ log .Error ("failed to fetch KV operations for account " , account .ID , ": " , err )
643+ return
644+ }
645+
646+ accountName := strings .ToLower (strings .ReplaceAll (account .Name , " " , "-" ))
647+
648+ for _ , a := range r .Viewer .Accounts {
649+ for _ , kv := range a .KvOperationsAdaptiveGroups {
650+ namespaceName := namespaceMap [kv .Dimensions .NamespaceID ]
651+ if namespaceName == "" {
652+ namespaceName = kv .Dimensions .NamespaceID
653+ }
654+
655+ kvRequests .With (prometheus.Labels {"namespace_name" : namespaceName , "action_type" : kv .Dimensions .ActionType , "account" : accountName }).Set (float64 (kv .Sum .Requests ))
656+ kvLatency .With (prometheus.Labels {"namespace_name" : namespaceName , "action_type" : kv .Dimensions .ActionType , "account" : accountName , "quantile" : "P50" }).Set (float64 (kv .Quantiles .LatencyMsP50 ))
657+ kvLatency .With (prometheus.Labels {"namespace_name" : namespaceName , "action_type" : kv .Dimensions .ActionType , "account" : accountName , "quantile" : "P75" }).Set (float64 (kv .Quantiles .LatencyMsP75 ))
658+ kvLatency .With (prometheus.Labels {"namespace_name" : namespaceName , "action_type" : kv .Dimensions .ActionType , "account" : accountName , "quantile" : "P99" }).Set (float64 (kv .Quantiles .LatencyMsP99 ))
659+ kvLatency .With (prometheus.Labels {"namespace_name" : namespaceName , "action_type" : kv .Dimensions .ActionType , "account" : accountName , "quantile" : "P999" }).Set (float64 (kv .Quantiles .LatencyMsP999 ))
660+ }
661+ }
662+ }
663+
610664func fetchLogpushAnalyticsForAccount (account cfaccounts.Account , wg * sync.WaitGroup ) {
611665 wg .Add (1 )
612666 defer wg .Done ()
0 commit comments