github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/cmd/metrics/graphite.go (about)

     1  package metrics
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"time"
     7  
     8  	"github.com/marpaia/graphite-golang"
     9  )
    10  
    11  const (
    12  	graphitePort = 3341
    13  )
    14  
    15  type graphiteMetrics struct {
    16  	graphiteHost   string
    17  	PkgName        string
    18  	CmdName        string
    19  	SubCmdName     string
    20  	StartTimestamp time.Time
    21  	UserPartition  uint8
    22  }
    23  
    24  func NewGraphiteMetricsCollector(host string) Metrics {
    25  	return &graphiteMetrics{
    26  		graphiteHost: host,
    27  	}
    28  }
    29  
    30  func (metrics *graphiteMetrics) Collect(uid uint8, repo, pkg, group, name string) error {
    31  	if group == "" {
    32  		return fmt.Errorf("unknown command")
    33  	}
    34  
    35  	metrics.PkgName = pkg
    36  	metrics.CmdName = group
    37  	metrics.SubCmdName = name
    38  	metrics.StartTimestamp = time.Now()
    39  	metrics.UserPartition = uid
    40  
    41  	return nil
    42  }
    43  
    44  func (metrics *graphiteMetrics) Send(cmdExitCode int, cmdError error) error {
    45  	duration := time.Now().UnixNano() - metrics.StartTimestamp.UnixNano()
    46  	graphiteClient, err := graphite.GraphiteFactory("udp", metrics.graphiteHost, graphitePort, metrics.prefix())
    47  	if err != nil {
    48  		return fmt.Errorf("cannot create the graphite client: %v", err)
    49  	}
    50  
    51  	graphiteMetrics := []graphite.Metric{
    52  		graphite.NewMetric("duration", strconv.FormatInt(duration, 10), metrics.StartTimestamp.Unix()),
    53  		graphite.NewMetric("count", "1", metrics.StartTimestamp.Unix()),
    54  	}
    55  
    56  	if cmdError != nil || cmdExitCode != 0 {
    57  		graphiteMetrics = append(graphiteMetrics, graphite.NewMetric("ko", "1", metrics.StartTimestamp.Unix()))
    58  	} else {
    59  		graphiteMetrics = append(graphiteMetrics, graphite.NewMetric("ok", "1", metrics.StartTimestamp.Unix()))
    60  	}
    61  
    62  	err = graphiteClient.SendMetrics(graphiteMetrics)
    63  
    64  	return err
    65  }
    66  
    67  func (metrics *graphiteMetrics) prefix() string {
    68  	return fmt.Sprintf("devtools.cdt.%s.%s.%s.%d", metrics.PkgName, metrics.CmdName, metrics.SubCmdName, metrics.UserPartition)
    69  }