51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
|
|
package elasticsearch
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
"github.com/elastic/go-elasticsearch/v8"
|
||
|
|
"go.uber.org/zap"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Client wraps Elasticsearch client with health check (v0.10.2 F361)
|
||
|
|
type Client struct {
|
||
|
|
*elasticsearch.Client
|
||
|
|
Config Config
|
||
|
|
Logger *zap.Logger
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewClient creates Elasticsearch client when ELASTICSEARCH_URL is set
|
||
|
|
func NewClient(cfg Config, logger *zap.Logger) (*Client, error) {
|
||
|
|
if !cfg.Enabled {
|
||
|
|
return nil, nil
|
||
|
|
}
|
||
|
|
es, err := elasticsearch.NewClient(elasticsearch.Config{
|
||
|
|
Addresses: []string{cfg.URL},
|
||
|
|
})
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("elasticsearch: create client: %w", err)
|
||
|
|
}
|
||
|
|
c := &Client{Client: es, Config: cfg, Logger: logger}
|
||
|
|
if err := c.Ping(context.Background()); err != nil {
|
||
|
|
return nil, fmt.Errorf("elasticsearch: ping: %w", err)
|
||
|
|
}
|
||
|
|
if logger != nil {
|
||
|
|
logger.Info("Elasticsearch client connected", zap.String("url", cfg.URL), zap.String("index", cfg.Index))
|
||
|
|
}
|
||
|
|
return c, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// Ping checks Elasticsearch cluster health
|
||
|
|
func (c *Client) Ping(ctx context.Context) error {
|
||
|
|
res, err := c.Info(c.Info.WithContext(ctx))
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
defer res.Body.Close()
|
||
|
|
if res.IsError() {
|
||
|
|
return fmt.Errorf("elasticsearch info failed: %s", res.String())
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|