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

     1  package docker
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"os"
     8  	"sort"
     9  	"strings"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/docker/docker/api/types"
    14  	"github.com/docker/docker/api/types/network"
    15  	"github.com/go-kit/log"
    16  	"github.com/prometheus/client_golang/prometheus"
    17  	"github.com/prometheus/common/model"
    18  	"github.com/prometheus/prometheus/discovery/moby"
    19  	"github.com/stretchr/testify/require"
    20  
    21  	"github.com/grafana/loki/clients/pkg/promtail/client/fake"
    22  	"github.com/grafana/loki/clients/pkg/promtail/positions"
    23  	"github.com/grafana/loki/clients/pkg/promtail/scrapeconfig"
    24  )
    25  
    26  func Test_TargetManager(t *testing.T) {
    27  	h := func(w http.ResponseWriter, r *http.Request) {
    28  		switch path := r.URL.Path; {
    29  		case path == "/_ping":
    30  			_, err := w.Write([]byte("OK"))
    31  			require.NoError(t, err)
    32  		case strings.HasSuffix(path, "/containers/json"):
    33  			// Serve container list
    34  			w.Header().Set("Content-Type", "application/json")
    35  			containerResponse := []types.Container{{
    36  				ID:    "1234",
    37  				Names: []string{"flog"},
    38  				NetworkSettings: &types.SummaryNetworkSettings{
    39  					Networks: map[string]*network.EndpointSettings{
    40  						"foo": {
    41  							NetworkID: "my_network",
    42  							IPAddress: "127.0.0.1",
    43  						},
    44  					},
    45  				},
    46  			}}
    47  			err := json.NewEncoder(w).Encode(containerResponse)
    48  			require.NoError(t, err)
    49  		case strings.HasSuffix(path, "/networks"):
    50  			// Serve networks
    51  			w.Header().Set("Content-Type", "application/json")
    52  			err := json.NewEncoder(w).Encode([]types.NetworkResource{})
    53  			require.NoError(t, err)
    54  		default:
    55  			// Serve container logs
    56  			dat, err := os.ReadFile("testdata/flog.log")
    57  			require.NoError(t, err)
    58  			_, err = w.Write(dat)
    59  			require.NoError(t, err)
    60  		}
    61  	}
    62  	dockerDaemonMock := httptest.NewServer(http.HandlerFunc(h))
    63  	defer dockerDaemonMock.Close()
    64  
    65  	w := log.NewSyncWriter(os.Stderr)
    66  	logger := log.NewLogfmtLogger(w)
    67  	entryHandler := fake.New(func() {})
    68  	cfgs := []scrapeconfig.Config{{
    69  		DockerSDConfigs: []*moby.DockerSDConfig{{
    70  			Host:            dockerDaemonMock.URL,
    71  			RefreshInterval: model.Duration(100 * time.Millisecond),
    72  		}},
    73  	}}
    74  
    75  	ps, err := positions.New(logger, positions.Config{
    76  		SyncPeriod:    10 * time.Second,
    77  		PositionsFile: t.TempDir() + "/positions.yml",
    78  	})
    79  	require.NoError(t, err)
    80  
    81  	ta, err := NewTargetManager(
    82  		NewMetrics(prometheus.NewRegistry()),
    83  		logger,
    84  		ps,
    85  		entryHandler,
    86  		cfgs,
    87  	)
    88  	require.NoError(t, err)
    89  	require.True(t, ta.Ready())
    90  
    91  	require.Eventually(t, func() bool {
    92  		return len(entryHandler.Received()) >= 6
    93  	}, 20*time.Second, 100*time.Millisecond)
    94  
    95  	received := entryHandler.Received()
    96  	sort.Slice(received, func(i, j int) bool {
    97  		return received[i].Timestamp.Before(received[j].Timestamp)
    98  	})
    99  
   100  	expectedLines := []string{
   101  		"5.3.69.55 - - [09/Dec/2021:09:15:02 +0000] \"HEAD /brand/users/clicks-and-mortar/front-end HTTP/2.0\" 503 27087",
   102  		"101.54.183.185 - - [09/Dec/2021:09:15:03 +0000] \"POST /next-generation HTTP/1.0\" 416 11468",
   103  		"69.27.137.160 - runolfsdottir2670 [09/Dec/2021:09:15:03 +0000] \"HEAD /content/visionary/engineer/cultivate HTTP/1.1\" 302 2975",
   104  		"28.104.242.74 - - [09/Dec/2021:09:15:03 +0000] \"PATCH /value-added/cultivate/systems HTTP/2.0\" 405 11843",
   105  		"150.187.51.54 - satterfield1852 [09/Dec/2021:09:15:03 +0000] \"GET /incentivize/deliver/innovative/cross-platform HTTP/1.1\" 301 13032",
   106  	}
   107  	actualLines := make([]string, 0, 5)
   108  	for _, entry := range received[:5] {
   109  		actualLines = append(actualLines, entry.Line)
   110  	}
   111  	require.ElementsMatch(t, actualLines, expectedLines)
   112  	require.Equal(t, 99969, len(received[5].Line))
   113  }