|
|
@@ -39,6 +39,7 @@ type Session struct {
|
|
|
trace Tracer
|
|
|
queryObserver QueryObserver
|
|
|
batchObserver BatchObserver
|
|
|
+ connectObserver ConnectObserver
|
|
|
frameObserver FrameHeaderObserver
|
|
|
hostSource *ringDescriber
|
|
|
stmtsLRU *preparedLRU
|
|
|
@@ -107,12 +108,13 @@ func NewSession(cfg ClusterConfig) (*Session, error) {
|
|
|
}
|
|
|
|
|
|
s := &Session{
|
|
|
- cons: cfg.Consistency,
|
|
|
- prefetch: 0.25,
|
|
|
- cfg: cfg,
|
|
|
- pageSize: cfg.PageSize,
|
|
|
- stmtsLRU: &preparedLRU{lru: lru.New(cfg.MaxPreparedStmts)},
|
|
|
- quit: make(chan struct{}),
|
|
|
+ cons: cfg.Consistency,
|
|
|
+ prefetch: 0.25,
|
|
|
+ cfg: cfg,
|
|
|
+ pageSize: cfg.PageSize,
|
|
|
+ stmtsLRU: &preparedLRU{lru: lru.New(cfg.MaxPreparedStmts)},
|
|
|
+ quit: make(chan struct{}),
|
|
|
+ connectObserver: cfg.ConnectObserver,
|
|
|
}
|
|
|
|
|
|
s.schemaDescriber = newSchemaDescriber(s)
|
|
|
@@ -139,6 +141,7 @@ func NewSession(cfg ClusterConfig) (*Session, error) {
|
|
|
|
|
|
s.queryObserver = cfg.QueryObserver
|
|
|
s.batchObserver = cfg.BatchObserver
|
|
|
+ s.connectObserver = cfg.ConnectObserver
|
|
|
s.frameObserver = cfg.FrameHeaderObserver
|
|
|
|
|
|
//Check the TLS Config before trying to connect to anything external
|
|
|
@@ -641,6 +644,17 @@ func (s *Session) MapExecuteBatchCAS(batch *Batch, dest map[string]interface{})
|
|
|
}
|
|
|
|
|
|
func (s *Session) connect(host *HostInfo, errorHandler ConnErrorHandler) (*Conn, error) {
|
|
|
+ if s.connectObserver != nil {
|
|
|
+ obs := ObservedConnect{
|
|
|
+ Host: host,
|
|
|
+ Start: time.Now(),
|
|
|
+ }
|
|
|
+ conn, err := s.dial(host, s.connCfg, errorHandler)
|
|
|
+ obs.End = time.Now()
|
|
|
+ obs.Err = err
|
|
|
+ s.connectObserver.ObserveConnect(obs)
|
|
|
+ return conn, err
|
|
|
+ }
|
|
|
return s.dial(host, s.connCfg, errorHandler)
|
|
|
}
|
|
|
|
|
|
@@ -1715,6 +1729,23 @@ type BatchObserver interface {
|
|
|
ObserveBatch(context.Context, ObservedBatch)
|
|
|
}
|
|
|
|
|
|
+type ObservedConnect struct {
|
|
|
+ // Host is the information about the host about to connect
|
|
|
+ Host *HostInfo
|
|
|
+
|
|
|
+ Start time.Time // time immediately before the dial is called
|
|
|
+ End time.Time // time immediately after the dial returned
|
|
|
+
|
|
|
+ // Err is the connection error (if any)
|
|
|
+ Err error
|
|
|
+}
|
|
|
+
|
|
|
+// ConnectObserver is the interface implemented by connect observers / stat collectors.
|
|
|
+type ConnectObserver interface {
|
|
|
+ // ObserveConnect gets called when a new connection to cassandra is made.
|
|
|
+ ObserveConnect(ObservedConnect)
|
|
|
+}
|
|
|
+
|
|
|
type Error struct {
|
|
|
Code int
|
|
|
Message string
|