Skip to content

ONSdigital/dp-elasticsearch

Repository files navigation

dp-elasticsearch

Elasticsearch library to create an elasticsearch client to be able to make requests to elasticsearch.Currently the library support 2 versions of elasticsearch 2.2 and 7.10. The version 7.10 uses go-elasticsearch library behind the scenes and this library can be viewed as a wrapper around go-elasticsearch library. Please follow readme on how to create different versions of client and how to consume these.

elasticsearch package

Includes implementation of a health checker, that reuses the elasticsearch client to check requests can be made against elasticsearch cluster and known indexes.

setup elasticsearch client

setup ES 2.2 client

import (
    dpEs "github.com/ONSdigital/dp-elasticsearch/v3"
)

...
    esClient, esClientErr := dpEs.NewClient(dpEsClient.Config{
        Address:   cfg.esURL,
    })
    if esClientErr != nil {
        log.Fatal(ctx, "Failed to create dp-elasticsearch client", esClientErr)
    }
...

setup ES 7.10 client

Setting up ES7.10 client is similar as setting up es2.2, just that we need to specify client library as GoElasticV710, as follows:

import (
    dpEs "github.com/ONSdigital/dp-elasticsearch/v3"
)

...
    esClient, esClientErr := dpEs.NewClient(dpEsClient.Config{
        ClientLib: dpEsClient.GoElasticV710,
        Address:   cfg.esURL,
    })
    if esClientErr != nil {
        log.Fatal(ctx, "Failed to create dp-elasticsearch client", esClientErr)
    }
...
Embedding custom http roundtripper with es7.10

You could create custom roundtripper (say if you have to sign requests if you are using es7.10), as follows:

import (
    dpEs "github.com/ONSdigital/dp-elasticsearch/v3"
    "github.com/ONSdigital/dp-net/v3/awsauth"
)

...
if cfg.signRequests {
        fmt.Println("Use a signing roundtripper client")
        awsSignerRT, err := awsauth.NewAWSSignerRoundTripper(awsauth.NewAWSSignerRoundTripper(<aws_filename_placeholder>, <aws_profile_placeholder>, <aws_region_placeholder>, "es",
            awsauth.Options{TlsInsecureSkipVerify: cfg.aws.tlsInsecureSkipVerify})
        if err != nil {
            log.Fatal(ctx, "Failed to create http signer", err)
        }

        esHTTPClient = dphttp.NewClientWithTransport(awsSignerRT)
    }
    
    esClient, esClientErr := dpEs.NewClient(dpEsClient.Config{
        ClientLib: dpEsClient.GoElasticV710,
        Address:   cfg.esURL,
        Transport: esHTTPClient,
    })
    if esClientErr != nil {
        log.Fatal(ctx, "Failed to create dp-elasticsearch client", esClientErr)
    }
...

More details on aws signer roundtripper

setting up bulk indexer with es7.10
import (
    dpEs "github.com/ONSdigital/dp-elasticsearch/v3"
)

...
    esClient, esClientErr := dpEs.NewClient(dpEsClient.Config{
        ClientLib: dpEsClient.GoElasticV710,
        Address:   cfg.esURL,
    })
    if esClientErr != nil {
        log.Fatal(ctx, "Failed to create dp-elasticsearch client", esClientErr)
    }
    
    if err := esClient.NewBulkIndexer(ctx); err != nil {
        log.Fatal(ctx, "Failed to create new bulk indexer")
    }
    
    // Adding docs to bulk indexer
    err := esClient.BulkIndexAdd(ctx, v710.Create, indexName, documentID, documentBody)
        if err != nil {
            log.Fatal(ctx, "Failed to add documents to bulk indexer")
        }
        
    // Close bulk indexer
    err := esClient.BulkIndexClose(ctx)
    if err != nil {
        log.Fatal(ctx, "Failed to close bulk indexer")
    }
...

health checker

Using elasticsearch checker function currently performs a GET request against elasticsearch 'cluster health' API (/_cluster/health")

The healthcheck will only succeed if the request can be performend and the cluster is in green state. If the cluster is in yellow state, a Checker in WARNING status will be returned. In any other case, a CRITICAL Checker will be returned.

Read the Health Check Specification for details.

More information about elasticsearch cluster health API

Instantiate an elasticsearch client

import "github.com/ONSdigital/dp-elasticsearch/elasticsearch/v3"

...
    cli := elasticsearch.NewClient(<url>, <maxRetries>, <optional array of indexes>)
...

Call elasticsearch health checker with cli.Checker(context.Background()) and this will return a check object like so:

{
    "name": "string",
    "status": "string",
    "message": "string",
    "status_code": "int",
    "last_checked": "ISO8601 - UTC date time",
    "last_success": "ISO8601 - UTC date time",
    "last_failure": "ISO8601 - UTC date time"
}

Contributing

See CONTRIBUTING for details.

License

Copyright © 2019-2024, Office for National Statistics https://www.ons.gov.uk

Released under MIT license, see LICENSE for details.

About

elasticsearch client

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 11

Languages