github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/clients/pkg/promtail/targets/gcplog/formatter_test.go (about) 1 package gcplog 2 3 import ( 4 "testing" 5 "time" 6 7 "cloud.google.com/go/pubsub" 8 "github.com/prometheus/common/model" 9 "github.com/prometheus/prometheus/model/relabel" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 13 "github.com/grafana/loki/clients/pkg/promtail/api" 14 15 "github.com/grafana/loki/pkg/logproto" 16 ) 17 18 func TestFormat(t *testing.T) { 19 cases := []struct { 20 name string 21 msg *pubsub.Message 22 labels model.LabelSet 23 relabel []*relabel.Config 24 useIncomingTimestamp bool 25 expected api.Entry 26 }{ 27 { 28 name: "relabelling", 29 msg: &pubsub.Message{ 30 Data: []byte(withAllFields), 31 }, 32 labels: model.LabelSet{ 33 "jobname": "pubsub-test", 34 }, 35 relabel: []*relabel.Config{ 36 { 37 SourceLabels: model.LabelNames{"__gcp_resource_labels_backend_service_name"}, 38 Separator: ";", 39 Regex: relabel.MustNewRegexp("(.*)"), 40 TargetLabel: "backend_service_name", 41 Action: "replace", 42 Replacement: "$1", 43 }, 44 { 45 SourceLabels: model.LabelNames{"__gcp_resource_labels_bucket_name"}, 46 Separator: ";", 47 Regex: relabel.MustNewRegexp("(.*)"), 48 TargetLabel: "bucket_name", 49 Action: "replace", 50 Replacement: "$1", 51 }, 52 }, 53 useIncomingTimestamp: true, 54 expected: api.Entry{ 55 Labels: model.LabelSet{ 56 "jobname": "pubsub-test", 57 "backend_service_name": "http-loki", 58 "bucket_name": "loki-bucket", 59 }, 60 Entry: logproto.Entry{ 61 Timestamp: mustTime(t, "2020-12-22T15:01:23.045123456Z"), 62 Line: withAllFields, 63 }, 64 }, 65 }, 66 { 67 name: "use-original-timestamp", 68 msg: &pubsub.Message{ 69 Data: []byte(withAllFields), 70 }, 71 labels: model.LabelSet{ 72 "jobname": "pubsub-test", 73 }, 74 useIncomingTimestamp: true, 75 expected: api.Entry{ 76 Labels: model.LabelSet{ 77 "jobname": "pubsub-test", 78 }, 79 Entry: logproto.Entry{ 80 Timestamp: mustTime(t, "2020-12-22T15:01:23.045123456Z"), 81 Line: withAllFields, 82 }, 83 }, 84 }, 85 { 86 name: "rewrite-timestamp", 87 msg: &pubsub.Message{ 88 Data: []byte(withAllFields), 89 }, 90 labels: model.LabelSet{ 91 "jobname": "pubsub-test", 92 }, 93 expected: api.Entry{ 94 Labels: model.LabelSet{ 95 "jobname": "pubsub-test", 96 }, 97 Entry: logproto.Entry{ 98 Timestamp: time.Now(), 99 Line: withAllFields, 100 }, 101 }, 102 }, 103 } 104 105 for _, c := range cases { 106 t.Run(c.name, func(t *testing.T) { 107 got, err := format(c.msg, c.labels, c.useIncomingTimestamp, c.relabel) 108 109 require.NoError(t, err) 110 111 assert.Equal(t, c.expected.Labels, got.Labels) 112 assert.Equal(t, c.expected.Line, got.Line) 113 if c.useIncomingTimestamp { 114 assert.Equal(t, c.expected.Entry.Timestamp, got.Timestamp) 115 } else { 116 if got.Timestamp.Sub(c.expected.Timestamp).Seconds() > 1 { 117 assert.Fail(t, "timestamp shouldn't differ much when rewriting log entry timestamp.") 118 } 119 } 120 }) 121 } 122 } 123 124 func mustTime(t *testing.T, v string) time.Time { 125 t.Helper() 126 127 ts, err := time.Parse(time.RFC3339, v) 128 require.NoError(t, err) 129 return ts 130 } 131 132 const ( 133 withAllFields = `{"logName": "https://project/gcs", "resource": {"type": "gcs", "labels": {"backendServiceName": "http-loki", "bucketName": "loki-bucket", "instanceId": "344555"}}, "timestamp": "2020-12-22T15:01:23.045123456Z"}` 134 )