5
5
"fmt"
6
6
"time"
7
7
8
- "github.com/aws/aws-sdk-go/aws"
9
- "github.com/aws/aws-sdk-go/aws/session"
10
- "github.com/aws/aws-sdk-go/service/cloudwatchlogs"
8
+ awsV2 "github.com/aws/aws-sdk-go-v2/aws"
9
+ cloudwatchlogsV2 "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs"
11
10
"github.com/go-kit/log"
12
11
"github.com/go-kit/log/level"
13
12
"github.com/prometheus/client_golang/prometheus"
@@ -19,14 +18,14 @@ import (
19
18
type scraper struct {
20
19
instances []sessions.Instance
21
20
logStreamNames []string
22
- svc * cloudwatchlogs. CloudWatchLogs
21
+ svc * cloudwatchlogsV2. Client
23
22
nextStartTime time.Time
24
23
logger log.Logger
25
24
26
25
testDisallowUnknownFields bool // for tests only
27
26
}
28
27
29
- func newScraper (session * session. Session , instances []sessions.Instance , logger log.Logger ) * scraper {
28
+ func newScraper (cfg awsV2. Config , instances []sessions.Instance , logger log.Logger ) * scraper {
30
29
logStreamNames := make ([]string , 0 , len (instances ))
31
30
for _ , instance := range instances {
32
31
logStreamNames = append (logStreamNames , instance .ResourceID )
@@ -35,7 +34,7 @@ func newScraper(session *session.Session, instances []sessions.Instance, logger
35
34
return & scraper {
36
35
instances : instances ,
37
36
logStreamNames : logStreamNames ,
38
- svc : cloudwatchlogs . New ( session ),
37
+ svc : cloudwatchlogsV2 . NewFromConfig ( cfg ),
39
38
nextStartTime : time .Now ().Add (- 3 * time .Minute ).Round (0 ), // strip monotonic clock reading
40
39
logger : log .With (logger , "component" , "enhanced" ),
41
40
}
@@ -63,7 +62,6 @@ func (s *scraper) start(ctx context.Context, interval time.Duration, ch chan<- m
63
62
64
63
// scrape performs a single scrape.
65
64
func (s * scraper ) scrape (ctx context.Context ) (map [string ][]prometheus.Metric , map [string ]string ) {
66
-
67
65
allMetrics := make (map [string ]map [time.Time ][]prometheus.Metric ) // ResourceID -> event timestamp -> metrics
68
66
allMessages := make (map [string ]map [time.Time ]string ) // ResourceID -> event timestamp -> message
69
67
@@ -77,26 +75,31 @@ func (s *scraper) scrape(ctx context.Context) (map[string][]prometheus.Metric, m
77
75
sliceEnd = streamCount
78
76
}
79
77
80
- input := & cloudwatchlogs .FilterLogEventsInput {
81
- LogGroupName : aws .String ("RDSOSMetrics" ),
82
- LogStreamNames : aws . StringSlice ( s .logStreamNames [sliceStart :sliceEnd ]) ,
83
- StartTime : aws .Int64 (aws . TimeUnixMilli ( s .nextStartTime )),
78
+ input := & cloudwatchlogsV2 .FilterLogEventsInput {
79
+ LogGroupName : awsV2 .String ("RDSOSMetrics" ),
80
+ LogStreamNames : s .logStreamNames [sliceStart :sliceEnd ],
81
+ StartTime : awsV2 .Int64 (s .nextStartTime . UnixMilli ( )),
84
82
}
85
83
86
84
level .Debug (log .With (s .logger , "next_start" , s .nextStartTime .UTC (), "since_last" , time .Since (s .nextStartTime ))).Log ("msg" , "Requesting metrics" )
87
85
88
- // collect all returned events and metrics/messages
89
- collectAllMetrics := func (output * cloudwatchlogs.FilterLogEventsOutput , lastPage bool ) bool {
86
+ paginator := cloudwatchlogsV2 .NewFilterLogEventsPaginator (s .svc , input )
87
+ for paginator .HasMorePages () {
88
+ output , err := paginator .NextPage (ctx )
89
+ if err != nil {
90
+ level .Error (s .logger ).Log ("msg" , "Failed to filter log events." , "error" , err )
91
+ break
92
+ }
90
93
for _ , event := range output .Events {
91
94
l := log .With (s .logger ,
92
- "EventId" , * event .EventId ,
93
- "LogStreamName" , * event .LogStreamName ,
94
- "Timestamp" , aws . MillisecondsTimeValue ( event .Timestamp ).UTC (),
95
- "IngestionTime" , aws . MillisecondsTimeValue ( event .IngestionTime ).UTC ())
95
+ "EventId" , awsV2 . ToString ( event .EventId ) ,
96
+ "LogStreamName" , awsV2 . ToString ( event .LogStreamName ) ,
97
+ "Timestamp" , time . UnixMilli ( awsV2 . ToInt64 ( event .Timestamp ) ).UTC (),
98
+ "IngestionTime" , time . UnixMilli ( awsV2 . ToInt64 ( event .IngestionTime ) ).UTC ())
96
99
97
100
var instance * sessions.Instance
98
101
for _ , i := range s .instances {
99
- if i .ResourceID == * event .LogStreamName {
102
+ if i .ResourceID == awsV2 . ToString ( event .LogStreamName ) {
100
103
instance = & i
101
104
break
102
105
}
@@ -112,8 +115,7 @@ func (s *scraper) scrape(ctx context.Context) (map[string][]prometheus.Metric, m
112
115
}
113
116
l = log .With (l , "region" , instance .Region , "instance" , instance .Instance )
114
117
115
- // l.Debugf("Message:\n%s", *event.Message)
116
- osMetrics , err := parseOSMetrics ([]byte (* event .Message ), s .testDisallowUnknownFields )
118
+ osMetrics , err := parseOSMetrics ([]byte (awsV2 .ToString (event .Message )), s .testDisallowUnknownFields )
117
119
if err != nil {
118
120
// only for tests
119
121
if s .testDisallowUnknownFields {
@@ -123,9 +125,8 @@ func (s *scraper) scrape(ctx context.Context) (map[string][]prometheus.Metric, m
123
125
level .Error (l ).Log ("msg" , "Failed to parse metrics." , "error" , err )
124
126
continue
125
127
}
126
- // l.Debugf("OS Metrics:\n%#v", osMetrics)
127
128
128
- timestamp := aws . MillisecondsTimeValue ( event .Timestamp ).UTC ()
129
+ timestamp := time . UnixMilli ( awsV2 . ToInt64 ( event .Timestamp ) ).UTC ()
129
130
level .Debug (l ).Log ("msg" , fmt .Sprintf ("Timestamp from message: %s; from event: %s." , osMetrics .Timestamp .UTC (), timestamp ))
130
131
131
132
if allMetrics [instance .ResourceID ] == nil {
@@ -136,13 +137,8 @@ func (s *scraper) scrape(ctx context.Context) (map[string][]prometheus.Metric, m
136
137
if allMessages [instance .ResourceID ] == nil {
137
138
allMessages [instance .ResourceID ] = make (map [time.Time ]string )
138
139
}
139
- allMessages [instance.ResourceID ][timestamp ] = * event .Message
140
+ allMessages [instance.ResourceID ][timestamp ] = awsV2 . ToString ( event .Message )
140
141
}
141
-
142
- return true // continue pagination
143
- }
144
- if err := s .svc .FilterLogEventsPagesWithContext (ctx , input , collectAllMetrics ); err != nil {
145
- level .Error (s .logger ).Log ("msg" , "Failed to filter log events." , "error" , err )
146
142
}
147
143
}
148
144
// get better times
0 commit comments