1
0
mirror of https://github.com/amir20/dozzle.git synced 2025-12-21 21:33:18 +01:00

fix: updates default timeout and adds user agent. see #3610 (#3611)

This commit is contained in:
Amir Raminfar
2025-02-09 14:13:31 -08:00
committed by GitHub
parent 7ae409981c
commit eba87fa49e
5 changed files with 32 additions and 22 deletions

View File

@@ -30,6 +30,7 @@ services:
- DOZZLE_FILTER=name=dozzle - DOZZLE_FILTER=name=dozzle
- DOZZLE_NO_ANALYTICS=1 - DOZZLE_NO_ANALYTICS=1
- DOZZLE_HOSTNAME=localhost - DOZZLE_HOSTNAME=localhost
- DOZZLE_LEVEL=debug
ports: ports:
- 7070:8080 - 7070:8080
build: build:

View File

@@ -26,6 +26,8 @@ type ContainerStore struct {
filter ContainerFilter filter ContainerFilter
} }
const defaultTimeout = 10 * time.Second
func NewContainerStore(ctx context.Context, client Client, filter ContainerFilter) *ContainerStore { func NewContainerStore(ctx context.Context, client Client, filter ContainerFilter) *ContainerStore {
log.Debug().Str("host", client.Host().Name).Interface("filter", filter).Msg("initializing container store") log.Debug().Str("host", client.Host().Name).Interface("filter", filter).Msg("initializing container store")
@@ -64,7 +66,7 @@ func (s *ContainerStore) checkConnectivity() error {
s.connected.Store(false) s.connected.Store(false)
}() }()
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) // 3s is enough to fetch all containers ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
defer cancel() defer cancel()
if containers, err := s.client.ListContainers(ctx, s.filter); err != nil { if containers, err := s.client.ListContainers(ctx, s.filter); err != nil {
return err return err
@@ -88,7 +90,7 @@ func (s *ContainerStore) checkConnectivity() error {
} }
go func(c Container, i int) { go func(c Container, i int) {
defer sem.Release(1) defer sem.Release(1)
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) // 2s is hardcoded timeout for fetching container ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
defer cancel() defer cancel()
if container, err := s.client.FindContainer(ctx, c.ID); err == nil { if container, err := s.client.FindContainer(ctx, c.ID); err == nil {
s.containers.Store(c.ID, &container) s.containers.Store(c.ID, &container)
@@ -114,6 +116,8 @@ func (s *ContainerStore) ListContainers(filter ContainerFilter) ([]Container, er
return nil, err return nil, err
} }
containers := make([]Container, 0)
if filter.Exists() {
validContainers, err := s.client.ListContainers(s.ctx, filter) validContainers, err := s.client.ListContainers(s.ctx, filter)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -123,13 +127,18 @@ func (s *ContainerStore) ListContainers(filter ContainerFilter) ([]Container, er
return item.ID return item.ID
}) })
containers := make([]Container, 0)
s.containers.Range(func(_ string, c *Container) bool { s.containers.Range(func(_ string, c *Container) bool {
if _, ok := validIDMap[c.ID]; ok { if _, ok := validIDMap[c.ID]; ok {
containers = append(containers, *c) containers = append(containers, *c)
} }
return true return true
}) })
} else {
s.containers.Range(func(_ string, c *Container) bool {
containers = append(containers, *c)
return true
})
}
return containers, nil return containers, nil
} }
@@ -158,7 +167,7 @@ func (s *ContainerStore) FindContainer(id string, filter ContainerFilter) (Conta
log.Debug().Str("id", id).Msg("container doesn't have detailed information, fetching it") log.Debug().Str("id", id).Msg("container doesn't have detailed information, fetching it")
if newContainer, ok := s.containers.Compute(id, func(c *Container, loaded bool) (*Container, bool) { if newContainer, ok := s.containers.Compute(id, func(c *Container, loaded bool) (*Container, bool) {
if loaded { if loaded {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
defer cancel() defer cancel()
if newContainer, err := s.client.FindContainer(ctx, id); err == nil { if newContainer, err := s.client.FindContainer(ctx, id); err == nil {
return &newContainer, false return &newContainer, false
@@ -237,7 +246,7 @@ func (s *ContainerStore) init() {
log.Trace().Str("event", event.Name).Str("id", event.ActorID).Msg("received container event") log.Trace().Str("event", event.Name).Str("id", event.ActorID).Msg("received container event")
switch event.Name { switch event.Name {
case "start": case "start":
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
if container, err := s.client.FindContainer(ctx, event.ActorID); err == nil { if container, err := s.client.FindContainer(ctx, event.ActorID); err == nil {
list, _ := s.client.ListContainers(ctx, s.filter) list, _ := s.client.ListContainers(ctx, s.filter)

View File

@@ -99,7 +99,7 @@ func (sc *StatsCollector) Start(parentCtx context.Context) bool {
ctx, sc.stopper = context.WithCancel(parentCtx) ctx, sc.stopper = context.WithCancel(parentCtx)
sc.mu.Unlock() sc.mu.Unlock()
timeoutCtx, cancel := context.WithTimeout(parentCtx, 3*time.Second) // 3 seconds to list containers is hard limit timeoutCtx, cancel := context.WithTimeout(parentCtx, defaultTimeout)
if containers, err := sc.client.ListContainers(timeoutCtx, sc.filter); err == nil { if containers, err := sc.client.ListContainers(timeoutCtx, sc.filter); err == nil {
for _, c := range containers { for _, c := range containers {
if c.State == "running" { if c.State == "running" {

View File

@@ -69,7 +69,7 @@ func NewClient(cli DockerCLI, host container.Host) container.Client {
// NewClientWithFilters creates a new instance of Client with docker filters // NewClientWithFilters creates a new instance of Client with docker filters
func NewLocalClient(hostname string) (container.Client, error) { func NewLocalClient(hostname string) (container.Client, error) {
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation(), client.WithUserAgent("Docker-Client/Dozzle"))
if err != nil { if err != nil {
return nil, err return nil, err
@@ -109,7 +109,7 @@ func NewRemoteClient(host container.Host) (container.Client, error) {
log.Debug().Msg("Not using TLS for remote client") log.Debug().Msg("Not using TLS for remote client")
} }
opts = append(opts, client.WithAPIVersionNegotiation()) opts = append(opts, client.WithAPIVersionNegotiation(), client.WithUserAgent("Docker-Client/Dozzle"))
cli, err := client.NewClientWithOpts(opts...) cli, err := client.NewClientWithOpts(opts...)

View File

@@ -27,7 +27,7 @@ type Args struct {
RemoteAgent []string `arg:"env:DOZZLE_REMOTE_AGENT,--remote-agent,separate" help:"list of agents to connect remotely"` RemoteAgent []string `arg:"env:DOZZLE_REMOTE_AGENT,--remote-agent,separate" help:"list of agents to connect remotely"`
NoAnalytics bool `arg:"--no-analytics,env:DOZZLE_NO_ANALYTICS" help:"disables anonymous analytics"` NoAnalytics bool `arg:"--no-analytics,env:DOZZLE_NO_ANALYTICS" help:"disables anonymous analytics"`
Mode string `arg:"env:DOZZLE_MODE" default:"server" help:"sets the mode to run in (server, swarm)"` Mode string `arg:"env:DOZZLE_MODE" default:"server" help:"sets the mode to run in (server, swarm)"`
TimeoutString string `arg:"--timeout,env:DOZZLE_TIMEOUT" default:"3s" help:"sets the timeout for docker client"` TimeoutString string `arg:"--timeout,env:DOZZLE_TIMEOUT" default:"10s" help:"sets the timeout for docker client"`
Timeout time.Duration `arg:"-"` Timeout time.Duration `arg:"-"`
Healthcheck *HealthcheckCmd `arg:"subcommand:healthcheck" help:"checks if the server is running"` Healthcheck *HealthcheckCmd `arg:"subcommand:healthcheck" help:"checks if the server is running"`
Generate *GenerateCmd `arg:"subcommand:generate" help:"generates a configuration file for simple auth"` Generate *GenerateCmd `arg:"subcommand:generate" help:"generates a configuration file for simple auth"`