mirror of
https://github.com/amir20/dozzle.git
synced 2025-12-24 06:28:42 +01:00
Removes tail size (#1981)
* Removes tail size * Removes tail from analytics
This commit is contained in:
@@ -124,8 +124,6 @@ Dozzle follows the [12-factor](https://12factor.net/) model. Configurations can
|
|||||||
| `--addr` | `DOZZLE_ADDR` | `:8080` |
|
| `--addr` | `DOZZLE_ADDR` | `:8080` |
|
||||||
| `--base` | `DOZZLE_BASE` | `/` |
|
| `--base` | `DOZZLE_BASE` | `/` |
|
||||||
| `--level` | `DOZZLE_LEVEL` | `info` |
|
| `--level` | `DOZZLE_LEVEL` | `info` |
|
||||||
| n/a | `DOCKER_API_VERSION` | not set |
|
|
||||||
| `--tailSize` | `DOZZLE_TAILSIZE` | `300` |
|
|
||||||
| `--filter` | `DOZZLE_FILTER` | `""` |
|
| `--filter` | `DOZZLE_FILTER` | `""` |
|
||||||
| `--username` | `DOZZLE_USERNAME` | `""` |
|
| `--username` | `DOZZLE_USERNAME` | `""` |
|
||||||
| `--password` | `DOZZLE_PASSWORD` | `""` |
|
| `--password` | `DOZZLE_PASSWORD` | `""` |
|
||||||
|
|||||||
@@ -6,6 +6,5 @@ type StartEvent struct {
|
|||||||
FilterLength int `json:"filterLength"`
|
FilterLength int `json:"filterLength"`
|
||||||
CustomAddress bool `json:"customAddress"`
|
CustomAddress bool `json:"customAddress"`
|
||||||
CustomBase bool `json:"customBase"`
|
CustomBase bool `json:"customBase"`
|
||||||
TailSize int `json:"tailSize"`
|
|
||||||
Protected bool `json:"protected"`
|
Protected bool `json:"protected"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ type dockerProxy interface {
|
|||||||
type Client interface {
|
type Client interface {
|
||||||
ListContainers() ([]Container, error)
|
ListContainers() ([]Container, error)
|
||||||
FindContainer(string) (Container, error)
|
FindContainer(string) (Container, error)
|
||||||
ContainerLogs(context.Context, string, int, string) (io.ReadCloser, error)
|
ContainerLogs(context.Context, string, string) (io.ReadCloser, error)
|
||||||
Events(context.Context) (<-chan ContainerEvent, <-chan error)
|
Events(context.Context) (<-chan ContainerEvent, <-chan error)
|
||||||
ContainerLogsBetweenDates(context.Context, string, time.Time, time.Time) (io.ReadCloser, error)
|
ContainerLogsBetweenDates(context.Context, string, time.Time, time.Time) (io.ReadCloser, error)
|
||||||
ContainerStats(context.Context, string, chan<- ContainerStat) error
|
ContainerStats(context.Context, string, chan<- ContainerStat) error
|
||||||
@@ -169,7 +169,7 @@ func (d *dockerClient) ContainerStats(ctx context.Context, id string, stats chan
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *dockerClient) ContainerLogs(ctx context.Context, id string, tailSize int, since string) (io.ReadCloser, error) {
|
func (d *dockerClient) ContainerLogs(ctx context.Context, id string, since string) (io.ReadCloser, error) {
|
||||||
log.WithField("id", id).WithField("since", since).Debug("streaming logs for container")
|
log.WithField("id", id).WithField("since", since).Debug("streaming logs for container")
|
||||||
|
|
||||||
if since != "" {
|
if since != "" {
|
||||||
@@ -184,7 +184,7 @@ func (d *dockerClient) ContainerLogs(ctx context.Context, id string, tailSize in
|
|||||||
ShowStdout: true,
|
ShowStdout: true,
|
||||||
ShowStderr: true,
|
ShowStderr: true,
|
||||||
Follow: true,
|
Follow: true,
|
||||||
Tail: strconv.Itoa(tailSize),
|
Tail: "300",
|
||||||
Timestamps: true,
|
Timestamps: true,
|
||||||
Since: since,
|
Since: since,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ func Test_dockerClient_ContainerLogs_happy(t *testing.T) {
|
|||||||
proxy.On("ContainerInspect", mock.Anything, id).Return(json, nil)
|
proxy.On("ContainerInspect", mock.Anything, id).Return(json, nil)
|
||||||
|
|
||||||
client := &dockerClient{proxy, filters.NewArgs()}
|
client := &dockerClient{proxy, filters.NewArgs()}
|
||||||
logReader, _ := client.ContainerLogs(context.Background(), id, 300, "since")
|
logReader, _ := client.ContainerLogs(context.Background(), id, "since")
|
||||||
|
|
||||||
actual, _ := ioutil.ReadAll(logReader)
|
actual, _ := ioutil.ReadAll(logReader)
|
||||||
assert.Equal(t, expected, string(actual), "message doesn't match expected")
|
assert.Equal(t, expected, string(actual), "message doesn't match expected")
|
||||||
@@ -154,7 +154,7 @@ func Test_dockerClient_ContainerLogs_happy_with_tty(t *testing.T) {
|
|||||||
proxy.On("ContainerInspect", mock.Anything, id).Return(json, nil)
|
proxy.On("ContainerInspect", mock.Anything, id).Return(json, nil)
|
||||||
|
|
||||||
client := &dockerClient{proxy, filters.NewArgs()}
|
client := &dockerClient{proxy, filters.NewArgs()}
|
||||||
logReader, _ := client.ContainerLogs(context.Background(), id, 300, "")
|
logReader, _ := client.ContainerLogs(context.Background(), id, "")
|
||||||
|
|
||||||
actual, _ := ioutil.ReadAll(logReader)
|
actual, _ := ioutil.ReadAll(logReader)
|
||||||
assert.Equal(t, expected, string(actual), "message doesn't match expected")
|
assert.Equal(t, expected, string(actual), "message doesn't match expected")
|
||||||
@@ -170,7 +170,7 @@ func Test_dockerClient_ContainerLogs_error(t *testing.T) {
|
|||||||
|
|
||||||
client := &dockerClient{proxy, filters.NewArgs()}
|
client := &dockerClient{proxy, filters.NewArgs()}
|
||||||
|
|
||||||
reader, err := client.ContainerLogs(context.Background(), id, 300, "")
|
reader, err := client.ContainerLogs(context.Background(), id, "")
|
||||||
|
|
||||||
assert.Nil(t, reader, "reader should be nil")
|
assert.Nil(t, reader, "reader should be nil")
|
||||||
assert.Error(t, err, "error should have been returned")
|
assert.Error(t, err, "error should have been returned")
|
||||||
|
|||||||
3
main.go
3
main.go
@@ -38,7 +38,6 @@ type args struct {
|
|||||||
Addr string `arg:"env:DOZZLE_ADDR" default:":8080" help:"sets host:port to bind for server. This is rarely needed inside a docker container."`
|
Addr string `arg:"env:DOZZLE_ADDR" default:":8080" help:"sets host:port to bind for server. This is rarely needed inside a docker container."`
|
||||||
Base string `arg:"env:DOZZLE_BASE" default:"/" help:"sets the base for http router."`
|
Base string `arg:"env:DOZZLE_BASE" default:"/" help:"sets the base for http router."`
|
||||||
Level string `arg:"env:DOZZLE_LEVEL" default:"info" help:"set Dozzle log level. Use debug for more logging."`
|
Level string `arg:"env:DOZZLE_LEVEL" default:"info" help:"set Dozzle log level. Use debug for more logging."`
|
||||||
TailSize int `arg:"env:DOZZLE_TAILSIZE" default:"300" help:"update the initial tail size when fetching logs."`
|
|
||||||
Username string `arg:"env:DOZZLE_USERNAME" help:"sets the username for auth."`
|
Username string `arg:"env:DOZZLE_USERNAME" help:"sets the username for auth."`
|
||||||
Password string `arg:"env:DOZZLE_PASSWORD" help:"sets password for auth"`
|
Password string `arg:"env:DOZZLE_PASSWORD" help:"sets password for auth"`
|
||||||
UsernameFile *DockerSecret `arg:"env:DOZZLE_USERNAME_FILE" help:"sets the secret path read username for auth."`
|
UsernameFile *DockerSecret `arg:"env:DOZZLE_USERNAME_FILE" help:"sets the secret path read username for auth."`
|
||||||
@@ -123,7 +122,6 @@ func main() {
|
|||||||
Addr: args.Addr,
|
Addr: args.Addr,
|
||||||
Base: args.Base,
|
Base: args.Base,
|
||||||
Version: version,
|
Version: version,
|
||||||
TailSize: args.TailSize,
|
|
||||||
Username: args.Username,
|
Username: args.Username,
|
||||||
Password: args.Password,
|
Password: args.Password,
|
||||||
}
|
}
|
||||||
@@ -175,7 +173,6 @@ func doStartEvent(arg args) {
|
|||||||
FilterLength: len(arg.Filter),
|
FilterLength: len(arg.Filter),
|
||||||
CustomAddress: arg.Addr != ":8080",
|
CustomAddress: arg.Addr != ":8080",
|
||||||
CustomBase: arg.Base != "/",
|
CustomBase: arg.Base != "/",
|
||||||
TailSize: arg.TailSize,
|
|
||||||
Protected: arg.Username != "",
|
Protected: arg.Username != "",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ func (h *handler) streamLogs(w http.ResponseWriter, r *http.Request) {
|
|||||||
lastEventId = r.URL.Query().Get("lastEventId")
|
lastEventId = r.URL.Query().Get("lastEventId")
|
||||||
}
|
}
|
||||||
|
|
||||||
reader, err := h.client.ContainerLogs(r.Context(), container.ID, h.config.TailSize, lastEventId)
|
reader, err := h.client.ContainerLogs(r.Context(), container.ID, lastEventId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
fmt.Fprintf(w, "event: container-stopped\ndata: end of stream\n\n")
|
fmt.Fprintf(w, "event: container-stopped\ndata: end of stream\n\n")
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ type Config struct {
|
|||||||
Base string
|
Base string
|
||||||
Addr string
|
Addr string
|
||||||
Version string
|
Version string
|
||||||
TailSize int
|
|
||||||
Username string
|
Username string
|
||||||
Password string
|
Password string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ func (m *MockedClient) ListContainers() ([]docker.Container, error) {
|
|||||||
return args.Get(0).([]docker.Container), args.Error(1)
|
return args.Get(0).([]docker.Container), args.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MockedClient) ContainerLogs(ctx context.Context, id string, tailSize int, since string) (io.ReadCloser, error) {
|
func (m *MockedClient) ContainerLogs(ctx context.Context, id string, since string) (io.ReadCloser, error) {
|
||||||
args := m.Called(ctx, id, tailSize)
|
args := m.Called(ctx, id, since)
|
||||||
return args.Get(0).(io.ReadCloser), args.Error(1)
|
return args.Get(0).(io.ReadCloser), args.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,9 +75,9 @@ func Test_handler_streamLogs_happy(t *testing.T) {
|
|||||||
mockedClient := new(MockedClient)
|
mockedClient := new(MockedClient)
|
||||||
reader := ioutil.NopCloser(strings.NewReader("INFO Testing logs..."))
|
reader := ioutil.NopCloser(strings.NewReader("INFO Testing logs..."))
|
||||||
mockedClient.On("FindContainer", id).Return(docker.Container{ID: id}, nil)
|
mockedClient.On("FindContainer", id).Return(docker.Container{ID: id}, nil)
|
||||||
mockedClient.On("ContainerLogs", mock.Anything, mock.Anything, 300).Return(reader, nil)
|
mockedClient.On("ContainerLogs", mock.Anything, mock.Anything, "").Return(reader, nil)
|
||||||
|
|
||||||
h := handler{client: mockedClient, config: &Config{TailSize: 300}}
|
h := handler{client: mockedClient, config: &Config{}}
|
||||||
handler := http.HandlerFunc(h.streamLogs)
|
handler := http.HandlerFunc(h.streamLogs)
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
handler.ServeHTTP(rr, req)
|
handler.ServeHTTP(rr, req)
|
||||||
@@ -96,9 +96,9 @@ func Test_handler_streamLogs_happy_with_id(t *testing.T) {
|
|||||||
mockedClient := new(MockedClient)
|
mockedClient := new(MockedClient)
|
||||||
reader := ioutil.NopCloser(strings.NewReader("2020-05-13T18:55:37.772853839Z INFO Testing logs..."))
|
reader := ioutil.NopCloser(strings.NewReader("2020-05-13T18:55:37.772853839Z INFO Testing logs..."))
|
||||||
mockedClient.On("FindContainer", id).Return(docker.Container{ID: id}, nil)
|
mockedClient.On("FindContainer", id).Return(docker.Container{ID: id}, nil)
|
||||||
mockedClient.On("ContainerLogs", mock.Anything, mock.Anything, 300).Return(reader, nil)
|
mockedClient.On("ContainerLogs", mock.Anything, mock.Anything, "").Return(reader, nil)
|
||||||
|
|
||||||
h := handler{client: mockedClient, config: &Config{TailSize: 300}}
|
h := handler{client: mockedClient, config: &Config{}}
|
||||||
handler := http.HandlerFunc(h.streamLogs)
|
handler := http.HandlerFunc(h.streamLogs)
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
handler.ServeHTTP(rr, req)
|
handler.ServeHTTP(rr, req)
|
||||||
@@ -116,9 +116,9 @@ func Test_handler_streamLogs_happy_container_stopped(t *testing.T) {
|
|||||||
|
|
||||||
mockedClient := new(MockedClient)
|
mockedClient := new(MockedClient)
|
||||||
mockedClient.On("FindContainer", id).Return(docker.Container{ID: id}, nil)
|
mockedClient.On("FindContainer", id).Return(docker.Container{ID: id}, nil)
|
||||||
mockedClient.On("ContainerLogs", mock.Anything, id, 300).Return(ioutil.NopCloser(strings.NewReader("")), io.EOF)
|
mockedClient.On("ContainerLogs", mock.Anything, id, "").Return(ioutil.NopCloser(strings.NewReader("")), io.EOF)
|
||||||
|
|
||||||
h := handler{client: mockedClient, config: &Config{TailSize: 300}}
|
h := handler{client: mockedClient, config: &Config{}}
|
||||||
handler := http.HandlerFunc(h.streamLogs)
|
handler := http.HandlerFunc(h.streamLogs)
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
handler.ServeHTTP(rr, req)
|
handler.ServeHTTP(rr, req)
|
||||||
@@ -137,7 +137,7 @@ func Test_handler_streamLogs_error_finding_container(t *testing.T) {
|
|||||||
mockedClient := new(MockedClient)
|
mockedClient := new(MockedClient)
|
||||||
mockedClient.On("FindContainer", id).Return(docker.Container{}, errors.New("error finding container"))
|
mockedClient.On("FindContainer", id).Return(docker.Container{}, errors.New("error finding container"))
|
||||||
|
|
||||||
h := handler{client: mockedClient, config: &Config{TailSize: 300}}
|
h := handler{client: mockedClient, config: &Config{}}
|
||||||
handler := http.HandlerFunc(h.streamLogs)
|
handler := http.HandlerFunc(h.streamLogs)
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
handler.ServeHTTP(rr, req)
|
handler.ServeHTTP(rr, req)
|
||||||
@@ -155,9 +155,9 @@ func Test_handler_streamLogs_error_reading(t *testing.T) {
|
|||||||
|
|
||||||
mockedClient := new(MockedClient)
|
mockedClient := new(MockedClient)
|
||||||
mockedClient.On("FindContainer", id).Return(docker.Container{ID: id}, nil)
|
mockedClient.On("FindContainer", id).Return(docker.Container{ID: id}, nil)
|
||||||
mockedClient.On("ContainerLogs", mock.Anything, id, 300).Return(ioutil.NopCloser(strings.NewReader("")), errors.New("test error"))
|
mockedClient.On("ContainerLogs", mock.Anything, id, "").Return(ioutil.NopCloser(strings.NewReader("")), errors.New("test error"))
|
||||||
|
|
||||||
h := handler{client: mockedClient, config: &Config{TailSize: 300}}
|
h := handler{client: mockedClient, config: &Config{}}
|
||||||
handler := http.HandlerFunc(h.streamLogs)
|
handler := http.HandlerFunc(h.streamLogs)
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
handler.ServeHTTP(rr, req)
|
handler.ServeHTTP(rr, req)
|
||||||
@@ -186,7 +186,7 @@ func Test_handler_streamEvents_happy(t *testing.T) {
|
|||||||
close(messages)
|
close(messages)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
h := handler{client: mockedClient, config: &Config{TailSize: 300}}
|
h := handler{client: mockedClient, config: &Config{}}
|
||||||
handler := http.HandlerFunc(h.streamEvents)
|
handler := http.HandlerFunc(h.streamEvents)
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
handler.ServeHTTP(rr, req)
|
handler.ServeHTTP(rr, req)
|
||||||
@@ -208,7 +208,7 @@ func Test_handler_streamEvents_error(t *testing.T) {
|
|||||||
close(messages)
|
close(messages)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
h := handler{client: mockedClient, config: &Config{TailSize: 300}}
|
h := handler{client: mockedClient, config: &Config{}}
|
||||||
handler := http.HandlerFunc(h.streamEvents)
|
handler := http.HandlerFunc(h.streamEvents)
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
handler.ServeHTTP(rr, req)
|
handler.ServeHTTP(rr, req)
|
||||||
@@ -234,7 +234,7 @@ func Test_handler_streamEvents_error_request(t *testing.T) {
|
|||||||
cancel()
|
cancel()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
h := handler{client: mockedClient, config: &Config{TailSize: 300}}
|
h := handler{client: mockedClient, config: &Config{}}
|
||||||
handler := http.HandlerFunc(h.streamEvents)
|
handler := http.HandlerFunc(h.streamEvents)
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
handler.ServeHTTP(rr, req)
|
handler.ServeHTTP(rr, req)
|
||||||
@@ -397,7 +397,7 @@ func Test_createRoutes_username_password_login_failed(t *testing.T) {
|
|||||||
func Test_createRoutes_username_password_valid_session(t *testing.T) {
|
func Test_createRoutes_username_password_valid_session(t *testing.T) {
|
||||||
mockedClient := new(MockedClient)
|
mockedClient := new(MockedClient)
|
||||||
mockedClient.On("FindContainer", "123").Return(docker.Container{ID: "123"}, nil)
|
mockedClient.On("FindContainer", "123").Return(docker.Container{ID: "123"}, nil)
|
||||||
mockedClient.On("ContainerLogs", mock.Anything, "123", 0).Return(ioutil.NopCloser(strings.NewReader("test data")), io.EOF)
|
mockedClient.On("ContainerLogs", mock.Anything, "123", "").Return(ioutil.NopCloser(strings.NewReader("test data")), io.EOF)
|
||||||
handler := createHandler(mockedClient, nil, Config{Base: "/", Username: "amir", Password: "password"})
|
handler := createHandler(mockedClient, nil, Config{Base: "/", Username: "amir", Password: "password"})
|
||||||
|
|
||||||
// Get cookie first
|
// Get cookie first
|
||||||
@@ -421,7 +421,7 @@ func Test_createRoutes_username_password_valid_session(t *testing.T) {
|
|||||||
func Test_createRoutes_username_password_invalid_session(t *testing.T) {
|
func Test_createRoutes_username_password_invalid_session(t *testing.T) {
|
||||||
mockedClient := new(MockedClient)
|
mockedClient := new(MockedClient)
|
||||||
mockedClient.On("FindContainer", "123").Return(docker.Container{ID: "123"}, nil)
|
mockedClient.On("FindContainer", "123").Return(docker.Container{ID: "123"}, nil)
|
||||||
mockedClient.On("ContainerLogs", mock.Anything, "123", 0).Return(ioutil.NopCloser(strings.NewReader("test data")), io.EOF)
|
mockedClient.On("ContainerLogs", mock.Anything, "since").Return(ioutil.NopCloser(strings.NewReader("test data")), io.EOF)
|
||||||
handler := createHandler(mockedClient, nil, Config{Base: "/", Username: "amir", Password: "password"})
|
handler := createHandler(mockedClient, nil, Config{Base: "/", Username: "amir", Password: "password"})
|
||||||
req, err := http.NewRequest("GET", "/api/logs/stream?id=123", nil)
|
req, err := http.NewRequest("GET", "/api/logs/stream?id=123", nil)
|
||||||
require.NoError(t, err, "NewRequest should not return an error.")
|
require.NoError(t, err, "NewRequest should not return an error.")
|
||||||
|
|||||||
Reference in New Issue
Block a user