Compare commits

...

6 Commits

Author SHA1 Message Date
loveuer
3a462cfce6 feat: read,write data with buffered 2024-03-26 21:38:03 +08:00
loveuer
486ffba682 update: more msg 2024-03-26 18:26:10 +08:00
loveuer
f75e31ffbb feat: put out es bulk err 2024-03-26 18:10:19 +08:00
loveuer
f990923dd8 Merge tag 'v0.0.3'
v0.0.3 beta
2024-03-26 17:59:30 +08:00
loveuer
91ddffe752 update: add write mapping,setting info msg 2024-03-26 17:31:38 +08:00
loveuer
ff7aa194aa update: add write mapping,setting info msg, go module name 2024-03-26 17:31:36 +08:00
7 changed files with 112 additions and 45 deletions

2
go.mod
View File

@ -1,4 +1,4 @@
module esgo2dump module github.com/loveuer/esgo2dump
go 1.18 go 1.18

View File

@ -2,7 +2,8 @@ package cmd
import ( import (
"context" "context"
"esgo2dump/internal/opt"
"github.com/loveuer/esgo2dump/internal/opt"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )

View File

@ -3,17 +3,16 @@ package cmd
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors"
"esgo2dump/internal/interfaces"
"esgo2dump/internal/opt"
"esgo2dump/internal/xes"
"esgo2dump/internal/xfile"
"fmt" "fmt"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"io"
"net/url" "net/url"
"os" "os"
"github.com/loveuer/esgo2dump/internal/interfaces"
"github.com/loveuer/esgo2dump/internal/opt"
"github.com/loveuer/esgo2dump/internal/xes"
"github.com/loveuer/esgo2dump/internal/xfile"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
) )
func run(cmd *cobra.Command, args []string) error { func run(cmd *cobra.Command, args []string) error {
@ -27,6 +26,10 @@ func run(cmd *cobra.Command, args []string) error {
logrus.SetLevel(logrus.DebugLevel) logrus.SetLevel(logrus.DebugLevel)
} }
if f_limit == 0 || f_limit > 10000 {
return fmt.Errorf("invalid limit(1 - 10000)")
}
switch f_type { switch f_type {
case "data", "mapping", "setting": case "data", "mapping", "setting":
default: default:
@ -55,14 +58,26 @@ func run(cmd *cobra.Command, args []string) error {
return err return err
} }
return ioo.WriteMapping(cmd.Context(), mapping) if err = ioo.WriteMapping(cmd.Context(), mapping); err != nil {
return err
}
logrus.Info("Dump: write mapping succeed!!!")
return nil
case "setting": case "setting":
var setting map[string]any var setting map[string]any
if setting, err = ioi.ReadSetting(cmd.Context()); err != nil { if setting, err = ioi.ReadSetting(cmd.Context()); err != nil {
return err return err
} }
return ioo.WriteSetting(cmd.Context(), setting) if err = ioo.WriteSetting(cmd.Context(), setting); err != nil {
return err
}
logrus.Info("Dump: write setting succeed!!!")
return nil
default: default:
return fmt.Errorf("unknown type=%s", f_type) return fmt.Errorf("unknown type=%s", f_type)
} }
@ -71,34 +86,73 @@ func run(cmd *cobra.Command, args []string) error {
func executeData(ctx context.Context, input, output interfaces.DumpIO) error { func executeData(ctx context.Context, input, output interfaces.DumpIO) error {
var ( var (
err error err error
lines []*interfaces.ESSource ch = make(chan []*interfaces.ESSource, 1)
succeed int errCh = make(chan error)
) )
// write goroutine
go func(c context.Context) {
var (
lines []*interfaces.ESSource
)
defer func() {
close(ch)
}()
for { for {
select {
if lines, err = input.ReadData(ctx, f_limit); err != nil { case <-c.Done():
if errors.Is(err, io.EOF) { return
return nil default:
} if lines, err = input.ReadData(c, f_limit); err != nil {
errCh <- err
return err return
} }
if len(lines) == 0 { if len(lines) == 0 {
return nil ch <- lines
return
} }
if succeed, err = output.WriteData(ctx, lines); err != nil { ch <- lines
}
}
}(ctx)
var (
succeed int
total int
docs []*interfaces.ESSource
ok bool
)
for {
select {
case <-ctx.Done():
case err = <-errCh:
return err
case docs, ok = <-ch:
if !ok {
return err return err
} }
if succeed != len(lines) { if len(docs) == 0 {
return fmt.Errorf("cmd.run: got lines=%d, only succeed=%d", len(lines), succeed) return nil
} }
logrus.Infof("Dump: %d docs succeed!!!", succeed) if succeed, err = output.WriteData(ctx, docs); err != nil {
return err
}
if succeed != len(docs) {
return fmt.Errorf("cmd.run: got lines=%d, only succeed=%d", len(docs), succeed)
}
total += succeed
logrus.Infof("Dump: succeed=%d total=%d docs succeed!!!", succeed, total)
}
} }
} }

View File

@ -5,19 +5,20 @@ import (
"context" "context"
"crypto/tls" "crypto/tls"
"encoding/json" "encoding/json"
"esgo2dump/internal/interfaces"
"esgo2dump/internal/opt"
"esgo2dump/internal/util"
"fmt" "fmt"
elastic "github.com/elastic/go-elasticsearch/v7"
"github.com/elastic/go-elasticsearch/v7/esapi"
"github.com/elastic/go-elasticsearch/v7/esutil"
"github.com/sirupsen/logrus"
"net" "net"
"net/http" "net/http"
"net/url" "net/url"
"strings" "strings"
"time" "time"
elastic "github.com/elastic/go-elasticsearch/v7"
"github.com/elastic/go-elasticsearch/v7/esapi"
"github.com/elastic/go-elasticsearch/v7/esutil"
"github.com/loveuer/esgo2dump/internal/interfaces"
"github.com/loveuer/esgo2dump/internal/opt"
"github.com/loveuer/esgo2dump/internal/util"
"github.com/sirupsen/logrus"
) )
func NewClient(url *url.URL, iot interfaces.IO, qm map[string]any) (interfaces.DumpIO, error) { func NewClient(url *url.URL, iot interfaces.IO, qm map[string]any) (interfaces.DumpIO, error) {
@ -110,6 +111,7 @@ func (c *client) WriteData(ctx context.Context, docs []*interfaces.ESSource) (in
err error err error
indexer esutil.BulkIndexer indexer esutil.BulkIndexer
count int count int
be error
) )
if indexer, err = esutil.NewBulkIndexer(esutil.BulkIndexerConfig{ if indexer, err = esutil.NewBulkIndexer(esutil.BulkIndexerConfig{
Client: c.c, Client: c.c,
@ -133,6 +135,9 @@ func (c *client) WriteData(ctx context.Context, docs []*interfaces.ESSource) (in
Index: c.index, Index: c.index,
DocumentID: doc.DocId, DocumentID: doc.DocId,
Body: bytes.NewReader(bs), Body: bytes.NewReader(bs),
OnFailure: func(ctx context.Context, item esutil.BulkIndexerItem, item2 esutil.BulkIndexerResponseItem, bulkErr error) {
be = bulkErr
},
}); err != nil { }); err != nil {
return 0, err return 0, err
} }
@ -143,9 +148,13 @@ func (c *client) WriteData(ctx context.Context, docs []*interfaces.ESSource) (in
return 0, err return 0, err
} }
if be != nil {
return 0, be
}
stats := indexer.Stats() stats := indexer.Stats()
if stats.NumFailed > 0 { if stats.NumFailed > 0 {
return count, fmt.Errorf("write to xes failed=%d", stats.NumFailed) return count, fmt.Errorf("write to xes failed_count=%d bulk_count=%d", stats.NumFailed, count)
} }
return count, nil return count, nil

View File

@ -1,9 +1,10 @@
package xes package xes
import ( import (
"esgo2dump/internal/util"
elastic "github.com/elastic/go-elasticsearch/v7"
"testing" "testing"
elastic "github.com/elastic/go-elasticsearch/v7"
"github.com/loveuer/esgo2dump/internal/util"
) )
func TestGetESMapping(t *testing.T) { func TestGetESMapping(t *testing.T) {

View File

@ -4,10 +4,11 @@ import (
"bufio" "bufio"
"context" "context"
"encoding/json" "encoding/json"
"esgo2dump/internal/interfaces"
"github.com/sirupsen/logrus"
"io" "io"
"os" "os"
"github.com/loveuer/esgo2dump/internal/interfaces"
"github.com/sirupsen/logrus"
) )
type client struct { type client struct {

View File

@ -2,10 +2,11 @@ package main
import ( import (
"context" "context"
"esgo2dump/internal/cmd"
"os/signal" "os/signal"
"syscall" "syscall"
"github.com/loveuer/esgo2dump/internal/cmd"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )