Skip to content

Commit

Permalink
TUN-8734: add log collection for kubernetes
Browse files Browse the repository at this point in the history
## 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
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 37 deletions.
38 changes: 1 addition & 37 deletions diagnostic/log_collector_docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package diagnostic
import (
"context"
"fmt"
"io"
"os"
"os/exec"
"path/filepath"
Expand Down Expand Up @@ -44,40 +43,5 @@ func (collector *DockerLogCollector) Collect(ctx context.Context) (*LogInformati
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
return PipeCommandOutputToFile(command, outputHandle)
}
63 changes: 63 additions & 0 deletions diagnostic/log_collector_kubernetes.go
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)
}
47 changes: 47 additions & 0 deletions diagnostic/log_collector_utils.go
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
}

0 comments on commit 46dc631

Please sign in to comment.