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
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
}

View File

@ -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
}

View File

@ -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

View File

@ -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)