@@ -5,39 +5,25 @@ package debugexporter // import "go.opentelemetry.io/collector/exporter/debugexp
55
66import (
77 "context"
8- "fmt"
9- "os"
10- "sync"
11- "sync/atomic"
128
139 "go.uber.org/zap"
1410
1511 "go.opentelemetry.io/collector/config/configtelemetry"
1612 "go.opentelemetry.io/collector/exporter/debugexporter/internal/normal"
1713 "go.opentelemetry.io/collector/exporter/debugexporter/internal/otlptext"
18- "go.opentelemetry.io/collector/pdata/pcommon"
1914 "go.opentelemetry.io/collector/pdata/plog"
2015 "go.opentelemetry.io/collector/pdata/pmetric"
2116 "go.opentelemetry.io/collector/pdata/pprofile"
2217 "go.opentelemetry.io/collector/pdata/ptrace"
2318)
2419
25- var failureCnt atomic.Int32
26-
2720type debugExporter struct {
2821 verbosity configtelemetry.Level
2922 logger * zap.Logger
3023 logsMarshaler plog.Marshaler
3124 metricsMarshaler pmetric.Marshaler
3225 tracesMarshaler ptrace.Marshaler
3326 profilesMarshaler pprofile.Marshaler
34- receivedLogs sync.Map
35-
36- totalLogsCount atomic.Int64
37- exportCallCount atomic.Int64
38- expectedLogs int64
39- logFile * os.File
40- fileMutex sync.Mutex
4127}
4228
4329func newDebugExporter (logger * zap.Logger , verbosity configtelemetry.Level ) * debugExporter {
@@ -56,21 +42,13 @@ func newDebugExporter(logger *zap.Logger, verbosity configtelemetry.Level) *debu
5642 tracesMarshaler = normal .NewNormalTracesMarshaler ()
5743 profilesMarshaler = normal .NewNormalProfilesMarshaler ()
5844 }
59-
60- logFile , err := os .OpenFile ("test-logs.txt" , os .O_CREATE | os .O_WRONLY | os .O_APPEND , 0644 )
61- if err != nil {
62- logger .Error ("Failed to open test-logs.txt for writing" , zap .Error (err ))
63- }
64-
6545 return & debugExporter {
6646 verbosity : verbosity ,
6747 logger : logger ,
6848 logsMarshaler : logsMarshaler ,
6949 metricsMarshaler : metricsMarshaler ,
7050 tracesMarshaler : tracesMarshaler ,
7151 profilesMarshaler : profilesMarshaler ,
72- expectedLogs : 10000 ,
73- logFile : logFile ,
7452 }
7553}
7654
@@ -108,87 +86,19 @@ func (s *debugExporter) pushMetrics(_ context.Context, md pmetric.Metrics) error
10886}
10987
11088func (s * debugExporter ) pushLogs (_ context.Context , ld plog.Logs ) error {
111- callNumber := s .exportCallCount .Add (1 )
112-
113- if callNumber % 10 == 0 {
114- s .logger .Warn ("Simulating export failure for 10th call" , zap .Int64 ("call_number" , callNumber ))
115- return fmt .Errorf ("simulated export failure on call %d" , callNumber )
116- }
117-
118- logRecordCount := ld .LogRecordCount ()
119-
120- for i := 0 ; i < ld .ResourceLogs ().Len (); i ++ {
121- resourceLogs := ld .ResourceLogs ().At (i )
122- for j := 0 ; j < resourceLogs .ScopeLogs ().Len (); j ++ {
123- scopeLogs := resourceLogs .ScopeLogs ().At (j )
124- for k := 0 ; k < scopeLogs .LogRecords ().Len (); k ++ {
125- logRecord := scopeLogs .LogRecords ().At (k )
126- if counter , exists := logRecord .Attributes ().Get ("test.log.counter" ); exists {
127- s .receivedLogs .Store (counter .Int (), true )
128- s .writeLogToFile (logRecord , s .totalLogsCount .Load ())
129- }
130- }
131- }
132- }
133-
134- currentCount := s .totalLogsCount .Add (int64 (logRecordCount ))
135- s .logger .Info ("Logs body" , zap .String ("body" , ld .ResourceLogs ().At (0 ).ScopeLogs ().At (0 ).LogRecords ().At (0 ).Body ().AsString ()))
13689 s .logger .Info ("Logs" ,
13790 zap .Int ("resource logs" , ld .ResourceLogs ().Len ()),
138- zap .Int ("log records" , logRecordCount ),
139- zap .Int64 ("total received" , currentCount ),
140- zap .Int64 ("currentCount" , currentCount ),
141- )
142-
143- if currentCount >= s .expectedLogs {
144- uniqueCount := int64 (0 )
145- var missingLogs []int64
146- receivedCounters := make (map [int64 ]bool )
147-
148- s .receivedLogs .Range (func (key , value interface {}) bool {
149- if counter , ok := key .(int64 ); ok {
150- receivedCounters [counter ] = true
151- uniqueCount ++
152- }
153- return true
154- })
155-
156- for i := int64 (1 ); i <= s .expectedLogs ; i ++ {
157- if ! receivedCounters [i ] {
158- missingLogs = append (missingLogs , i )
159- }
160- }
161-
162- successRate := (float64 (uniqueCount ) / float64 (s .expectedLogs )) * 100
163-
164- s .logger .Info ("SUCCESS RATE REPORT" ,
165- zap .Int64 ("expected_logs" , s .expectedLogs ),
166- zap .Int64 ("total_received" , currentCount ),
167- zap .Int64 ("unique_logs" , uniqueCount ),
168- zap .Int ("missing_count" , len (missingLogs )),
169- zap .Float64 ("success_rate_percent" , successRate ))
170-
171- s .writeReportToFile (s .expectedLogs , currentCount , uniqueCount , int64 (len (missingLogs )), successRate , missingLogs )
172-
173- if len (missingLogs ) > 0 && len (missingLogs ) <= 100 {
174- s .logger .Warn ("Missing log counters" , zap .Int64s ("missing" , missingLogs ))
175- } else if len (missingLogs ) > 100 {
176- s .logger .Warn ("Too many missing logs to list" ,
177- zap .Int ("missing_count" , len (missingLogs )),
178- zap .Int64 ("first_missing" , missingLogs [0 ]),
179- zap .Int64 ("last_missing" , missingLogs [len (missingLogs )- 1 ]))
180- }
181- }
91+ zap .Int ("log records" , ld .LogRecordCount ()))
18292
18393 if s .verbosity == configtelemetry .LevelBasic {
18494 return nil
18595 }
18696
187- // buf, err := s.logsMarshaler.MarshalLogs(ld)
188- // if err != nil {
189- // return err
190- // }
191- // s.logger.Info(string(buf))
97+ buf , err := s .logsMarshaler .MarshalLogs (ld )
98+ if err != nil {
99+ return err
100+ }
101+ s .logger .Info (string (buf ))
192102 return nil
193103}
194104
@@ -208,79 +118,3 @@ func (s *debugExporter) pushProfiles(_ context.Context, pd pprofile.Profiles) er
208118 s .logger .Info (string (buf ))
209119 return nil
210120}
211-
212- func (s * debugExporter ) writeLogToFile (logRecord plog.LogRecord , counter int64 ) {
213- if s .logFile == nil {
214- return
215- }
216-
217- s .fileMutex .Lock ()
218- defer s .fileMutex .Unlock ()
219-
220- logLine := fmt .Sprintf ("Counter: %d | Body: %s | Severity: %s | Timestamp: %s" ,
221- counter ,
222- logRecord .Body ().AsString (),
223- logRecord .SeverityText (),
224- logRecord .Timestamp ().String ())
225-
226- var attrs string
227- logRecord .Attributes ().Range (func (k string , v pcommon.Value ) bool {
228- attrs += fmt .Sprintf (" | %s: %s" , k , v .AsString ())
229- return true
230- })
231- logLine += attrs + "\n "
232-
233- _ , err := s .logFile .WriteString (logLine )
234- if err != nil {
235- s .logger .Error ("Failed to write log to file" , zap .Error (err ))
236- }
237- }
238-
239- func (s * debugExporter ) writeReportToFile (expectedLogs , totalReceived , uniqueLogs , missingCount int64 , successRate float64 , missingLogs []int64 ) {
240- if s .logFile == nil {
241- return
242- }
243-
244- s .fileMutex .Lock ()
245- defer s .fileMutex .Unlock ()
246-
247- report := fmt .Sprintf ("\n " +
248- "========================================\n " +
249- " SUCCESS RATE REPORT \n " +
250- "========================================\n " +
251- "Expected Logs: %d\n " +
252- "Total Received: %d\n " +
253- "Unique Logs: %d\n " +
254- "Successfully Received: %d\n " +
255- "Missing/Failed: %d\n " +
256- "Success Rate: %.2f%%\n " +
257- "========================================\n " ,
258- expectedLogs , totalReceived , uniqueLogs , uniqueLogs , missingCount , successRate )
259-
260- if missingCount > 0 && missingCount <= 100 {
261- report += fmt .Sprintf ("\n Missing Log Counters:\n %v\n " , missingLogs )
262- } else if missingCount > 100 {
263- report += fmt .Sprintf ("\n Missing Logs Count: %d\n " , missingCount )
264- report += fmt .Sprintf ("First Missing: %d\n " , missingLogs [0 ])
265- report += fmt .Sprintf ("Last Missing: %d\n " , missingLogs [len (missingLogs )- 1 ])
266- }
267-
268- report += "========================================\n \n "
269-
270- _ , err := s .logFile .WriteString (report )
271- if err != nil {
272- s .logger .Error ("Failed to write report to file" , zap .Error (err ))
273- }
274- }
275-
276- func (s * debugExporter ) Shutdown (_ context.Context ) error {
277- if s .logFile != nil {
278- s .fileMutex .Lock ()
279- defer s .fileMutex .Unlock ()
280- if err := s .logFile .Close (); err != nil {
281- s .logger .Error ("Failed to close log file" , zap .Error (err ))
282- return err
283- }
284- }
285- return nil
286- }
0 commit comments