| @@ -0,0 +1,180 @@ | |||||
| 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 | |||||
| } | |||||