1

我在我的应用程序中使用 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)
    }
}
4

2 回答 2

1

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

可能是开始玩它的好地方。

于 2019-09-26T01:37:56.607 回答
0

这就是我们在 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());
于 2019-09-25T05:40:19.933 回答