func (this *Kateway) generateFlameGraph(zkzone *zk.ZkZone) { kws, _ := zkzone.KatewayInfos() for _, kw := range kws { if kw.Id != this.id { continue } pprofAddr := kw.DebugAddr if len(pprofAddr) > 0 && pprofAddr[0] == ':' { pprofAddr = kw.Ip + pprofAddr } pprofAddr = fmt.Sprintf("http://%s/debug/pprof/profile", pprofAddr) cmd := pipestream.New(os.Getenv("GOPATH")+"/bin/go-torch", "-u", pprofAddr) err := cmd.Open() swallow(err) defer cmd.Close() scanner := bufio.NewScanner(cmd.Reader()) scanner.Split(bufio.ScanLines) for scanner.Scan() { fmt.Println(scanner.Text()) } this.Ui.Output("torch.svg generated") } }
func (this *Kateway) installGuide(zkzone *zk.ZkZone) { this.Ui.Output(color.Red("manager db GRANT access rights to this ip")) this.Ui.Output(color.Red("gk deploy -kfkonly")) this.Ui.Output("") this.Ui.Output("mkdir -p /var/wd/kateway/sbin") this.Ui.Output("cd /var/wd/kateway") kateways, err := zkzone.KatewayInfos() swallow(err) nextId := 1 for _, kw := range kateways { id, _ := strconv.Atoi(kw.Id) if nextId < id { nextId = id } } nextId++ zone := ctx.Zone(this.zone) influxAddr := zone.InfluxAddr if influxAddr != "" && !strings.HasPrefix(influxAddr, "http://") { influxAddr = "http://" + influxAddr } var influxInfo string if influxAddr != "" { influxInfo = "-influxdbaddr " + influxAddr } this.Ui.Output(fmt.Sprintf(`nohup ./sbin/kateway -zone prod -id %d -debughttp ":10194" -level trace -log kateway.log -crashlog panic %s &`, nextId, influxInfo)) this.Ui.Output("") this.Ui.Output("yum install -y logstash") this.Ui.Output("/etc/logstash/conf.d/kateway.conf") this.Ui.Output(strings.TrimSpace(fmt.Sprintf(` input { file { path => "/var/wd/kateway/kateway.log" type => "kateway" } file { path => "/var/wd/kateway/panic" type => "kateway_panic" } } output { kafka { bootstrap_servers => "%s:11003,%s:11003" topic_id => "pubsub_log" } } `, color.Red("k11003a.mycorp.kfk.com"), color.Red("k11003b.mycorp.kfk.com")))) this.Ui.Output("") this.Ui.Output("chkconfig --add logstash") this.Ui.Output("/etc/init.d/logstash start") }
func (this *Kateway) runCheckup(zkzone *zk.ZkZone) { zone := ctx.Zone(zkzone.Name()) var ( myApp = zone.SmokeApp hisApp = zone.SmokeHisApp secret = zone.SmokeSecret ver = zone.SmokeTopicVersion topic = zone.SmokeTopic group = zone.SmokeGroup ) if myApp == "" || secret == "" { this.Ui.Warn(fmt.Sprintf("zone[%s] skipped", zkzone.Name())) return } rand.Seed(time.Now().UTC().UnixNano()) kws, err := zkzone.KatewayInfos() swallow(err) if zone.PubEndpoint != "" && zone.SubEndpoint != "" { // add the load balancer endpoint kws = append(kws, &zk.KatewayMeta{ Id: "loadbalancer", PubAddr: zone.PubEndpoint, SubAddr: zone.SubEndpoint, }) } for _, kw := range kws { if this.id != "" && kw.Id != this.id { continue } this.Ui.Info(fmt.Sprintf("zone[%s] kateway[%s]", zkzone.Name(), kw.Id)) // pub a message cf := api.DefaultConfig(myApp, secret) cf.Pub.Endpoint = kw.PubAddr cf.Sub.Endpoint = kw.SubAddr cli := api.NewClient(cf) pubMsg := fmt.Sprintf("gk smoke test msg: [%s]", time.Now()) if this.curl { this.Ui.Output(fmt.Sprintf(`curl -XPOST -H'Appid: %s' -H'Pubkey: %s' -d '%s' %s`, myApp, secret, pubMsg, fmt.Sprintf("http://%s/v1/msgs/%s/%s", kw.PubAddr, topic, ver))) } err = cli.Pub("", []byte(pubMsg), api.PubOption{ Topic: topic, Ver: ver, }) swallow(err) if this.curl { this.Ui.Output(fmt.Sprintf(`curl -XGET -H'Appid: %s' -H'Subkey: %s' %s`, myApp, secret, fmt.Sprintf("http://%s/v1/msgs/%s/%s/%s?group=%s", kw.SubAddr, hisApp, topic, ver, group))) } // confirm that sub can get the pub'ed message err = cli.Sub(api.SubOption{ AppId: hisApp, Topic: topic, Ver: ver, Group: group, AutoClose: true, }, func(statusCode int, subMsg []byte) error { if statusCode != http.StatusOK { return fmt.Errorf("unexpected http status: %s, body:%s", http.StatusText(statusCode), string(subMsg)) } if len(subMsg) < 10 { this.Ui.Warn(fmt.Sprintf("unexpected sub msg: %s", string(subMsg))) } return api.ErrSubStop }) swallow(err) this.Ui.Info(fmt.Sprintf(" ok for %s@%s", kw.Id, kw.Build)) // wait for server cleanup the sub conn time.Sleep(time.Second) // 1. 查询某个pubsub topic的partition数量 // 2. 查看pubsub系统某个topic的生产、消费状态 // 3. pub // 4. sub } }