package csm import ( "fmt" "sync" ) var ( lock sync.Mutex ) // Client side metric handler names const ( APICallMetricHandlerName = "awscsm.SendAPICallMetric" APICallAttemptMetricHandlerName = "awscsm.SendAPICallAttemptMetric" ) // Start will start the a long running go routine to capture // client side metrics. Calling start multiple time will only // start the metric listener once and will panic if a different // client ID or port is passed in. // // Example: // r, err := csm.Start("clientID", "127.0.0.1:8094") // if err != nil { // panic(fmt.Errorf("expected no error, but received %v", err)) // } // sess := session.NewSession() // r.InjectHandlers(sess.Handlers) // // svc := s3.New(sess) // out, err := svc.GetObject(&s3.GetObjectInput{ // Bucket: aws.String("bucket"), // Key: aws.String("key"), // }) func Start(clientID string, url string) (*Reporter, error) { lock.Lock() defer lock.Unlock() if sender == nil { sender = newReporter(clientID, url) } else { if sender.clientID != clientID { panic(fmt.Errorf("inconsistent client IDs. %q was expected, but received %q", sender.clientID, clientID)) } if sender.url != url { panic(fmt.Errorf("inconsistent URLs. %q was expected, but received %q", sender.url, url)) } } if err := connect(url); err != nil { sender = nil return nil, err } return sender, nil } // Get will return a reporter if one exists, if one does not exist, nil will // be returned. func Get() *Reporter { lock.Lock() defer lock.Unlock() return sender }