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 }