-
Notifications
You must be signed in to change notification settings - Fork 836
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
TUN-8734: add log collection for kubernetes
## Summary Adds the log collector for K8s based deployments. Closes TUN-8734
- Loading branch information
Luis Neto
committed
Nov 27, 2024
1 parent
16e65c7
commit 46dc631
Showing
3 changed files
with
111 additions
and
37 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,63 @@ | ||
package diagnostic | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
"os" | ||
"os/exec" | ||
"path/filepath" | ||
"time" | ||
) | ||
|
||
type KubernetesLogCollector struct { | ||
containerID string // This member identifies the container by identifier or name | ||
pod string // This member identifies the pod where the container is deployed | ||
} | ||
|
||
func NewKubernetesLogCollector(containerID, pod string) *KubernetesLogCollector { | ||
return &KubernetesLogCollector{ | ||
containerID, | ||
pod, | ||
} | ||
} | ||
|
||
func (collector *KubernetesLogCollector) 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() | ||
|
||
var command *exec.Cmd | ||
// Calculate 2 weeks ago | ||
since := time.Now().Add(twoWeeksOffset).Format(time.RFC3339) | ||
if collector.containerID != "" { | ||
command = exec.CommandContext( | ||
ctx, | ||
"kubectl", | ||
"logs", | ||
collector.pod, | ||
"--since-time=", | ||
since, | ||
"--tail=", | ||
tailMaxNumberOfLines, | ||
"-c", | ||
collector.containerID, | ||
) | ||
} else { | ||
command = exec.CommandContext( | ||
ctx, | ||
"kubectl", | ||
"logs", | ||
collector.pod, | ||
"--since-time=", | ||
since, | ||
"--tail=", | ||
tailMaxNumberOfLines, | ||
) | ||
} | ||
|
||
return PipeCommandOutputToFile(command, outputHandle) | ||
} |
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,47 @@ | ||
package diagnostic | ||
|
||
import ( | ||
"fmt" | ||
"io" | ||
"os" | ||
"os/exec" | ||
) | ||
|
||
func PipeCommandOutputToFile(command *exec.Cmd, outputHandle *os.File) (*LogInformation, error) { | ||
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 | ||
} |