mirror of
https://github.com/traefik/traefik.git
synced 2025-10-27 14:31:14 +01:00
135 lines
3.0 KiB
Go
135 lines
3.0 KiB
Go
package integration
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/suite"
|
|
"go.opentelemetry.io/collector/pdata/plog/plogotlp"
|
|
)
|
|
|
|
const traefikTestOTLPLogFile = "traefik_otlp.log"
|
|
|
|
// DualLoggingSuite tests that both OTLP and stdout logging can work together.
|
|
type DualLoggingSuite struct {
|
|
BaseSuite
|
|
otlpLogs []string
|
|
collector *httptest.Server
|
|
}
|
|
|
|
func TestDualLoggingSuite(t *testing.T) {
|
|
suite.Run(t, new(DualLoggingSuite))
|
|
}
|
|
|
|
func (s *DualLoggingSuite) SetupSuite() {
|
|
s.BaseSuite.SetupSuite()
|
|
|
|
// Clean up any existing log files
|
|
os.Remove(traefikTestLogFile)
|
|
os.Remove(traefikTestOTLPLogFile)
|
|
}
|
|
|
|
func (s *DualLoggingSuite) TearDownSuite() {
|
|
s.BaseSuite.TearDownSuite()
|
|
|
|
// Clean up log files
|
|
generatedFiles := []string{
|
|
traefikTestLogFile,
|
|
traefikTestOTLPLogFile,
|
|
}
|
|
|
|
for _, filename := range generatedFiles {
|
|
if err := os.Remove(filename); err != nil {
|
|
s.T().Logf("Failed to remove %s: %v", filename, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *DualLoggingSuite) SetupTest() {
|
|
s.otlpLogs = []string{}
|
|
|
|
// Create mock OTLP collector
|
|
s.collector = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
defer r.Body.Close()
|
|
|
|
gzr, err := gzip.NewReader(r.Body)
|
|
if err != nil {
|
|
s.T().Logf("Error creating gzip reader: %v", err)
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
defer gzr.Close()
|
|
|
|
body, err := io.ReadAll(gzr)
|
|
if err != nil {
|
|
s.T().Logf("Error reading gzipped body: %v", err)
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
req := plogotlp.NewExportRequest()
|
|
err = req.UnmarshalProto(body)
|
|
if err != nil {
|
|
s.T().Logf("Error unmarshaling protobuf: %v", err)
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
marshalledReq, err := json.Marshal(req)
|
|
if err != nil {
|
|
s.T().Logf("Error marshaling to JSON: %v", err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
s.otlpLogs = append(s.otlpLogs, string(marshalledReq))
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
}))
|
|
}
|
|
|
|
func (s *DualLoggingSuite) TearDownTest() {
|
|
if s.collector != nil {
|
|
s.collector.Close()
|
|
s.collector = nil
|
|
}
|
|
}
|
|
|
|
func (s *DualLoggingSuite) TestOTLPAndStdoutLogging() {
|
|
tempObjects := struct {
|
|
CollectorURL string
|
|
}{
|
|
CollectorURL: s.collector.URL + "/v1/logs",
|
|
}
|
|
|
|
file := s.adaptFile("fixtures/dual_logging/otlp_and_stdout.toml", tempObjects)
|
|
|
|
cmd, display := s.cmdTraefik(withConfigFile(file))
|
|
defer s.displayTraefikLogFile(traefikTestLogFile)
|
|
|
|
s.waitForTraefik("dashboard")
|
|
|
|
time.Sleep(3 * time.Second)
|
|
|
|
s.killCmd(cmd)
|
|
time.Sleep(1 * time.Second)
|
|
|
|
assert.NotEmpty(s.T(), s.otlpLogs)
|
|
|
|
output := display.String()
|
|
otlpOutput := strings.Join(s.otlpLogs, "\n")
|
|
|
|
foundStdoutLog := strings.Contains(output, "Starting provider")
|
|
assert.True(s.T(), foundStdoutLog)
|
|
foundOTLPLog := strings.Contains(otlpOutput, "Starting provider")
|
|
assert.True(s.T(), foundOTLPLog)
|
|
}
|