Exporters now need to return error. This is done because of simple error logging.
This commit is contained in:
parent
e3d79e2574
commit
46c4db6b1a
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
11
geziyor.go
11
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user