func NewSqlQuery(config Config) *SqlQuery { sq := &SqlQuery{} sq.qe = NewQueryEngine(config) stats.Publish("TabletState", stats.IntFunc(sq.state.Get)) stats.Publish("TabletStateName", stats.StringFunc(sq.GetState)) return sq }
func NewQueryEngine(config Config) *QueryEngine { var err error qe := &QueryEngine{} qe.engine, err = kvengine.NewEngine(config.EngineName) if err != nil { panic(NewTabletErrorDB(FATAL, err)) } qe.connPool = NewConnectionPool("ConnPool", config.PoolSize, time.Duration(config.IdleTimeout*1e9)) qe.schemaInfo = NewSchemaInfo(config.QueryCacheSize, time.Duration(config.IdleTimeout*1e9)) qe.consolidator = NewConsolidator() qe.maxResultSize = sync2.AtomicInt64(config.MaxResultSize) qe.streamBufferSize = sync2.AtomicInt64(config.StreamBufferSize) stats.Publish("MaxResultSize", stats.IntFunc(qe.maxResultSize.Get)) stats.Publish("StreamBufferSize", stats.IntFunc(qe.streamBufferSize.Get)) queryStats = stats.NewTimings("Queries") QPSRates = stats.NewRates("QPS", queryStats, 15, 60*time.Second) waitStats = stats.NewTimings("Waits") errorStats = stats.NewCounters("Errors") resultStats = stats.NewHistogram("Results", resultBuckets) return qe }
func NewConnectionPool(name string, capacity int, idleTimeout time.Duration) *ConnectionPool { cp := &ConnectionPool{capacity: capacity, idleTimeout: idleTimeout} if name == "" { return cp } stats.Publish(name+"Capacity", stats.IntFunc(cp.Capacity)) stats.Publish(name+"Available", stats.IntFunc(cp.Available)) stats.Publish(name+"MaxCap", stats.IntFunc(cp.MaxCap)) stats.Publish(name+"WaitCount", stats.IntFunc(cp.WaitCount)) stats.Publish(name+"WaitTime", stats.DurationFunc(cp.WaitTime)) stats.Publish(name+"IdleTimeout", stats.DurationFunc(cp.IdleTimeout)) return cp }
func NewSchemaInfo(queryCacheSize int, idleTimeout time.Duration) *SchemaInfo { si := &SchemaInfo{ queryCacheSize: queryCacheSize, queries: cache.NewLRUCache(int64(queryCacheSize)), connPool: NewConnectionPool("Schema", 2, idleTimeout), } stats.Publish("QueryCacheLength", stats.IntFunc(si.queries.Length)) stats.Publish("QueryCacheSize", stats.IntFunc(si.queries.Size)) stats.Publish("QueryCacheCapacity", stats.IntFunc(si.queries.Capacity)) stats.Publish("QueryCacheOldest", stats.StringFunc(func() string { return fmt.Sprintf("%v", si.queries.Oldest()) })) stats.Publish("QueryCounts", stats.NewMatrixFunc("Table", "Plan", si.getQueryCount)) stats.Publish("QueryTimesNs", stats.NewMatrixFunc("Table", "Plan", si.getQueryTime)) stats.Publish("QueryRowCounts", stats.NewMatrixFunc("Table", "Plan", si.getQueryRowCount)) stats.Publish("QueryErrorCounts", stats.NewMatrixFunc("Table", "Plan", si.getQueryErrorCount)) http.Handle("/debug/query_plans", si) http.Handle("/debug/query_stats", si) http.Handle("/debug/table_stats", si) return si }
func NewReservedPool(name string) *ReservedPool { rp := &ReservedPool{pool: pools.NewNumbered(), lastId: 1} stats.Publish(name+"Size", stats.IntFunc(rp.pool.Size)) return rp }