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 }