github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/clients/pkg/promtail/targets/docker/target_test.go (about)

     1  package docker
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  	"os"
     7  	"sort"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/docker/docker/client"
    12  	"github.com/go-kit/log"
    13  	"github.com/prometheus/client_golang/prometheus"
    14  	"github.com/prometheus/common/model"
    15  	"github.com/prometheus/prometheus/model/relabel"
    16  	"github.com/stretchr/testify/require"
    17  
    18  	"github.com/grafana/loki/clients/pkg/promtail/client/fake"
    19  	"github.com/grafana/loki/clients/pkg/promtail/positions"
    20  )
    21  
    22  func Test_DockerTarget(t *testing.T) {
    23  	h := func(w http.ResponseWriter, r *http.Request) {
    24  		dat, err := os.ReadFile("testdata/flog.log")
    25  		require.NoError(t, err)
    26  		_, err = w.Write(dat)
    27  		require.NoError(t, err)
    28  	}
    29  
    30  	ts := httptest.NewServer(http.HandlerFunc(h))
    31  	defer ts.Close()
    32  
    33  	w := log.NewSyncWriter(os.Stderr)
    34  	logger := log.NewLogfmtLogger(w)
    35  	entryHandler := fake.New(func() {})
    36  	client, err := client.NewClientWithOpts(client.WithHost(ts.URL))
    37  	require.NoError(t, err)
    38  
    39  	ps, err := positions.New(logger, positions.Config{
    40  		SyncPeriod:    10 * time.Second,
    41  		PositionsFile: t.TempDir() + "/positions.yml",
    42  	})
    43  	require.NoError(t, err)
    44  
    45  	_, err = NewTarget(
    46  		NewMetrics(prometheus.NewRegistry()),
    47  		logger,
    48  		entryHandler,
    49  		ps,
    50  		"flog",
    51  		model.LabelSet{"job": "docker"},
    52  		[]*relabel.Config{},
    53  		client,
    54  	)
    55  	require.NoError(t, err)
    56  
    57  	require.Eventually(t, func() bool {
    58  		return len(entryHandler.Received()) >= 5
    59  	}, 5*time.Second, 100*time.Millisecond)
    60  
    61  	received := entryHandler.Received()
    62  	sort.Slice(received, func(i, j int) bool {
    63  		return received[i].Timestamp.Before(received[j].Timestamp)
    64  	})
    65  
    66  	expectedLines := []string{
    67  		"5.3.69.55 - - [09/Dec/2021:09:15:02 +0000] \"HEAD /brand/users/clicks-and-mortar/front-end HTTP/2.0\" 503 27087",
    68  		"101.54.183.185 - - [09/Dec/2021:09:15:03 +0000] \"POST /next-generation HTTP/1.0\" 416 11468",
    69  		"69.27.137.160 - runolfsdottir2670 [09/Dec/2021:09:15:03 +0000] \"HEAD /content/visionary/engineer/cultivate HTTP/1.1\" 302 2975",
    70  		"28.104.242.74 - - [09/Dec/2021:09:15:03 +0000] \"PATCH /value-added/cultivate/systems HTTP/2.0\" 405 11843",
    71  		"150.187.51.54 - satterfield1852 [09/Dec/2021:09:15:03 +0000] \"GET /incentivize/deliver/innovative/cross-platform HTTP/1.1\" 301 13032",
    72  	}
    73  	actualLines := make([]string, 0, 5)
    74  	for _, entry := range received[:5] {
    75  		actualLines = append(actualLines, entry.Line)
    76  	}
    77  	require.ElementsMatch(t, actualLines, expectedLines)
    78  }