224 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"encoding/json"
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 	"io/ioutil"
 | |
| 	"net/http"
 | |
| 	"os"
 | |
| 	"sync"
 | |
| 	"sync/atomic"
 | |
| 	"time"
 | |
| 	"flag"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	token    string
 | |
| 	url      string
 | |
| 	config   Config
 | |
| 	request  int64
 | |
| 	period   int64
 | |
| 	errorNum int64
 | |
| 	template string
 | |
| )
 | |
| 
 | |
| type Config struct {
 | |
| 	HostIp       string `json:"hostIp"`
 | |
| 	MachineNum   int    `json:"machineNum"`
 | |
| 	LoopNum      int    `json:"loopNum"`
 | |
| 	DbName       string `json:"dbName"`
 | |
| 	DataBegin    int64  `json:"dataBegin"`
 | |
| }
 | |
| 
 | |
| type TokenResult struct {
 | |
| 	Status string `json:"status"`
 | |
| 	Code   int    `json:"code"`
 | |
| 	Desc   string `json:"desc"`
 | |
| }
 | |
| 
 | |
| type JsonResult struct {
 | |
| 	Status string `json:"status"`
 | |
| 	Code   int    `json:"code"`
 | |
| }
 | |
| 
 | |
| func readConf(filename string) {
 | |
| 	file, err := os.Open(filename)
 | |
| 	if err != nil {
 | |
| 		println("%s not found", filename)
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	defer file.Close()
 | |
| 
 | |
| 	dec := json.NewDecoder(file)
 | |
| 	err = dec.Decode(&config)
 | |
| 	if err != nil {
 | |
| 		println("%s parse error", filename)
 | |
| 		panic(err)
 | |
| 	}
 | |
| 
 | |
| 	request = 0
 | |
| 	period = 0
 | |
| 	errorNum = 0
 | |
| 
 | |
| 	fmt.Println("================config parameters======================")
 | |
| 	fmt.Println("HostIp:", config.HostIp)
 | |
| 	fmt.Println("MachineNum:", config.MachineNum)
 | |
| 	fmt.Println("LoopNum:", config.LoopNum)
 | |
| 	fmt.Println("dbName:", config.DbName)
 | |
| 	fmt.Println("dataBegin:", config.DataBegin)
 | |
| 	
 | |
| 	fmt.Println("================http token=============================")
 | |
| 	token, err = getToken()
 | |
| 	url = fmt.Sprintf("http://%s:%d/telegraf/%s", config.HostIp, 6020, config.DbName)
 | |
| 
 | |
| 	fmt.Println("httpToken:", token)
 | |
| 	fmt.Println("httpUrl:", url)
 | |
| 
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func readReq(filename string) {
 | |
| 	file, err := os.Open(filename)
 | |
| 	if err != nil {
 | |
| 		println("%s not found", filename)
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	defer file.Close()
 | |
| 
 | |
| 	data, _ := ioutil.ReadAll(file)
 | |
| 	
 | |
| 	template = string(data[:])
 | |
|  
 | |
| 	//fmt.Println(template)
 | |
| }
 | |
| 
 | |
| func getToken() (string, error) {
 | |
| 	resp, err := http.Get(fmt.Sprintf("http://%s:%d/rest/login/%s/%s", config.HostIp, 6020, "root", "taosdata"))
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	defer resp.Body.Close()
 | |
| 
 | |
| 	var tokenResult TokenResult
 | |
| 
 | |
| 	data, err := ioutil.ReadAll(resp.Body)
 | |
| 
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	err = json.Unmarshal(data, &tokenResult)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	if tokenResult.Status != "succ" {
 | |
| 		fmt.Println("get http token failed")
 | |
| 		fmt.Println(tokenResult)
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	return tokenResult.Desc, nil
 | |
| }
 | |
| 
 | |
| func exec(client *http.Client, sql string) {
 | |
| 	for times := 0; times < 10; times++ {
 | |
| 
 | |
| 		req, err1 := http.NewRequest("POST", url, bytes.NewReader([]byte(sql)))
 | |
| 		if err1 != nil {
 | |
| 			continue
 | |
| 		}
 | |
| 		req.Header.Add("Authorization", "Taosd "+token)
 | |
| 
 | |
| 		begin := time.Now()
 | |
| 		resp, err := client.Do(req)
 | |
| 
 | |
| 		if err != nil {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		data, err := ioutil.ReadAll(resp.Body)
 | |
| 		if err != nil {
 | |
| 			fmt.Println(data)
 | |
| 			resp.Body.Close()
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		spend := (time.Since(begin).Nanoseconds())
 | |
| 
 | |
| 		var jsonResult JsonResult
 | |
| 		err = json.Unmarshal(data, &jsonResult)
 | |
| 		if err != nil {
 | |
| 			fmt.Println("parse json error: ", string(data[:]))	
 | |
| 			resp.Body.Close()
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		
 | |
| 		atomic.AddInt64(&request, 1)		
 | |
| 		atomic.AddInt64(&period, spend)
 | |
| 
 | |
| 		if request%1000 == 0 && request != 0 {
 | |
| 			requestAvg := float64(period) / float64(1000000) / float64(request)
 | |
| 			qps := float64(1000) / float64(requestAvg) * float64(config.MachineNum)
 | |
| 			dps := qps * float64(22)
 | |
| 			fmt.Println("====== req:", request, ", error:", errorNum, ", qps:", int64(qps), ", wait:", int64(requestAvg), "ms", ", data per second:", int64(dps))
 | |
| 		}
 | |
| 		return
 | |
| 	}
 | |
| 	//fmt.Println("xxxx>sql:", sql, ", retryTimes:", 10)
 | |
| 	fmt.Println("exec sql failed")
 | |
| 	errorNum++
 | |
| }
 | |
| 
 | |
| func writeData(wg *sync.WaitGroup, tbIndex int) {
 | |
| 	defer wg.Done()
 | |
| 	client := &http.Client{}
 | |
| 	
 | |
| 	tbName := fmt.Sprintf("t%d", tbIndex)
 | |
| 	
 | |
| 	for j := 0; j < config.LoopNum; j++ {
 | |
| 		tmVal := fmt.Sprintf("%d", int64(j)*int64(10000) + config.DataBegin)
 | |
| 		//fmt.Println(tmVal)
 | |
| 
 | |
| 		req1 := strings.Replace(template, "panshi-gsl", tbName, -1)
 | |
| 		req2 := strings.Replace(req1, "1536750390000", tmVal, -1)
 | |
| 		
 | |
| 		//fmt.Println(req2)
 | |
| 		exec(client, req2)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	filename := flag.String("config", "telegraf.json", "config file name")
 | |
| 	
 | |
| 	flag.Parse()
 | |
| 	
 | |
| 	readReq("telegraf.req")
 | |
| 	
 | |
| 	readConf(*filename)
 | |
| 	
 | |
| 	fmt.Println("\n================telegraf test start======================")
 | |
| 
 | |
| 	var wg sync.WaitGroup
 | |
| 	
 | |
| 	for i := 0; i < config.MachineNum; i++ {
 | |
| 		wg.Add(1)
 | |
| 		go writeData(&wg, i)
 | |
| 	}
 | |
| 
 | |
| 	wg.Wait()
 | |
| 
 | |
| 	fmt.Println("\n================telegraf test stop ======================")
 | |
| 
 | |
| 	requestAvg := float64(period) / float64(1000000) / float64(request)
 | |
| 	qps := float64(1000) / float64(requestAvg) * float64(config.MachineNum)
 | |
| 	dps := qps * float64(22)
 | |
| 	fmt.Println("====== req:", request, ", error:", errorNum, ", qps:", int64(qps), ", wait:", int64(requestAvg), "ms", ", data per second:", int64(dps))
 | |
| }
 |