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  )