Exporters now need to return error. This is done because of simple error logging.

This commit is contained in:
Musab Gültekin 2021-04-14 09:30:17 +03:00
parent e3d79e2574
commit 46c4db6b1a
4 changed files with 31 additions and 21 deletions

View File

@ -17,13 +17,12 @@ type CSV struct {
} }
// Export exports response data as CSV streaming file // 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 // Create or append file
file, err := os.OpenFile(internal.DefaultString(e.FileName, "out.csv"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) file, err := os.OpenFile(internal.DefaultString(e.FileName, "out.csv"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil { if err != nil {
internal.Logger.Printf("Output file creation error: %v\n", err) return fmt.Errorf("output file creation error: %w", err)
return
} }
defer file.Close() defer file.Close()
@ -53,4 +52,6 @@ func (e *CSV) Export(exports chan interface{}) {
} }
} }
writer.Flush() writer.Flush()
return nil
} }

View File

@ -3,5 +3,5 @@ package export
// Exporter interface is for extracting data to external resources. // Exporter interface is for extracting data to external resources.
// Export functions should wait for new data from exports chan. // Export functions should wait for new data from exports chan.
type Exporter interface { type Exporter interface {
Export(exports chan interface{}) Export(exports chan interface{}) error
} }

View File

@ -3,6 +3,7 @@ package export
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt"
"github.com/geziyor/geziyor/internal" "github.com/geziyor/geziyor/internal"
"os" "os"
) )
@ -16,13 +17,12 @@ type JSONLine struct {
} }
// Export exports response data as JSON streaming file // 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 // Create or append file
file, err := os.OpenFile(internal.DefaultString(e.FileName, "out.json"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) file, err := os.OpenFile(internal.DefaultString(e.FileName, "out.json"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil { if err != nil {
internal.Logger.Printf("Output file creation error: %v\n", err) return fmt.Errorf("output file creation error: %w", err)
return
} }
defer file.Close() 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) internal.Logger.Printf("JSON encoding error on exporter: %v\n", err)
} }
} }
return nil
} }
// JSON exports response data as JSON // JSON exports response data as JSON
@ -45,17 +47,19 @@ type JSON struct {
} }
// Export exports response data as JSON // 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 // Create or append file
file, err := os.OpenFile(internal.DefaultString(e.FileName, "out.json"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) file, err := os.OpenFile(internal.DefaultString(e.FileName, "out.json"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil { if err != nil {
internal.Logger.Printf("Output file creation error: %v\n", err) return fmt.Errorf("output file creation error: %w", err)
return
} }
defer file.Close() 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 // Export data as responses came
for res := range exports { 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) internal.Logger.Printf("JSON encoding error on exporter: %v\n", err)
continue continue
} }
file.Write(data) _, err = file.Write(data)
if err != nil {
return fmt.Errorf("file write error: %w", err)
}
} }
// Override on last comma _, err = file.Write([]byte("]\n"))
stat, err := file.Stat()
if err != nil { if err != nil {
file.Write([]byte("]\n")) return fmt.Errorf("file write error: %w", err)
return
} }
file.WriteAt([]byte("\n]\n"), stat.Size()-2)
return nil
} }
// jsonMarshalLine adds tab and comma around actual data // jsonMarshalLine adds tab and comma around actual data

View File

@ -3,6 +3,7 @@ package geziyor
import ( import (
"github.com/geziyor/geziyor/cache" "github.com/geziyor/geziyor/cache"
"github.com/geziyor/geziyor/client" "github.com/geziyor/geziyor/client"
"github.com/geziyor/geziyor/export"
"github.com/geziyor/geziyor/internal" "github.com/geziyor/geziyor/internal"
"github.com/geziyor/geziyor/metrics" "github.com/geziyor/geziyor/metrics"
"github.com/geziyor/geziyor/middleware" "github.com/geziyor/geziyor/middleware"
@ -139,11 +140,13 @@ func (g *Geziyor) Start() {
// Start Exporters // Start Exporters
if len(g.Opt.Exporters) != 0 { if len(g.Opt.Exporters) != 0 {
g.wgExporters.Add(len(g.Opt.Exporters)) g.wgExporters.Add(len(g.Opt.Exporters))
for _, exp := range g.Opt.Exporters { for _, exporter := range g.Opt.Exporters {
go func() { go func(exporter export.Exporter) {
defer g.wgExporters.Done() 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 { } else {
g.wgExporters.Add(1) g.wgExporters.Add(1)