Как регистрировать запросы Cassandra на стороне приложения? - PullRequest
0 голосов
/ 24 сентября 2019

Я использую драйвер gocql в своем приложении.Есть ли способ для драйвера регистрировать запросы на консоли?Как настроить регистратор для печати полных запросов (вместе с привязками данных)

package main

import (
    "fmt"

    "github.com/gocql/gocql"
)

var Session *gocql.Session

type Emp struct {
    id        string
    firstName string
    lastName  string
    age       int
}

func init() {
    var err error

    cluster := gocql.NewCluster("localhost")
    cluster.Keyspace = "cms"
    Session, err = cluster.CreateSession()
    if err != nil {
        panic(err)
    }
    fmt.Println("cassandra init done")
}

func main() {
    e := Emp{
        id:        "1",
        firstName: "John",
        lastName:  "DOe",
        age:       88,
    }
    createEmp(e)
}
func createEmp(emp Emp) {
    fmt.Println(" **** Creating new emp ****\n", emp)
    if err := Session.Query("INSERT INTO emps(empid, first_name, last_name, age) VALUES(?, ?, ?, ?)",
        emp.id, emp.firstName, emp.lastName, emp.age).Exec(); err != nil {
        fmt.Println("Error while inserting Emp")
        fmt.Println(err)
    }
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

В драйвере go есть QueryObserver, который вы можете реализовать для запросов времени: https://github.com/gocql/gocql/blob/master/session.go#L1891-L1926

Вы можете проверить, что время выполнения превысило пороговое значение, а затем распечатать его по мере необходимости, но похоже, чтоон дает вам доступ к объекту оператора, хосту и таймингу, что все, что вам нужно для отладки.

Вот пример кода, который показывает QueryObserver в действии в контексте определения времени воздействия спекулятивного выполнения: https://github.com/instaclustr/sample-GoCql-Speculative-Execution/blob/master/spectest.go

Приведенный выше пример взят из следующего сообщения в блоге о спекулятивном выполнении:https://www.instaclustr.com/speculative-query-executions-gocql/

(Если у вас есть проблемы с задержкой хвоста, вам, вероятно, следует подумать об использовании спекулятивного выполнения на стороне клиента, но это другая тема:)

Кроме того, есть тестовый примерв дереве, которое использует QueryObserver для проверки: https://github.com/gocql/gocql/blob/16cf9ea1b3e28090d416d36528f304e4553e6b56/cassandra_test.go#L140

Может быть хорошим местом, чтобы начать играть с ним.

0 голосов
/ 25 сентября 2019

Вот как мы это делаем на Java.Мы определяем пользовательский LatencyTracker:

private LatencyTracker getLatencyTracker() {
    return new LatencyTracker() {
        @Override
        public void update(Host host, Statement statement, Exception e, long l) {
            LOGGER.info(statement.toString());
        }

        @Override
        public void onRegister(Cluster cluster1) {

        }

        @Override
        public void onUnregister(Cluster cluster1) {

        }
    };
}

Затем регистрируем его в кластере:

cluster.register(getLatencyTracker());
...