Maison  >  Article  >  développement back-end  >  Comment déboguer/afficher les requêtes générées lors de l'utilisation de la bibliothèque olivere/elastic elasticsearch go ?

Comment déboguer/afficher les requêtes générées lors de l'utilisation de la bibliothèque olivere/elastic elasticsearch go ?

WBOY
WBOYavant
2024-02-15 09:09:081149parcourir

使用 olivere/elastic elasticsearch go 库时如何调试/查看生成的查询?

Le débogage et l'affichage des requêtes générées sont une étape très importante lors de l'utilisation de la bibliothèque olivere/elastic elasticsearch go. Pendant le développement, nous devons souvent nous assurer que les requêtes que nous construisons sont correctes et renvoient les résultats attendus. L'éditeur PHP Xinyi vous présentera quelques méthodes pour déboguer et afficher les requêtes générées afin de garantir que votre code fonctionne correctement. Que ce soit dans un environnement de développement ou de production, ces conseils vous aideront à mieux comprendre et déboguer votre code.

Contenu de la question

J'essaie de savoir quelle est la requête générée par la bibliothèque https://github.com/olivere/elastic comme la requête de valeur json réelle envoyée au serveur elasticsearch.

Il existe une documentation sur les journaux de traçage (celle que j'ai utilisée est présentée ci-dessous), mais elle ne semble pas inclure les requêtes.

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

Je n'arrive pas non plus à trouver quoi que ce soit de pertinent dans la documentation ici : https://pkg.go.dev/github.com/olivere/elastic?utm_source=godoc

Workaround

Selon la documentation que vous pouvez vous fournir Client http :

// Récupérez le client. Vous pouvez également fournir votre propre client http ici.
Client, erreur := elastic.newclient(elastic.seterrorlog(errorlog))

D'accord, c'est la fin de la documentation :)...en fait, vous devez fournir l'interface doer.
J'ai instancié une structure implémentant l'interface doer 接口的结构,并装饰了 http.do() et décoré http.do() pour enregistrer le dump http.request :

Avertissement : Pour la portée de cette question, il ne s'agit que d'un exemple minimal de ce que j'utilise sur une instance élastique exécutée dans un conteneur Docker. En production, n'exécutez pas de tls non sécurisés, ne codez pas en dur les informations d'identification, configurez le transport http selon vos besoins, etc.

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())
}

Voici le résultat :

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"}}]}

J'ai supposé qu'il serait également possible d'utiliser settracelog, mais j'ai choisi un chemin connu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer