-
Notifications
You must be signed in to change notification settings - Fork 837
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
TUN-8733: add log collection for docker
## 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
Showing
2 changed files
with
93 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |