@@ -26,6 +26,8 @@ const (
2626 zoneRequestContentTypeMetricName MetricName = "cloudflare_zone_requests_content_type"
2727 zoneRequestCountryMetricName MetricName = "cloudflare_zone_requests_country"
2828 zoneRequestHTTPStatusMetricName MetricName = "cloudflare_zone_requests_status"
29+ zoneRequestStatus5mRatioMetricName MetricName = "cloudflare_zone_requests_status_5m_ratio"
30+ zoneRequestEdgeTTFB5mQuantilesMetricName MetricName = "cloudflare_zone_requests_edge_ttfb_5m_quantiles"
2931 zoneRequestBrowserMapMetricName MetricName = "cloudflare_zone_requests_browser_map_page_views_count"
3032 zoneRequestOriginStatusCountryHostMetricName MetricName = "cloudflare_zone_requests_origin_status_country_host"
3133 zoneRequestStatusCountryHostMetricName MetricName = "cloudflare_zone_requests_status_country_host"
@@ -112,6 +114,18 @@ var (
112114 }, []string {"zone" , "account" , "status" },
113115 )
114116
117+ zoneRequestStatus5mRatio = prometheus .NewGaugeVec (prometheus.GaugeOpts {
118+ Name : zoneRequestStatus5mRatioMetricName .String (),
119+ Help : "Ratio of 4xx and 5xx responses over the past 5 minutes" ,
120+ }, []string {"zone" , "account" , "origin_ip" , "status_group" },
121+ )
122+
123+ zoneRequestEdgeTTFB5mQuantiles = prometheus .NewGaugeVec (prometheus.GaugeOpts {
124+ Name : zoneRequestEdgeTTFB5mQuantilesMetricName .String (),
125+ Help : "Time to first byte (TTFB) quantiles over the past 5 minutes" ,
126+ }, []string {"zone" , "account" , "origin_ip" , "quantile" },
127+ )
128+
115129 zoneRequestBrowserMap = prometheus .NewCounterVec (prometheus.CounterOpts {
116130 Name : zoneRequestBrowserMapMetricName .String (),
117131 Help : "Number of successful requests for HTML pages per zone" ,
@@ -330,6 +344,8 @@ func buildAllMetricsSet() MetricsSet {
330344 allMetricsSet .Add (zoneRequestContentTypeMetricName )
331345 allMetricsSet .Add (zoneRequestCountryMetricName )
332346 allMetricsSet .Add (zoneRequestHTTPStatusMetricName )
347+ allMetricsSet .Add (zoneRequestStatus5mRatioMetricName )
348+ allMetricsSet .Add (zoneRequestEdgeTTFB5mQuantilesMetricName )
333349 allMetricsSet .Add (zoneRequestBrowserMapMetricName )
334350 allMetricsSet .Add (zoneRequestOriginStatusCountryHostMetricName )
335351 allMetricsSet .Add (zoneRequestStatusCountryHostMetricName )
@@ -399,6 +415,12 @@ func mustRegisterMetrics(deniedMetrics MetricsSet) {
399415 if ! deniedMetrics .Has (zoneRequestHTTPStatusMetricName ) {
400416 prometheus .MustRegister (zoneRequestHTTPStatus )
401417 }
418+ if ! deniedMetrics .Has (zoneRequestStatus5mRatioMetricName ) {
419+ prometheus .MustRegister (zoneRequestStatus5mRatio )
420+ }
421+ if ! deniedMetrics .Has (zoneRequestEdgeTTFB5mQuantilesMetricName ) {
422+ prometheus .MustRegister (zoneRequestEdgeTTFB5mQuantiles )
423+ }
402424 if ! deniedMetrics .Has (zoneRequestBrowserMapMetricName ) {
403425 prometheus .MustRegister (zoneRequestBrowserMap )
404426 }
@@ -706,6 +728,75 @@ func fetchZoneColocationAnalytics(zones []cfzones.Zone, wg *sync.WaitGroup, deni
706728 }
707729}
708730
731+ func fetchZoneAdaptiveHTTPStats (zones []cfzones.Zone , wg * sync.WaitGroup , deniedMetricsSet MetricsSet ) {
732+ wg .Add (1 )
733+ defer wg .Done ()
734+
735+ if deniedMetricsSet .Has (zoneRequestStatus5mRatioMetricName ) && deniedMetricsSet .Has (zoneRequestEdgeTTFB5mQuantilesMetricName ) {
736+ return
737+ }
738+
739+ zoneIDs := extractZoneIDs (zones )
740+ if len (zoneIDs ) == 0 {
741+ return
742+ }
743+
744+ r , err := fetchZone5mStats (zoneIDs )
745+ if err != nil {
746+ log .Error ("failed to fetch analyzed zone 5-minute stats: " , err )
747+ return
748+ }
749+
750+ for _ , z := range r .Viewer .Zones {
751+ name , account := findZoneAccountName (zones , z .ZoneTag )
752+
753+ if ! deniedMetricsSet .Has (zoneRequestStatus5mRatioMetricName ) {
754+ for _ , g := range z .HTTPRequestsAdaptiveGroups {
755+ zoneRequestStatus5mRatio .With (
756+ prometheus.Labels {
757+ "zone" : name ,
758+ "account" : account ,
759+ "origin_ip" : g .Dimensions .OriginIP ,
760+ "status_group" : "4xx" ,
761+ }).Add (float64 (g .Ratio .Status4xx ))
762+ zoneRequestStatus5mRatio .With (
763+ prometheus.Labels {
764+ "zone" : name ,
765+ "account" : account ,
766+ "origin_ip" : g .Dimensions .OriginIP ,
767+ "status_group" : "5xx" ,
768+ }).Add (float64 (g .Ratio .Status5xx ))
769+ }
770+ }
771+
772+ if ! deniedMetricsSet .Has (zoneRequestEdgeTTFB5mQuantilesMetricName ) {
773+ for _ , g := range z .HTTPRequestsAdaptiveGroups {
774+ zoneRequestEdgeTTFB5mQuantiles .With (
775+ prometheus.Labels {
776+ "zone" : name ,
777+ "account" : account ,
778+ "origin_ip" : g .Dimensions .OriginIP ,
779+ "quantile" : "P50" ,
780+ }).Set (float64 (g .Quantiles .EdgeTimeToFirstByteMsP50 ))
781+ zoneRequestEdgeTTFB5mQuantiles .With (
782+ prometheus.Labels {
783+ "zone" : name ,
784+ "account" : account ,
785+ "origin_ip" : g .Dimensions .OriginIP ,
786+ "quantile" : "P95" ,
787+ }).Set (float64 (g .Quantiles .EdgeTimeToFirstByteMsP95 ))
788+ zoneRequestEdgeTTFB5mQuantiles .With (
789+ prometheus.Labels {
790+ "zone" : name ,
791+ "account" : account ,
792+ "origin_ip" : g .Dimensions .OriginIP ,
793+ "quantile" : "P99" ,
794+ }).Set (float64 (g .Quantiles .EdgeTimeToFirstByteMsP99 ))
795+ }
796+ }
797+ }
798+ }
799+
709800func fetchZoneAnalytics (zones []cfzones.Zone , wg * sync.WaitGroup , deniedMetricsSet MetricsSet ) {
710801 wg .Add (1 )
711802 defer wg .Done ()
0 commit comments