// WriteManagerStatsJSON writes JSON stats for a manager, and is // optionally focus'able on a particular indexName. func WriteManagerStatsJSON(mgr *cbgt.Manager, w io.Writer, indexName string) error { feeds, pindexes := mgr.CurrentMaps() feedNames := make([]string, 0, len(feeds)) for feedName := range feeds { feedNames = append(feedNames, feedName) } sort.Strings(feedNames) pindexNames := make([]string, 0, len(pindexes)) for pindexName := range pindexes { pindexNames = append(pindexNames, pindexName) } sort.Strings(pindexNames) feedStats := make(map[string][]byte) for _, feedName := range feedNames { var buf bytes.Buffer err := feeds[feedName].Stats(&buf) if err != nil { return fmt.Errorf("feed stats err: %v", err) } feedStats[feedName] = buf.Bytes() } pindexStats := make(map[string][]byte) for _, pindexName := range pindexNames { var buf bytes.Buffer err := pindexes[pindexName].Dest.Stats(&buf) if err != nil { return fmt.Errorf("pindex stats err: %v", err) } pindexStats[pindexName] = buf.Bytes() } w.Write(cbgt.JsonOpenBrace) first := true w.Write(statsFeedsPrefix) for _, feedName := range feedNames { if indexName == "" || indexName == feeds[feedName].IndexName() { if !first { w.Write(cbgt.JsonComma) } first = false w.Write(statsNamePrefix) w.Write([]byte(feedName)) w.Write(statsNameSuffix) w.Write(feedStats[feedName]) } } w.Write(cbgt.JsonCloseBraceComma) first = true w.Write(statsPIndexesPrefix) for _, pindexName := range pindexNames { if indexName == "" || indexName == pindexes[pindexName].IndexName { if !first { w.Write(cbgt.JsonComma) } first = false w.Write(statsNamePrefix) w.Write([]byte(pindexName)) w.Write(statsNameSuffix) w.Write(pindexStats[pindexName]) } } w.Write(cbgt.JsonCloseBrace) if indexName == "" { w.Write(statsManagerPrefix) var mgrStats cbgt.ManagerStats mgr.StatsCopyTo(&mgrStats) mgrStatsJSON, err := json.Marshal(&mgrStats) if err == nil && len(mgrStatsJSON) > 0 { w.Write(mgrStatsJSON) } else { w.Write(cbgt.JsonNULL) } } w.Write(cbgt.JsonCloseBrace) return nil }