From 46c4db6b1a0ba507a186b0d491a1cd5d1e485ed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Musab=20G=C3=BCltekin?= Date: Wed, 14 Apr 2021 09:30:17 +0300 Subject: [PATCH] Exporters now need to return error. This is done because of simple error logging. --- export/csv.go | 7 ++++--- export/export.go | 2 +- export/json.go | 32 +++++++++++++++++++------------- geziyor.go | 11 +++++++---- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/export/csv.go b/export/csv.go index 4d91bfd..03f9d33 100644 --- a/export/csv.go +++ b/export/csv.go @@ -17,13 +17,12 @@ type CSV struct { } // Export exports response data as CSV streaming file -func (e *CSV) Export(exports chan interface{}) { +func (e *CSV) Export(exports chan interface{}) error { // Create or append file file, err := os.OpenFile(internal.DefaultString(e.FileName, "out.csv"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { - internal.Logger.Printf("Output file creation error: %v\n", err) - return + return fmt.Errorf("output file creation error: %w", err) } defer file.Close() @@ -53,4 +52,6 @@ func (e *CSV) Export(exports chan interface{}) { } } writer.Flush() + + return nil } diff --git a/export/export.go b/export/export.go index 8f50bd3..90ff313 100644 --- a/export/export.go +++ b/export/export.go @@ -3,5 +3,5 @@ package export // Exporter interface is for extracting data to external resources. // Export functions should wait for new data from exports chan. type Exporter interface { - Export(exports chan interface{}) + Export(exports chan interface{}) error } diff --git a/export/json.go b/export/json.go index ffeadda..7565a17 100644 --- a/export/json.go +++ b/export/json.go @@ -3,6 +3,7 @@ package export import ( "bytes" "encoding/json" + "fmt" "github.com/geziyor/geziyor/internal" "os" ) @@ -16,13 +17,12 @@ type JSONLine struct { } // Export exports response data as JSON streaming file -func (e *JSONLine) Export(exports chan interface{}) { +func (e *JSONLine) Export(exports chan interface{}) error { // Create or append file file, err := os.OpenFile(internal.DefaultString(e.FileName, "out.json"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { - internal.Logger.Printf("Output file creation error: %v\n", err) - return + return fmt.Errorf("output file creation error: %w", err) } defer file.Close() @@ -36,6 +36,8 @@ func (e *JSONLine) Export(exports chan interface{}) { internal.Logger.Printf("JSON encoding error on exporter: %v\n", err) } } + + return nil } // JSON exports response data as JSON @@ -45,17 +47,19 @@ type JSON struct { } // Export exports response data as JSON -func (e *JSON) Export(exports chan interface{}) { +func (e *JSON) Export(exports chan interface{}) error { // Create or append file file, err := os.OpenFile(internal.DefaultString(e.FileName, "out.json"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { - internal.Logger.Printf("Output file creation error: %v\n", err) - return + return fmt.Errorf("output file creation error: %w", err) } defer file.Close() - file.Write([]byte("[\n")) + _, err = file.Write([]byte("[\n")) + if err != nil { + return fmt.Errorf("file write error: %w", err) + } // Export data as responses came for res := range exports { @@ -64,16 +68,18 @@ func (e *JSON) Export(exports chan interface{}) { internal.Logger.Printf("JSON encoding error on exporter: %v\n", err) continue } - file.Write(data) + _, err = file.Write(data) + if err != nil { + return fmt.Errorf("file write error: %w", err) + } } - // Override on last comma - stat, err := file.Stat() + _, err = file.Write([]byte("]\n")) if err != nil { - file.Write([]byte("]\n")) - return + return fmt.Errorf("file write error: %w", err) } - file.WriteAt([]byte("\n]\n"), stat.Size()-2) + + return nil } // jsonMarshalLine adds tab and comma around actual data diff --git a/geziyor.go b/geziyor.go index 6625219..7285ecc 100644 --- a/geziyor.go +++ b/geziyor.go @@ -3,6 +3,7 @@ package geziyor import ( "github.com/geziyor/geziyor/cache" "github.com/geziyor/geziyor/client" + "github.com/geziyor/geziyor/export" "github.com/geziyor/geziyor/internal" "github.com/geziyor/geziyor/metrics" "github.com/geziyor/geziyor/middleware" @@ -139,11 +140,13 @@ func (g *Geziyor) Start() { // Start Exporters if len(g.Opt.Exporters) != 0 { g.wgExporters.Add(len(g.Opt.Exporters)) - for _, exp := range g.Opt.Exporters { - go func() { + for _, exporter := range g.Opt.Exporters { + go func(exporter export.Exporter) { defer g.wgExporters.Done() - exp.Export(g.Exports) - }() + if err := exporter.Export(g.Exports); err != nil { + internal.Logger.Printf("exporter error: %s\n", err) + } + }(exporter) } } else { g.wgExporters.Add(1)