Я пытаюсь выяснить, что такое сгенерированный запрос для библиотеки 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
Согласно документации, вы можете предоставить собственный 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
также можно использовать, но я пошел по известному пути.
Большое спасибо, я предполагаю, что это потребовало некоторых усилий, чтобы закончить!
Я рад, что смог помочь. Было немного неприятно выяснять, почему это не работает без SetSniff(false) в докере, но кодировать остальное было весело. Оцените ваш комментарий и голосуйте!
Я не знаком с библиотекой, но общее решение состоит в том, чтобы вставить прокси-сервер ведения журнала между вашим приложением и удаленной службой.