TUN-8733: add log collection for docker
## Summary Adds the log collector for docker based deployments Closes TUN-8733
This commit is contained in:
parent
a6f9e68739
commit
16e65c70ad
|
@ -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)
|
||||
)
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue