Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/loki/source/docker/internal/dockertarget/target_test.go
4096 views
1
package dockertarget
2
3
// This code is copied from Promtail. The dockertarget package is used to
4
// configure and run the targets that can read logs from Docker containers and
5
// forward them to other loki components.
6
7
import (
8
"encoding/json"
9
"net/http"
10
"net/http/httptest"
11
"os"
12
"sort"
13
"strings"
14
"testing"
15
"time"
16
17
"github.com/grafana/agent/component/common/loki/client/fake"
18
19
"github.com/docker/docker/api/types"
20
"github.com/docker/docker/api/types/container"
21
"github.com/docker/docker/client"
22
"github.com/go-kit/log"
23
"github.com/grafana/agent/component/common/loki/positions"
24
"github.com/prometheus/client_golang/prometheus"
25
"github.com/prometheus/common/model"
26
"github.com/prometheus/prometheus/model/relabel"
27
"github.com/stretchr/testify/require"
28
)
29
30
func TestDockerTarget(t *testing.T) {
31
h := func(w http.ResponseWriter, r *http.Request) {
32
switch path := r.URL.Path; {
33
case strings.HasSuffix(path, "/logs"):
34
dat, err := os.ReadFile("testdata/flog.log")
35
require.NoError(t, err)
36
_, err = w.Write(dat)
37
require.NoError(t, err)
38
default:
39
w.Header().Set("Content-Type", "application/json")
40
info := types.ContainerJSON{
41
ContainerJSONBase: &types.ContainerJSONBase{},
42
Mounts: []types.MountPoint{},
43
Config: &container.Config{Tty: false},
44
NetworkSettings: &types.NetworkSettings{},
45
}
46
err := json.NewEncoder(w).Encode(info)
47
require.NoError(t, err)
48
}
49
}
50
51
ts := httptest.NewServer(http.HandlerFunc(h))
52
defer ts.Close()
53
54
w := log.NewSyncWriter(os.Stderr)
55
logger := log.NewLogfmtLogger(w)
56
entryHandler := fake.NewClient(func() {})
57
client, err := client.NewClientWithOpts(client.WithHost(ts.URL))
58
require.NoError(t, err)
59
60
ps, err := positions.New(logger, positions.Config{
61
SyncPeriod: 10 * time.Second,
62
PositionsFile: t.TempDir() + "/positions.yml",
63
})
64
require.NoError(t, err)
65
66
tgt, err := NewTarget(
67
NewMetrics(prometheus.NewRegistry()),
68
logger,
69
entryHandler,
70
ps,
71
"flog",
72
model.LabelSet{"job": "docker"},
73
[]*relabel.Config{},
74
client,
75
)
76
require.NoError(t, err)
77
tgt.StartIfNotRunning()
78
79
require.Eventually(t, func() bool {
80
return len(entryHandler.Received()) >= 5
81
}, 5*time.Second, 100*time.Millisecond)
82
83
received := entryHandler.Received()
84
sort.Slice(received, func(i, j int) bool {
85
return received[i].Timestamp.Before(received[j].Timestamp)
86
})
87
88
expectedLines := []string{
89
"5.3.69.55 - - [09/Dec/2021:09:15:02 +0000] \"HEAD /brand/users/clicks-and-mortar/front-end HTTP/2.0\" 503 27087",
90
"101.54.183.185 - - [09/Dec/2021:09:15:03 +0000] \"POST /next-generation HTTP/1.0\" 416 11468",
91
"69.27.137.160 - runolfsdottir2670 [09/Dec/2021:09:15:03 +0000] \"HEAD /content/visionary/engineer/cultivate HTTP/1.1\" 302 2975",
92
"28.104.242.74 - - [09/Dec/2021:09:15:03 +0000] \"PATCH /value-added/cultivate/systems HTTP/2.0\" 405 11843",
93
"150.187.51.54 - satterfield1852 [09/Dec/2021:09:15:03 +0000] \"GET /incentivize/deliver/innovative/cross-platform HTTP/1.1\" 301 13032",
94
}
95
actualLines := make([]string, 0, 5)
96
for _, entry := range received[:5] {
97
actualLines = append(actualLines, entry.Line)
98
}
99
require.ElementsMatch(t, actualLines, expectedLines)
100
}
101
102