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
|
// 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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
11
geziyor.go
11
geziyor.go
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user