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