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  }