Как я могу отлаживать/просматривать сгенерированный запрос при использовании библиотеки Olivere/Elastic elasticsearch go?

Я пытаюсь выяснить, что такое сгенерированный запрос для библиотеки https://github.com/olivere/elastic, как и в фактическом запросе значения JSON, который отправляется на сервер elasticsearch.

Существует некоторая документация о журнале трассировки (который я использовал, как показано ниже), но, похоже, он не включает запрос.

client, err := elastic.NewClient(
...
elastic.SetTraceLog(log.New(os.Stdout,"",0)),
)

Я также не могу найти ничего подходящего в документации здесь: https://pkg.go.dev/github.com/olivere/elastic?utm_source=godoc

Я не знаком с библиотекой, но общее решение состоит в том, чтобы вставить прокси-сервер ведения журнала между вашим приложением и удаленной службой.

larsks 18.04.2023 15:10
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документации, вы можете предоставить собственный HTTP-клиент:

// Получить клиента. Вы также можете предоставить свой собственный HTTP-клиент здесь.
клиент, ошибка: = elastic.NewClient (elastic.SetErrorLog (журнал ошибок))

Ну, на этом документация заканчивается :)... и собственно вы должны предоставить Doer интерфейс.
Я создал экземпляр структуры, реализующей интерфейс Doer, и украсил http.Do(), чтобы регистрировать дамп http.request:

Отказ от ответственности: Это всего лишь минимальный пример, который я использовал для эластичного экземпляра, работающего в док-контейнере, в рамках этого вопроса. В рабочей среде не запускайте небезопасный TLS, не вводите учетные данные в жестком коде, не настраивайте HTTP-транспорт по мере необходимости и т. д.

package main

import (
    "context"
    "crypto/tls"
    "fmt"
    "net/http"
    "net/http/httputil"

    "github.com/olivere/elastic/v7"
)

type LoggingHttpElasticClient struct {
    c http.Client
}

func (l LoggingHttpElasticClient) Do(r *http.Request) (*http.Response, error) {
    // Log the http request dump
    requestDump, err := httputil.DumpRequest(r, true)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("reqDump: " + string(requestDump))
    return l.c.Do(r)
}

func main() {
    doer := LoggingHttpElasticClient{
        c: http.Client{
            // Load a trusted CA here, if running in production
            Transport: &http.Transport{
                TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
            },
        },
    }

    client, err := elastic.NewClient(
        // Provide the logging doer here
        elastic.SetHttpClient(doer),

        elastic.SetBasicAuth("elastic", "<password>"),
        elastic.SetURL("https://<address>:9200"),
        elastic.SetSniff(false), // this is specific to my docker elastic runtime
    )
    if err != nil {
        panic(err)
    }

    /*
        Generate a random HTTP request to check if it's logged
    */
    ac := client.Alias()
    ac.Add("myIndex", "myAlias").Do(context.Background())
}

И вот результат:

reqDump: POST /_aliases HTTP/1.1
Host: 127.0.0.1:9200
Accept: application/json
Authorization: Basic base64(<user>:<pass>)
Content-Type: application/json
User-Agent: elastic/7.0.32 (linux-amd64)

{"actions":[{"add":{"alias":"myAlias","index":"myIndex"}}]}

Я предполагаю, что SetTraceLog также можно использовать, но я пошел по известному пути.

Большое спасибо, я предполагаю, что это потребовало некоторых усилий, чтобы закончить!

Chris Stryczynski 19.04.2023 16:03

Я рад, что смог помочь. Было немного неприятно выяснять, почему это не работает без SetSniff(false) в докере, но кодировать остальное было весело. Оцените ваш комментарий и голосуйте!

Neo Anderson 19.04.2023 23:00

Другие вопросы по теме