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  }