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  }