github.com/go-graphite/carbonapi@v0.17.0/cmd/carbonapi/http/metrics.go (about) 1 package http 2 3 import ( 4 "fmt" 5 6 "github.com/go-graphite/carbonapi/cache" 7 "github.com/go-graphite/carbonapi/cmd/carbonapi/config" 8 zipperTypes "github.com/go-graphite/carbonapi/zipper/types" 9 "github.com/msaf1980/go-metrics" 10 "go.uber.org/zap" 11 ) 12 13 var ApiMetrics = struct { 14 RequestCacheHits metrics.Counter 15 RequestCacheMisses metrics.Counter 16 BackendCacheHits metrics.Counter 17 BackendCacheMisses metrics.Counter 18 RequestsCacheOverheadNS metrics.Counter 19 RequestsH metrics.Histogram 20 Requests200 metrics.Counter 21 Requests400 metrics.Counter 22 Requests403 metrics.Counter 23 Requestsxxx metrics.Counter // failback other 4xx statuses 24 Requests500 metrics.Counter 25 Requests503 metrics.Counter 26 Requests5xx metrics.Counter // failback other 5xx statuses 27 28 RenderRequests metrics.Counter 29 30 FindRequests metrics.Counter 31 32 MemcacheTimeouts metrics.UGauge 33 34 CacheSize metrics.UGauge 35 CacheItems metrics.Gauge 36 }{ 37 RenderRequests: metrics.NewCounter(), 38 RequestCacheHits: metrics.NewCounter(), 39 RequestCacheMisses: metrics.NewCounter(), 40 BackendCacheHits: metrics.NewCounter(), 41 BackendCacheMisses: metrics.NewCounter(), 42 RequestsCacheOverheadNS: metrics.NewCounter(), 43 44 Requests200: metrics.NewCounter(), 45 Requests400: metrics.NewCounter(), 46 Requests403: metrics.NewCounter(), 47 Requestsxxx: metrics.NewCounter(), 48 Requests500: metrics.NewCounter(), 49 Requests503: metrics.NewCounter(), 50 Requests5xx: metrics.NewCounter(), 51 52 FindRequests: metrics.NewCounter(), 53 } 54 55 var ZipperMetrics = struct { 56 FindRequests metrics.Counter 57 FindTimeouts metrics.Counter 58 FindErrors metrics.Counter 59 60 SearchRequests metrics.Counter 61 62 RenderRequests metrics.Counter 63 RenderTimeouts metrics.Counter 64 RenderErrors metrics.Counter 65 66 InfoRequests metrics.Counter 67 InfoTimeouts metrics.Counter 68 InfoErrors metrics.Counter 69 70 Timeouts metrics.Counter 71 72 CacheMisses metrics.Counter 73 CacheHits metrics.Counter 74 }{ 75 FindRequests: metrics.NewCounter(), 76 FindTimeouts: metrics.NewCounter(), 77 FindErrors: metrics.NewCounter(), 78 79 SearchRequests: metrics.NewCounter(), 80 81 RenderRequests: metrics.NewCounter(), 82 RenderTimeouts: metrics.NewCounter(), 83 RenderErrors: metrics.NewCounter(), 84 85 InfoRequests: metrics.NewCounter(), 86 InfoTimeouts: metrics.NewCounter(), 87 InfoErrors: metrics.NewCounter(), 88 89 Timeouts: metrics.NewCounter(), 90 91 CacheHits: metrics.NewCounter(), 92 CacheMisses: metrics.NewCounter(), 93 } 94 95 func ZipperStats(stats *zipperTypes.Stats) { 96 if stats == nil { 97 return 98 } 99 ZipperMetrics.Timeouts.Add(stats.Timeouts) 100 ZipperMetrics.FindRequests.Add(stats.FindRequests) 101 ZipperMetrics.FindTimeouts.Add(stats.FindTimeouts) 102 ZipperMetrics.FindErrors.Add(stats.FindErrors) 103 ZipperMetrics.RenderRequests.Add(stats.RenderRequests) 104 ZipperMetrics.RenderTimeouts.Add(stats.RenderTimeouts) 105 ZipperMetrics.RenderErrors.Add(stats.RenderErrors) 106 ZipperMetrics.InfoRequests.Add(stats.InfoRequests) 107 ZipperMetrics.InfoTimeouts.Add(stats.InfoTimeouts) 108 ZipperMetrics.InfoErrors.Add(stats.InfoErrors) 109 ZipperMetrics.SearchRequests.Add(stats.SearchRequests) 110 ZipperMetrics.CacheMisses.Add(stats.CacheMisses) 111 ZipperMetrics.CacheHits.Add(stats.CacheHits) 112 } 113 114 func SetupMetrics(logger *zap.Logger) { 115 switch config.Config.ResponseCacheConfig.Type { 116 case "memcache": 117 mcache := config.Config.ResponseCache.(*cache.MemcachedCache) 118 119 ApiMetrics.MemcacheTimeouts = metrics.NewFunctionalUGauge(mcache.Timeouts) 120 case "mem": 121 qcache := config.Config.ResponseCache.(*cache.ExpireCache) 122 123 ApiMetrics.CacheSize = metrics.NewFunctionalUGauge(qcache.Size) 124 ApiMetrics.CacheItems = metrics.NewFunctionalGauge(func() int64 { 125 return int64(qcache.Items()) 126 }) 127 default: 128 } 129 130 ApiMetrics.RequestsH = initRequestsHistogram() 131 } 132 133 func initRequestsHistogram() metrics.Histogram { 134 if config.Config.Upstreams.SumBuckets { 135 if len(config.Config.Upstreams.BucketsWidth) > 0 { 136 labels := make([]string, len(config.Config.Upstreams.BucketsWidth)+1) 137 138 for i := 0; i <= len(config.Config.Upstreams.BucketsWidth); i++ { 139 if i >= len(config.Config.Upstreams.BucketsLabels) || config.Config.Upstreams.BucketsLabels[i] == "" { 140 if i < len(config.Config.Upstreams.BucketsWidth) { 141 labels[i] = fmt.Sprintf("_to_%dms", config.Config.Upstreams.BucketsWidth[i]) 142 } else { 143 labels[i] = "_to_inf" 144 } 145 } else { 146 labels[i] = config.Config.Upstreams.BucketsLabels[i] 147 } 148 } 149 return metrics.NewVSumHistogram(config.Config.Upstreams.BucketsWidth, labels). 150 SetNameTotal("") 151 } else { 152 labels := make([]string, config.Config.Upstreams.Buckets+1) 153 154 for i := 0; i <= config.Config.Upstreams.Buckets; i++ { 155 labels[i] = fmt.Sprintf("_to_%dms", (i+1)*100) 156 } 157 return metrics.NewFixedSumHistogram(100, int64(config.Config.Upstreams.Buckets)*100, 100). 158 SetLabels(labels). 159 SetNameTotal("") 160 } 161 } else if len(config.Config.Upstreams.BucketsWidth) > 0 { 162 labels := make([]string, len(config.Config.Upstreams.BucketsWidth)+1) 163 164 for i := 0; i <= len(config.Config.Upstreams.BucketsWidth); i++ { 165 if i >= len(config.Config.Upstreams.BucketsLabels) || config.Config.Upstreams.BucketsLabels[i] == "" { 166 if i == 0 { 167 labels[i] = fmt.Sprintf("_in_0ms_to_%dms", config.Config.Upstreams.BucketsWidth[0]) 168 } else if i < len(config.Config.Upstreams.BucketsWidth) { 169 labels[i] = fmt.Sprintf("_in_%dms_to_%dms", config.Config.Upstreams.BucketsWidth[i-1], config.Config.Upstreams.BucketsWidth[i]) 170 } else { 171 labels[i] = fmt.Sprintf("_in_%dms_to_inf", config.Config.Upstreams.BucketsWidth[i-1]) 172 } 173 } else { 174 labels[i] = config.Config.Upstreams.BucketsLabels[i] 175 } 176 } 177 return metrics.NewVSumHistogram(config.Config.Upstreams.BucketsWidth, labels).SetNameTotal("") 178 } else { 179 labels := make([]string, config.Config.Upstreams.Buckets+1) 180 181 for i := 0; i <= config.Config.Upstreams.Buckets; i++ { 182 labels[i] = fmt.Sprintf("_in_%dms_to_%dms", i*100, (i+1)*100) 183 } 184 return metrics.NewFixedSumHistogram(100, int64(config.Config.Upstreams.Buckets)*100, 100). 185 SetLabels(labels). 186 SetNameTotal("") 187 } 188 }