package models import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" ) //输出的json结构begin type Hits struct { Total int `json:"total"` } type RawResponse struct { Hits Hits `json:"hits"` } type Result struct { RawResponse RawResponse `json:"rawResponse"` Loaded int `json:"loaded"` } type ResultInfo struct { Id int `json:"id"` Result Result `json:"result"` } //输出的json结构end // //输入的json结构end type InputInfo struct { Batch []Batch `json:"batch"` } type Fields struct { Field string `json:"field"` Format string `json:"format"` } type MatchPhrase struct { Message string `json:"message"` } type Should struct { MatchPhrase MatchPhrase `json:"match_phrase"` } type Bool struct { Should []Should `json:"should"` MinimumShouldMatch int `json:"minimum_should_match"` } type Timestamptest struct { // Gte time.Time `json:"gte"` Gte string `json:"gte"` Lte string `json:"lte"` Format string `json:"format"` } type Range struct { Timestamptest Timestamptest `json:"@timestamptest"` } type FilterMatchPhrase struct { UserName string `json:"userName.keyword,omitempty"` ProjectName string `json:"projectName.keyword,omitempty"` } type Filter struct { Bool *Bool `json:"bool,omitempty"` Range *Range `json:"range,omitempty"` FilterMatchPhrase *FilterMatchPhrase `json:"match_phrase,omitempty"` } type MatchPhraseIn struct { ProjectName string `json:"projectName"` } type MustNot struct { MatchPhraseIn MatchPhraseIn `json:"match_phrase"` } type BoolIn struct { Filter []Filter `json:"filter"` MustNot []MustNot `json:"must_not"` } type Query struct { BoolIn BoolIn `json:"bool"` } type Body struct { Size int `json:"size"` Fields []Fields `json:"fields"` Query Query `json:"query"` } type Params struct { Index string `json:"index"` Body Body `json:"body"` } type Request struct { Params Params `json:"params"` } type Batch struct { Request Request `json:"request"` } func SendData(jsonStr []byte) (content string) { url := "http://192.168.207.35:5601/internal/bsearch" req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr)) req.Header.Set("Content-Type", "application/json") req.Header.Set("kbn-version", "7.13.2") req.Header.Set("Authorization", "Basic cWl6aGk6UGNsMjAyMA==") client := &http.Client{} resp, err := client.Do(req) if err != nil { panic(err) } defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) return string(body) } func getdata(resultinfo ResultInfo, jobResult string) (value1 int, value2 int) { var resultTest ResultInfo errs := json.Unmarshal([]byte(jobResult), &resultTest) fmt.Println(errs) return resultTest.Result.Loaded, resultTest.Result.RawResponse.Hits.Total } func inputStructInit(User string, Project string, Gte string, Lte string) (inputStructInit InputInfo) { var inputStruct InputInfo inputStruct.Batch = make([]Batch, 1) inputStruct.Batch[0].Request.Params.Index = "filebeat-7.3.2*" inputStruct.Batch[0].Request.Params.Body.Size = 0 inputStruct.Batch[0].Request.Params.Body.Fields = make([]Fields, 1) inputStruct.Batch[0].Request.Params.Body.Fields[0].Field = "@timestamptest" inputStruct.Batch[0].Request.Params.Body.Fields[0].Format = "date_time" inputStruct.Batch[0].Request.Params.Body.Query.BoolIn.Filter = make([]Filter, 3) var timeRange Range timeRange.Timestamptest.Gte = Gte timeRange.Timestamptest.Lte = Lte timeRange.Timestamptest.Format = "strict_date_optional_time" inputStruct.Batch[0].Request.Params.Body.Query.BoolIn.Filter[0].Range = &timeRange var userName FilterMatchPhrase userName.UserName = User inputStruct.Batch[0].Request.Params.Body.Query.BoolIn.Filter[1].FilterMatchPhrase = &userName var projectName FilterMatchPhrase projectName.ProjectName = Project inputStruct.Batch[0].Request.Params.Body.Query.BoolIn.Filter[2].FilterMatchPhrase = &projectName return inputStruct } // @title ProjectViewData // @description 获取指定用户和项目的访问量 // @param User string "用户名" // @param Project string "项目名" // @param Gte string "起始时间" 如 time.Now().AddDate(0, 0, -1).Format(time.RFC3339) // @param Lte string "结束时间" 如 time.Now().Format(time.RFC3339) // @return value int "访问量" func ProjectViewData(User string, Project string, Gte string, Lte string) (value int) { InitInfo := inputStructInit(User, Project, Gte, Lte) jsons, errs := json.Marshal(InitInfo) if errs != nil { fmt.Println("errs:", errs.Error()) } var jsonStr = []byte(jsons) var resultTest ResultInfo loaded, total := getdata(resultTest, SendData(jsonStr)) time := 0 for { if loaded == 0 { value1, total := getdata(resultTest, SendData(jsonStr)) time++ if value1 != 0 && time < 100 { fmt.Println("total:", total) return total } if time > 100 { break } } else { break } } fmt.Println("loaded:", loaded) return total }