From bfa22483febc1cd38bba3d682eb83581e7489c37 Mon Sep 17 00:00:00 2001 From: Micah Huber Date: Mon, 16 Dec 2019 08:59:09 -0500 Subject: [PATCH] Add mutex to datadog code that is not thread safe (#71) --- .gitignore | 4 +++- pkg/datadog/datadog.go | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2df48d4..2e49e6d 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,6 @@ local.sh .vscode -.vscode/* \ No newline at end of file +.vscode/* + +.envrc diff --git a/pkg/datadog/datadog.go b/pkg/datadog/datadog.go index ad04e3a..d44ddbe 100644 --- a/pkg/datadog/datadog.go +++ b/pkg/datadog/datadog.go @@ -22,6 +22,7 @@ import ( "github.com/fairwindsops/astro/pkg/metrics" log "github.com/sirupsen/logrus" "github.com/zorkian/go-datadog-api" + "sync" ) // ClientAPI defines the interface for the Datadog client, for testing purposes @@ -35,6 +36,7 @@ type ClientAPI interface { // DDMonitorManager is a higher-level wrapper around the Datadog API type DDMonitorManager struct { Datadog ClientAPI + mux sync.Mutex } var ddMonitorManagerInstance *DDMonitorManager @@ -54,11 +56,15 @@ func GetInstance() *DDMonitorManager { // It returns the Id of the monitor created or updated. func (ddman *DDMonitorManager) AddOrUpdate(monitor *datadog.Monitor) (*datadog.Monitor, error) { log.Infof("Update templated monitor:%v", *monitor.Name) + ddman.mux.Lock() + defer ddman.mux.Unlock() + // check if monitor exists ddMonitor, err := ddman.GetProvisionedMonitor(monitor) if err != nil { //monitor doesn't exist provisioned, err := ddman.Datadog.CreateMonitor(monitor) + if err != nil { metrics.DatadogErrCounter.Inc() log.Errorf("Error creating monitor %s: %s", *monitor.Name, err)