github.com/netdata/go.d.plugin@v0.58.1/modules/nginxvts/collect.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package nginxvts 4 5 import ( 6 "encoding/json" 7 "fmt" 8 "io" 9 "net/http" 10 11 "github.com/netdata/go.d.plugin/pkg/stm" 12 "github.com/netdata/go.d.plugin/pkg/web" 13 ) 14 15 func (vts *NginxVTS) collect() (map[string]int64, error) { 16 ms, err := vts.scapeVTS() 17 if err != nil { 18 return nil, nil 19 } 20 21 collected := make(map[string]interface{}) 22 vts.collectMain(collected, ms) 23 vts.collectSharedZones(collected, ms) 24 vts.collectServerZones(collected, ms) 25 26 return stm.ToMap(collected), nil 27 } 28 29 func (vts *NginxVTS) collectMain(collected map[string]interface{}, ms *vtsMetrics) { 30 collected["uptime"] = (ms.NowMsec - ms.LoadMsec) / 1000 31 collected["connections"] = ms.Connections 32 } 33 34 func (vts *NginxVTS) collectSharedZones(collected map[string]interface{}, ms *vtsMetrics) { 35 collected["sharedzones"] = ms.SharedZones 36 } 37 38 func (vts *NginxVTS) collectServerZones(collected map[string]interface{}, ms *vtsMetrics) { 39 if !ms.hasServerZones() { 40 return 41 } 42 43 // "*" means all servers 44 collected["total"] = ms.ServerZones["*"] 45 } 46 47 func (vts *NginxVTS) scapeVTS() (*vtsMetrics, error) { 48 req, _ := web.NewHTTPRequest(vts.Request) 49 50 var total vtsMetrics 51 52 if err := vts.doOKDecode(req, &total); err != nil { 53 vts.Warning(err) 54 return nil, err 55 } 56 return &total, nil 57 } 58 59 func (vts *NginxVTS) doOKDecode(req *http.Request, in interface{}) error { 60 resp, err := vts.httpClient.Do(req) 61 if err != nil { 62 return fmt.Errorf("error on HTTP request '%s': %v", req.URL, err) 63 } 64 defer closeBody(resp) 65 66 if resp.StatusCode != http.StatusOK { 67 return fmt.Errorf("'%s' returned HTTP status code: %d", req.URL, resp.StatusCode) 68 } 69 70 if err := json.NewDecoder(resp.Body).Decode(in); err != nil { 71 return fmt.Errorf("error on decoding response from '%s': %v", req.URL, err) 72 } 73 return nil 74 } 75 76 func closeBody(resp *http.Response) { 77 if resp != nil && resp.Body != nil { 78 _, _ = io.Copy(io.Discard, resp.Body) 79 _ = resp.Body.Close() 80 } 81 }