enable.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package csm
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. var (
  7. lock sync.Mutex
  8. )
  9. // Client side metric handler names
  10. const (
  11. APICallMetricHandlerName = "awscsm.SendAPICallMetric"
  12. APICallAttemptMetricHandlerName = "awscsm.SendAPICallAttemptMetric"
  13. )
  14. // Start will start the a long running go routine to capture
  15. // client side metrics. Calling start multiple time will only
  16. // start the metric listener once and will panic if a different
  17. // client ID or port is passed in.
  18. //
  19. // Example:
  20. // r, err := csm.Start("clientID", "127.0.0.1:8094")
  21. // if err != nil {
  22. // panic(fmt.Errorf("expected no error, but received %v", err))
  23. // }
  24. // sess := session.NewSession()
  25. // r.InjectHandlers(sess.Handlers)
  26. //
  27. // svc := s3.New(sess)
  28. // out, err := svc.GetObject(&s3.GetObjectInput{
  29. // Bucket: aws.String("bucket"),
  30. // Key: aws.String("key"),
  31. // })
  32. func Start(clientID string, url string) (*Reporter, error) {
  33. lock.Lock()
  34. defer lock.Unlock()
  35. if sender == nil {
  36. sender = newReporter(clientID, url)
  37. } else {
  38. if sender.clientID != clientID {
  39. panic(fmt.Errorf("inconsistent client IDs. %q was expected, but received %q", sender.clientID, clientID))
  40. }
  41. if sender.url != url {
  42. panic(fmt.Errorf("inconsistent URLs. %q was expected, but received %q", sender.url, url))
  43. }
  44. }
  45. if err := connect(url); err != nil {
  46. sender = nil
  47. return nil, err
  48. }
  49. return sender, nil
  50. }
  51. // Get will return a reporter if one exists, if one does not exist, nil will
  52. // be returned.
  53. func Get() *Reporter {
  54. lock.Lock()
  55. defer lock.Unlock()
  56. return sender
  57. }