aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go
blob: 2f0c6eac9a80d31f1134ec39314fdebd30c595e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
}