github.com/go-graphite/carbonapi@v0.17.0/cmd/carbonapi/graphite_metrics.go (about)

     1  package main
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  	"time"
     7  
     8  	"github.com/go-graphite/carbonapi/cmd/carbonapi/config"
     9  	"github.com/go-graphite/carbonapi/cmd/carbonapi/http"
    10  
    11  	"github.com/cactus/go-statsd-client/v5/statsd"
    12  	"github.com/msaf1980/go-metrics"
    13  	"github.com/msaf1980/go-metrics/graphite"
    14  	"go.uber.org/zap"
    15  )
    16  
    17  var (
    18  	g *graphite.Graphite
    19  )
    20  
    21  func setupGraphiteMetrics(logger *zap.Logger) {
    22  	var host string
    23  	if envhost := os.Getenv("GRAPHITEHOST") + ":" + os.Getenv("GRAPHITEPORT"); envhost != ":" || config.Config.Graphite.Host != "" {
    24  		switch {
    25  		case envhost != ":" && config.Config.Graphite.Host != "":
    26  			host = config.Config.Graphite.Host
    27  		case envhost != ":":
    28  			host = envhost
    29  		case config.Config.Graphite.Host != "":
    30  			host = config.Config.Graphite.Host
    31  		}
    32  	}
    33  
    34  	logger.Info("starting carbonapi",
    35  		zap.String("build_version", BuildVersion),
    36  		zap.Any("config", config.Config),
    37  	)
    38  
    39  	if host != "" {
    40  		hostname, _ := os.Hostname()
    41  		hostname = strings.ReplaceAll(hostname, ".", "_")
    42  
    43  		prefix := config.Config.Graphite.Prefix
    44  
    45  		pattern := config.Config.Graphite.Pattern
    46  		pattern = strings.ReplaceAll(pattern, "{prefix}", prefix)
    47  		pattern = strings.ReplaceAll(pattern, "{fqdn}", hostname)
    48  
    49  		// register our metrics with graphite
    50  		g = graphite.New(config.Config.Graphite.Interval, pattern, host, 10*time.Second)
    51  
    52  		// StatsD client
    53  		if config.Config.Graphite.Statsd != "" && config.Config.Upstreams.ExtendedStat {
    54  			var err error
    55  			config := &statsd.ClientConfig{
    56  				Address:       config.Config.Graphite.Statsd,
    57  				Prefix:        pattern,
    58  				ResInterval:   5 * time.Minute,
    59  				UseBuffered:   true,
    60  				FlushInterval: 300 * time.Millisecond,
    61  			}
    62  			http.Gstatsd, err = statsd.NewClientWithConfig(config)
    63  			if err != nil {
    64  				logger.Error("statsd init", zap.Error(err))
    65  			}
    66  		}
    67  
    68  		if http.Gstatsd == nil {
    69  			http.Gstatsd = http.NullSender{}
    70  		}
    71  
    72  		metrics.Register("request_cache_hits", http.ApiMetrics.RequestCacheHits)
    73  		metrics.Register("request_cache_misses", http.ApiMetrics.RequestCacheMisses)
    74  		metrics.Register("request_cache_overhead_ns", http.ApiMetrics.RequestsCacheOverheadNS)
    75  		metrics.Register("backend_cache_hits", http.ApiMetrics.BackendCacheHits)
    76  		metrics.Register("backend_cache_misses", http.ApiMetrics.BackendCacheMisses)
    77  
    78  		if config.Config.Upstreams.ExtendedStat {
    79  			metrics.Register("requests_status_code.200", http.ApiMetrics.Requests200)
    80  			metrics.Register("requests_status_code.400", http.ApiMetrics.Requests400)
    81  			metrics.Register("requests_status_code.403", http.ApiMetrics.Requests403)
    82  			metrics.Register("requests_status_code.4xx", http.ApiMetrics.Requestsxxx)
    83  			metrics.Register("requests_status_code.500", http.ApiMetrics.Requests500)
    84  			metrics.Register("requests_status_code.503", http.ApiMetrics.Requests503)
    85  			metrics.Register("requests_status_code.5xx", http.ApiMetrics.Requests5xx)
    86  		}
    87  
    88  		// requests histogram
    89  		metrics.Register("requests", http.ApiMetrics.RequestsH)
    90  
    91  		metrics.Register("find_requests", http.ApiMetrics.FindRequests)
    92  		metrics.Register("render_requests", http.ApiMetrics.RenderRequests)
    93  
    94  		if http.ApiMetrics.MemcacheTimeouts != nil {
    95  			metrics.Register("memcache_timeouts", http.ApiMetrics.MemcacheTimeouts)
    96  		}
    97  
    98  		if http.ApiMetrics.CacheSize != nil {
    99  			metrics.Register("cache_size", http.ApiMetrics.CacheSize)
   100  			metrics.Register("cache_items", http.ApiMetrics.CacheItems)
   101  		}
   102  
   103  		metrics.Register("zipper.find_requests", http.ZipperMetrics.FindRequests)
   104  		metrics.Register("zipper.find_errors", http.ZipperMetrics.FindErrors)
   105  
   106  		metrics.Register("zipper.render_requests", http.ZipperMetrics.RenderRequests)
   107  		metrics.Register("zipper.render_errors", http.ZipperMetrics.RenderErrors)
   108  
   109  		metrics.Register("zipper.info_requests", http.ZipperMetrics.InfoRequests)
   110  		metrics.Register("zipper.info_errors", http.ZipperMetrics.InfoErrors)
   111  
   112  		metrics.Register("zipper.timeouts", http.ZipperMetrics.Timeouts)
   113  
   114  		metrics.Register("zipper.cache_hits", http.ZipperMetrics.CacheHits)
   115  		metrics.Register("zipper.cache_misses", http.ZipperMetrics.CacheMisses)
   116  
   117  		metrics.RegisterRuntimeMemStats(nil)
   118  		go metrics.CaptureRuntimeMemStats(config.Config.Graphite.Interval)
   119  
   120  		g.Start(nil)
   121  	}
   122  }