Skip to content

Commit

Permalink
TUN-8733: add log collection for docker
Browse files Browse the repository at this point in the history
## Summary
Adds the log collector for docker based deployments

Closes TUN-8733
  • Loading branch information
Luis Neto committed Nov 27, 2024
1 parent a6f9e68 commit 16e65c7
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 8 deletions.
18 changes: 10 additions & 8 deletions diagnostic/consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ package diagnostic
import "time"

const (
defaultCollectorTimeout = time.Second * 10 // This const define the timeout value of a collector operation.
collectorField = "collector" // used for logging purposes
systemCollectorName = "system" // used for logging purposes
tunnelStateCollectorName = "tunnelState" // used for logging purposes
configurationCollectorName = "configuration" // used for logging purposes
defaultTimeout = 15 * time.Second // timeout for the collectors
twoWeeksOffset = -14 * 24 * time.Hour // maximum offset for the logs
configurationKeyUID = "uid" // Key used to set and get the UID value from the configuration map
defaultCollectorTimeout = time.Second * 10 // This const define the timeout value of a collector operation.
collectorField = "collector" // used for logging purposes
systemCollectorName = "system" // used for logging purposes
tunnelStateCollectorName = "tunnelState" // used for logging purposes
configurationCollectorName = "configuration" // used for logging purposes
defaultTimeout = 15 * time.Second // timeout for the collectors
twoWeeksOffset = -14 * 24 * time.Hour // maximum offset for the logs
logFilename = "cloudflared_logs.txt" // name of the output log file
configurationKeyUID = "uid" // Key used to set and get the UID value from the configuration map
tailMaxNumberOfLines = "10000" // maximum number of log lines from a virtual runtime (docker or kubernetes)
)
83 changes: 83 additions & 0 deletions diagnostic/log_collector_docker.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package diagnostic

import (
"context"
"fmt"
"io"
"os"
"os/exec"
"path/filepath"
"time"
)

type DockerLogCollector struct {
containerID string // This member identifies the container by identifier or name
}

func NewDockerLogCollector(containerID string) *DockerLogCollector {
return &DockerLogCollector{
containerID,
}
}

func (collector *DockerLogCollector) Collect(ctx context.Context) (*LogInformation, error) {
tmp := os.TempDir()

outputHandle, err := os.Create(filepath.Join(tmp, logFilename))
if err != nil {
return nil, fmt.Errorf("error opening output file: %w", err)
}

defer outputHandle.Close()

// Calculate 2 weeks ago
since := time.Now().Add(twoWeeksOffset).Format(time.RFC3339)

command := exec.CommandContext(
ctx,
"docker",
"logs",
"--tail",
tailMaxNumberOfLines,
"--since",
since,
collector.containerID,
)

stdoutReader, err := command.StdoutPipe()
if err != nil {
return nil, fmt.Errorf(
"error retrieving output from command '%s': %w",
command.String(),
err,
)
}

if err := command.Start(); err != nil {
return nil, fmt.Errorf(
"error running command '%s': %w",
command.String(),
err,
)
}

_, err = io.Copy(outputHandle, stdoutReader)
if err != nil {
return nil, fmt.Errorf(
"error copying output from %s to file %s: %w",
command.String(),
outputHandle.Name(),
err,
)
}

if err := command.Wait(); err != nil {
return nil, fmt.Errorf(
"error waiting from command '%s': %w",
command.String(),
err,
)
}

return NewLogInformation(outputHandle.Name(), true, false), nil
}

0 comments on commit 16e65c7

Please sign in to comment.