4
4
"bytes"
5
5
"compress/gzip"
6
6
"context"
7
+ "encoding/json"
7
8
"io"
9
+ "log"
8
10
"time"
9
11
10
12
"github.com/aws/aws-lambda-go/events"
@@ -13,36 +15,34 @@ import (
13
15
"github.com/grafana/loki/pkg/logproto"
14
16
)
15
17
16
- func parseKinesisEvent (ctx context.Context , b batchIf , ev * events.KinesisEvent ) error {
18
+ func parseKinesisEvent (ctx context.Context , b * batch , ev * events.KinesisEvent ) error {
17
19
if ev == nil {
18
20
return nil
19
21
}
20
22
21
- for _ , record := range ev .Records {
22
- timestamp := time .Unix (record .Kinesis .ApproximateArrivalTimestamp .Unix (), 0 )
23
-
24
- labels := model.LabelSet {
25
- model .LabelName ("__aws_log_type" ): model .LabelValue ("kinesis" ),
26
- model .LabelName ("__aws_kinesis_event_source_arn" ): model .LabelValue (record .EventSourceArn ),
27
- }
28
-
29
- labels = applyLabels (labels )
23
+ var data []byte
24
+ var recordData events.CloudwatchLogsData
25
+ var err error
30
26
31
- // Check if the data is gzipped by inspecting the 'data' field
27
+ for _ , record := range ev . Records {
32
28
if isGzipped (record .Kinesis .Data ) {
33
- uncompressedData , err : = ungzipData (record .Kinesis .Data )
29
+ data , err = ungzipData (record .Kinesis .Data )
34
30
if err != nil {
35
- return err
31
+ log . Printf ( "Error decompressing data: %v" , err )
36
32
}
37
- b .add (ctx , entry {labels , logproto.Entry {
38
- Line : string (uncompressedData ),
39
- Timestamp : timestamp ,
40
- }})
41
33
} else {
42
- b .add (ctx , entry {labels , logproto.Entry {
43
- Line : string (record .Kinesis .Data ),
44
- Timestamp : timestamp ,
45
- }})
34
+ data = record .Kinesis .Data
35
+ }
36
+
37
+ recordData , err = unmarshalData (data )
38
+ if err != nil {
39
+ log .Printf ("Error unmarshalling data: %v" , err )
40
+ }
41
+
42
+ labels := createLabels (record , recordData )
43
+
44
+ if err := processLogEvents (ctx , b , recordData .LogEvents , labels ); err != nil {
45
+ return err
46
46
}
47
47
}
48
48
@@ -79,3 +79,39 @@ func ungzipData(data []byte) ([]byte, error) {
79
79
80
80
return io .ReadAll (reader )
81
81
}
82
+
83
+ func unmarshalData (data []byte ) (events.CloudwatchLogsData , error ) {
84
+ var recordData events.CloudwatchLogsData
85
+ err := json .Unmarshal (data , & recordData )
86
+ return recordData , err
87
+ }
88
+
89
+ func createLabels (record events.KinesisEventRecord , recordData events.CloudwatchLogsData ) model.LabelSet {
90
+ labels := model.LabelSet {
91
+ model .LabelName ("__aws_log_type" ): model .LabelValue ("kinesis" ),
92
+ model .LabelName ("__aws_kinesis_event_source_arn" ): model .LabelValue (record .EventSourceArn ),
93
+ model .LabelName ("__aws_cloudwatch_log_group" ): model .LabelValue (recordData .LogGroup ),
94
+ model .LabelName ("__aws_cloudwatch_owner" ): model .LabelValue (recordData .Owner ),
95
+ }
96
+
97
+ if keepStream {
98
+ labels [model .LabelName ("__aws_cloudwatch_log_stream" )] = model .LabelValue (recordData .LogStream )
99
+ }
100
+
101
+ return applyLabels (labels )
102
+ }
103
+
104
+ func processLogEvents (ctx context.Context , b * batch , logEvents []events.CloudwatchLogsLogEvent , labels model.LabelSet ) error {
105
+ for _ , logEvent := range logEvents {
106
+ timestamp := time .UnixMilli (logEvent .Timestamp )
107
+
108
+ if err := b .add (ctx , entry {labels , logproto.Entry {
109
+ Line : logEvent .Message ,
110
+ Timestamp : timestamp ,
111
+ }}); err != nil {
112
+ return err
113
+ }
114
+ }
115
+
116
+ return nil
117
+ }
0 commit comments