github.com/mentimeter/morty@v1.2.2-0.20221012065510-5596adecd154/mortems/reporter.go (about)

     1  package mortems
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"os"
     8  	"time"
     9  
    10  	datadog "github.com/DataDog/datadog-api-client-go/api/v1/datadog"
    11  )
    12  
    13  //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . ReportingService
    14  
    15  type ReportingService interface {
    16  	ReportSeverity(string) error
    17  	ReportDetect(detect time.Duration, severity string) error
    18  	ReportResolve(resolve time.Duration, severity string) error
    19  	ReportDowntime(downtime time.Duration, severity string) error
    20  }
    21  
    22  type DatadogReporter struct {
    23  	ctx       context.Context
    24  	apiClient *datadog.APIClient
    25  }
    26  
    27  func NewDatadogReporter() ReportingService {
    28  	ctx := datadog.NewDefaultContext(context.Background())
    29  	configuration := datadog.NewConfiguration()
    30  	apiClient := datadog.NewAPIClient(configuration)
    31  
    32  	return &DatadogReporter{
    33  		ctx:       ctx,
    34  		apiClient: apiClient,
    35  	}
    36  }
    37  
    38  func (d *DatadogReporter) ReportSeverity(severity string) error {
    39  	return d.sendMetric("post_mortems.severity", 1, []string{})
    40  }
    41  
    42  func (d *DatadogReporter) ReportDetect(detect time.Duration, severity string) error {
    43  	return d.sendMetric("post_mortems.detect", float64(detect.Minutes()), []string{fmt.Sprintf("severity:%s", severity)})
    44  }
    45  
    46  func (d *DatadogReporter) ReportResolve(resolve time.Duration, severity string) error {
    47  	return d.sendMetric("post_mortems.resolve", float64(resolve.Minutes()), []string{fmt.Sprintf("severity:%s", severity)})
    48  }
    49  
    50  func (d *DatadogReporter) ReportDowntime(downtime time.Duration, severity string) error {
    51  	return d.sendMetric("post_mortems.downtime", float64(downtime.Minutes()), []string{fmt.Sprintf("severity:%s", severity)})
    52  }
    53  
    54  func (d *DatadogReporter) sendMetric(name string, value float64, tags []string) error {
    55  	series := datadog.NewSeries(name, [][]float64{{float64(time.Now().Unix()), value}})
    56  	series.SetType("count")
    57  	series.SetTags(tags)
    58  	body := *datadog.NewMetricsPayload([]datadog.Series{*series})
    59  	resp, _, err := d.apiClient.MetricsApi.SubmitMetrics(d.ctx).Body(body).Execute()
    60  
    61  	// response from `SubmitMetrics`: IntakePayloadAccepted
    62  	responseContent, _ := json.MarshalIndent(resp, "", "  ")
    63  	fmt.Fprintf(os.Stdout, "Response from MetricsApi.SubmitMetrics:\n%s\n", responseContent)
    64  
    65  	return err
    66  }