// NewRowcacheInvalidator creates a new RowcacheInvalidator. // Just like QueryEngine, this is a singleton class. // You must call this only once. func NewRowcacheInvalidator(qe *QueryEngine) *RowcacheInvalidator { rci := &RowcacheInvalidator{qe: qe} stats.Publish("RowcacheInvalidatorState", stats.StringFunc(rci.svm.StateName)) stats.Publish("RowcacheInvalidatorPosition", stats.StringFunc(rci.PositionString)) stats.Publish("RowcacheInvalidatorLagSeconds", stats.IntFunc(rci.lagSeconds.Get)) return rci }
func NewSchemaInfo(queryCacheSize int, reloadTime time.Duration, idleTimeout time.Duration) *SchemaInfo { si := &SchemaInfo{ queries: cache.NewLRUCache(int64(queryCacheSize)), connPool: dbconnpool.NewConnectionPool("", 2, idleTimeout), ticks: timer.NewTimer(reloadTime), } 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("SchemaReloadTime", stats.DurationFunc(si.ticks.Interval)) _ = stats.NewMultiCountersFunc("TableStats", []string{"Table", "Stats"}, si.getTableStats) _ = stats.NewMultiCountersFunc("TableInvalidations", []string{"Table"}, si.getTableInvalidations) _ = stats.NewMultiCountersFunc("QueryCounts", []string{"Table", "Plan"}, si.getQueryCount) _ = stats.NewMultiCountersFunc("QueryTimesNs", []string{"Table", "Plan"}, si.getQueryTime) _ = stats.NewMultiCountersFunc("QueryRowCounts", []string{"Table", "Plan"}, si.getQueryRowCount) _ = stats.NewMultiCountersFunc("QueryErrorCounts", []string{"Table", "Plan"}, si.getQueryErrorCount) http.Handle("/debug/query_plans", si) http.Handle("/debug/query_stats", si) http.Handle("/debug/table_stats", si) http.Handle("/debug/schema", si) return si }
// NewSqlQuery creates an instance of SqlQuery. Only one instance // of SqlQuery can be created per process. 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 (s *MemcacheStats) publishMainStats() { s.mu.Lock() defer s.mu.Unlock() s.main = make(map[string]string) for key, isstr := range mainStringMetrics { key := key if isstr { s.main[key] = "" stats.Publish(s.cachePool.name+"Memcache"+formatKey(key), stats.StringFunc(func() string { s.mu.Lock() defer s.mu.Unlock() return s.main[key] })) } else { s.main[key] = "0" stats.Publish(s.cachePool.name+"Memcache"+formatKey(key), stats.IntFunc(func() int64 { s.mu.Lock() defer s.mu.Unlock() ival, err := strconv.ParseInt(s.main[key], 10, 64) if err != nil { log.Errorf("value '%v' for key %v is not an int", s.main[key], key) internalErrors.Add("MemcacheStats", 1) return -1 } return ival })) } } }
func newZkCell(name, zkaddr string, zkrstats *zkrStats) *zkCell { result := &zkCell{cellName: name, zkAddr: zkaddr, zcache: newZkCache(), zkrStats: zkrstats} result.ready = sync.NewCond(&result.mutex) stats.Publish("Zcell"+name, stats.StringFunc(func() string { result.mutex.Lock() defer result.mutex.Unlock() return stateNames[result.state] })) go result.backgroundRefresher() return result }
// RegisterUpdateStreamService needs to be called to start listening // to clients func RegisterUpdateStreamService(mycnf *mysqlctl.Mycnf) { // check we haven't been called already if UpdateStreamRpcService != nil { panic("Update Stream service already initialized") } // create the singleton UpdateStreamRpcService = &UpdateStream{mycnf: mycnf} stats.Publish("UpdateStreamState", stats.StringFunc(func() string { return usStateNames[UpdateStreamRpcService.state.Get()] })) // and register all the instances for _, f := range RegisterUpdateStreamServices { f(UpdateStreamRpcService) } }