github.com/Financial-Times/publish-availability-monitor@v1.12.0/metrics/graphite.go (about) 1 package metrics 2 3 import ( 4 "fmt" 5 "net" 6 "time" 7 8 "github.com/Financial-Times/go-logger/v2" 9 "github.com/Financial-Times/publish-availability-monitor/config" 10 ) 11 12 // GraphiteSender implements Destination interface to send PublishMetrics for capability E2E tests to Graphite. 13 type GraphiteSender struct { 14 graphiteAddress string 15 graphiteUUID string 16 environment string 17 log *logger.UPPLogger 18 } 19 20 // NewGraphiteSender returns a GraphiteSender. 21 func NewGraphiteSender(cfg *config.AppConfig, log *logger.UPPLogger) *GraphiteSender { 22 return &GraphiteSender{ 23 graphiteAddress: cfg.GraphiteAddress, 24 graphiteUUID: cfg.GraphiteUUID, 25 environment: cfg.Environment, 26 log: log, 27 } 28 } 29 30 // Send transforms a Publish metric to Graphite one and sends it to Graphite endpoint. 31 func (gs *GraphiteSender) Send(pm PublishMetric) { 32 if pm.Capability == nil { 33 gs.log.Errorf("Cannot send non-capability metric %s to Graphite", pm.Config.Alias) 34 return 35 } 36 37 metricPrefix := fmt.Sprintf("%s.%s.%s", gs.graphiteUUID, pm.Capability.Name, gs.environment) 38 statusMetricName := fmt.Sprintf("%s.%s", metricPrefix, "status") 39 var statusMetricValue int 40 if pm.PublishOK { 41 statusMetricValue = 1 42 } 43 statusMetric := fmt.Sprintf("%s %d %d\n", statusMetricName, statusMetricValue, time.Now().Unix()) 44 45 timeMetricName := fmt.Sprintf("%s.%s", metricPrefix, "time") 46 timeMetricValue := pm.PublishInterval.UpperBound 47 timeMetric := fmt.Sprintf("%s %d %d\n", timeMetricName, timeMetricValue, time.Now().Unix()) 48 49 conn, err := net.DialTimeout("tcp", gs.graphiteAddress, 10*time.Second) 50 if err != nil { 51 gs.log.WithError(err).Error("Cannot connect to Graphite") 52 return 53 } 54 defer conn.Close() 55 56 _, err = fmt.Fprint(conn, statusMetric, timeMetric) 57 if err != nil { 58 gs.log.WithError(err).Error("Cannot write Graphite metric") 59 } 60 }