1package csm
2
3import (
4	"strconv"
5	"time"
6
7	"github.com/aws/aws-sdk-go/aws"
8)
9
10type metricTime time.Time
11
12func (t metricTime) MarshalJSON() ([]byte, error) {
13	ns := time.Duration(time.Time(t).UnixNano())
14	return []byte(strconv.FormatInt(int64(ns/time.Millisecond), 10)), nil
15}
16
17type metric struct {
18	ClientID  *string     `json:"ClientId,omitempty"`
19	API       *string     `json:"Api,omitempty"`
20	Service   *string     `json:"Service,omitempty"`
21	Timestamp *metricTime `json:"Timestamp,omitempty"`
22	Type      *string     `json:"Type,omitempty"`
23	Version   *int        `json:"Version,omitempty"`
24
25	AttemptCount *int `json:"AttemptCount,omitempty"`
26	Latency      *int `json:"Latency,omitempty"`
27
28	Fqdn           *string `json:"Fqdn,omitempty"`
29	UserAgent      *string `json:"UserAgent,omitempty"`
30	AttemptLatency *int    `json:"AttemptLatency,omitempty"`
31
32	SessionToken   *string `json:"SessionToken,omitempty"`
33	Region         *string `json:"Region,omitempty"`
34	AccessKey      *string `json:"AccessKey,omitempty"`
35	HTTPStatusCode *int    `json:"HttpStatusCode,omitempty"`
36	XAmzID2        *string `json:"XAmzId2,omitempty"`
37	XAmzRequestID  *string `json:"XAmznRequestId,omitempty"`
38
39	AWSException        *string `json:"AwsException,omitempty"`
40	AWSExceptionMessage *string `json:"AwsExceptionMessage,omitempty"`
41	SDKException        *string `json:"SdkException,omitempty"`
42	SDKExceptionMessage *string `json:"SdkExceptionMessage,omitempty"`
43
44	FinalHTTPStatusCode      *int    `json:"FinalHttpStatusCode,omitempty"`
45	FinalAWSException        *string `json:"FinalAwsException,omitempty"`
46	FinalAWSExceptionMessage *string `json:"FinalAwsExceptionMessage,omitempty"`
47	FinalSDKException        *string `json:"FinalSdkException,omitempty"`
48	FinalSDKExceptionMessage *string `json:"FinalSdkExceptionMessage,omitempty"`
49
50	DestinationIP    *string `json:"DestinationIp,omitempty"`
51	ConnectionReused *int    `json:"ConnectionReused,omitempty"`
52
53	AcquireConnectionLatency *int `json:"AcquireConnectionLatency,omitempty"`
54	ConnectLatency           *int `json:"ConnectLatency,omitempty"`
55	RequestLatency           *int `json:"RequestLatency,omitempty"`
56	DNSLatency               *int `json:"DnsLatency,omitempty"`
57	TCPLatency               *int `json:"TcpLatency,omitempty"`
58	SSLLatency               *int `json:"SslLatency,omitempty"`
59
60	MaxRetriesExceeded *int `json:"MaxRetriesExceeded,omitempty"`
61}
62
63func (m *metric) TruncateFields() {
64	m.ClientID = truncateString(m.ClientID, 255)
65	m.UserAgent = truncateString(m.UserAgent, 256)
66
67	m.AWSException = truncateString(m.AWSException, 128)
68	m.AWSExceptionMessage = truncateString(m.AWSExceptionMessage, 512)
69
70	m.SDKException = truncateString(m.SDKException, 128)
71	m.SDKExceptionMessage = truncateString(m.SDKExceptionMessage, 512)
72
73	m.FinalAWSException = truncateString(m.FinalAWSException, 128)
74	m.FinalAWSExceptionMessage = truncateString(m.FinalAWSExceptionMessage, 512)
75
76	m.FinalSDKException = truncateString(m.FinalSDKException, 128)
77	m.FinalSDKExceptionMessage = truncateString(m.FinalSDKExceptionMessage, 512)
78}
79
80func truncateString(v *string, l int) *string {
81	if v != nil && len(*v) > l {
82		nv := (*v)[:l]
83		return &nv
84	}
85
86	return v
87}
88
89func (m *metric) SetException(e metricException) {
90	switch te := e.(type) {
91	case awsException:
92		m.AWSException = aws.String(te.exception)
93		m.AWSExceptionMessage = aws.String(te.message)
94	case sdkException:
95		m.SDKException = aws.String(te.exception)
96		m.SDKExceptionMessage = aws.String(te.message)
97	}
98}
99
100func (m *metric) SetFinalException(e metricException) {
101	switch te := e.(type) {
102	case awsException:
103		m.FinalAWSException = aws.String(te.exception)
104		m.FinalAWSExceptionMessage = aws.String(te.message)
105	case sdkException:
106		m.FinalSDKException = aws.String(te.exception)
107		m.FinalSDKExceptionMessage = aws.String(te.message)
108	}
109}
110