func (this *Topology) displayZoneMaxPort(zkzone *zk.ZkZone) { maxPort := 0 zkzone.ForSortedBrokers(func(cluster string, liveBrokers map[string]*zk.BrokerZnode) { for _, broker := range liveBrokers { if maxPort < broker.Port { maxPort = broker.Port } } }) this.Ui.Output(fmt.Sprintf("max port in zone[%s]: %d", zkzone.Name(), maxPort)) }
func (this *Brokers) maxBrokerId(zkzone *zk.ZkZone, clusterName string) int { var maxBrokerId int zkzone.ForSortedBrokers(func(cluster string, liveBrokers map[string]*zk.BrokerZnode) { if cluster == clusterName { for _, b := range liveBrokers { id, _ := strconv.Atoi(b.Id) if id > maxBrokerId { maxBrokerId = id } } } }) return maxBrokerId }
func (this *Clusters) verifyBrokers(zkzone *zk.ZkZone) { this.Ui.Output(zkzone.Name()) zkzone.ForSortedBrokers(func(cluster string, liveBrokers map[string]*zk.BrokerZnode) { zkcluster := zkzone.NewCluster(cluster) registeredBrokers := zkcluster.RegisteredInfo().Roster // find diff between registeredBrokers and liveBrokers // loop1 find liveBrokers>registeredBrokers for _, broker := range liveBrokers { foundInRoster := false for _, b := range registeredBrokers { bid := strconv.Itoa(b.Id) if bid == broker.Id && broker.Addr() == b.Addr() { foundInRoster = true break } } if !foundInRoster { // should manually register the broker this.Ui.Output(strings.Repeat(" ", 4) + color.Green("+ gk clusters -z %s -s -c %s -addbroker %s:%s", zkzone.Name(), cluster, broker.Id, broker.Addr())) } } // loop2 find liveBrokers<registeredBrokers for _, b := range registeredBrokers { foundInLive := false for _, broker := range liveBrokers { bid := strconv.Itoa(b.Id) if bid == broker.Id && broker.Addr() == b.Addr() { foundInLive = true break } } if !foundInLive { // the broker is dead this.Ui.Output(strings.Repeat(" ", 4) + color.Red("cluster[%s] broker[%d] %s is dead", cluster, b.Id, b.Addr())) } } }) }
func (this *Brokers) displayZoneBrokers(zkzone *zk.ZkZone) { lines := make([]string, 0) header := "Zone|Cluster|Id|Broker|Uptime" lines = append(lines, header) n := 0 zkzone.ForSortedBrokers(func(cluster string, liveBrokers map[string]*zk.BrokerZnode) { outputs := this.clusterBrokers(zkzone.Name(), cluster, liveBrokers) n += len(outputs) lines = append(lines, outputs...) }) if this.staleOnly { this.Ui.Info(fmt.Sprintf("%d problematic brokers in zone[%s]", n, zkzone.Name())) } else { this.Ui.Info(fmt.Sprintf("%d brokers in zone[%s]", n, zkzone.Name())) } if len(lines) > 1 { // lines has header this.Ui.Output(columnize.SimpleFormat(lines)) } }
func (this *Topology) displayZoneTopology(zkzone *zk.ZkZone) { this.Ui.Output(zkzone.Name()) // {cluster: {topic: brokerHostInfo}} brokerInstances := make(map[string]map[string]*brokerHostInfo) zkzone.ForSortedBrokers(func(cluster string, liveBrokers map[string]*zk.BrokerZnode) { if len(liveBrokers) == 0 { this.Ui.Warn(fmt.Sprintf("empty brokers in cluster[%s]", cluster)) return } if this.cluster != "" && this.cluster != cluster { return } brokerInstances[cluster] = make(map[string]*brokerHostInfo) for _, broker := range liveBrokers { if !patternMatched(broker.Host, this.hostPattern) { continue } if _, present := brokerInstances[cluster][broker.Host]; !present { brokerInstances[cluster][broker.Host] = newBrokerHostInfo() } brokerInstances[cluster][broker.Host].addPort(broker.Port, broker.Uptime()) } // find how many partitions a broker is leading zkcluster := zkzone.NewCluster(cluster) brokerList := zkcluster.BrokerList() if len(brokerList) == 0 { this.Ui.Warn(fmt.Sprintf("empty brokers in cluster[%s]", cluster)) return } kfk, err := sarama.NewClient(brokerList, sarama.NewConfig()) if err != nil { this.Ui.Error(color.Red(" %+v %s", brokerList, err.Error())) return } topics, err := kfk.Topics() swallow(err) for _, topic := range topics { partions, err := kfk.WritablePartitions(topic) swallow(err) for _, partitionID := range partions { leader, err := kfk.Leader(topic, partitionID) swallow(err) host, _, err := net.SplitHostPort(leader.Addr()) swallow(err) if !patternMatched(host, this.hostPattern) { continue } latestOffset, err := kfk.GetOffset(topic, partitionID, sarama.OffsetNewest) if err != nil { this.Ui.Error(fmt.Sprintf("%s %s %v", cluster, topic, err)) continue } oldestOffset, err := kfk.GetOffset(topic, partitionID, sarama.OffsetOldest) if err != nil { this.Ui.Error(fmt.Sprintf("%s %s %v", cluster, topic, err)) continue } brokerInstances[cluster][host].topicMsgs[topic] += (latestOffset - oldestOffset) brokerInstances[cluster][host].addTopicPartition(topic, partitionID) } } }) hosts := make(map[string]struct{}) zkzone.ForSortedClusters(func(zkcluster *zk.ZkCluster) { for host, _ := range brokerInstances[zkcluster.Name()] { hosts[host] = struct{}{} } }) sortedHosts := make([]string, 0) for host, _ := range hosts { sortedHosts = append(sortedHosts, host) } sort.Strings(sortedHosts) // sort by host ip sortedClusters := make([]string, 0, len(brokerInstances)) for c, _ := range brokerInstances { sortedClusters = append(sortedClusters, c) } sort.Strings(sortedClusters) portN := 0 hostN := 0 topicN := 0 partitionN := 0 for _, host := range sortedHosts { tn := 0 pn := 0 mn := int64(0) ports := make([]int, 0) for _, cluster := range sortedClusters { if _, present := brokerInstances[cluster][host]; !present { continue } tn += len(brokerInstances[cluster][host].topicPartitions) pn += brokerInstances[cluster][host].leadingPartitions() mn += brokerInstances[cluster][host].totalMsgsInStock() ports = append(ports, brokerInstances[cluster][host].tcpPorts...) } portN += len(ports) topicN += tn partitionN += pn hostN += 1 this.Ui.Output(fmt.Sprintf(" %s leading: %2dT %3dP %15sM ports %2d:%+v", color.Green("%15s", host), tn, pn, gofmt.Comma(mn), len(ports), ports)) if this.verbose { for _, cluster := range sortedClusters { if _, present := brokerInstances[cluster][host]; !present { continue } for _, tcpPort := range brokerInstances[cluster][host].tcpPorts { this.Ui.Output(fmt.Sprintf("%40d %s", tcpPort, gofmt.PrettySince(brokerInstances[cluster][host].uptimes[tcpPort]))) } } for _, cluster := range sortedClusters { if _, present := brokerInstances[cluster][host]; !present { continue } this.Ui.Output(color.Magenta("%30s", cluster)) for topic, partitions := range brokerInstances[cluster][host].topicPartitions { this.Ui.Output(fmt.Sprintf("%40s: %15sM P%2d %+v", topic, gofmt.Comma(brokerInstances[cluster][host].topicMsgs[topic]), len(partitions), partitions)) } } } } this.Ui.Output(fmt.Sprintf("%17s host:%d, topic:%d, partition:%d, instance:%d", "-TOTAL-", hostN, topicN, partitionN, portN)) }