0
Fork 0
mirror of https://github.com/project-zot/zot.git synced 2024-12-23 22:27:35 -05:00
zot/pkg/extensions/monitoring/minimal_client.go
Alex Stan d325c8b5f4 Fix problems signaled by new linter version v1.45.2
PR (linter: upgrade linter version #405) triggered lint job which failed
with many errors generated by various linters. Configurations were added to
golangcilint.yaml and several refactorings were made in order to improve the
results of the linter.

maintidx linter disabled

Signed-off-by: Alex Stan <alexandrustan96@yahoo.ro>
2022-04-27 09:55:44 -07:00

88 lines
2.2 KiB
Go

//go:build minimal
// +build minimal
package monitoring
import (
"context"
"crypto/tls"
"encoding/json"
"fmt"
"net/http"
"time"
"zotregistry.io/zot/pkg/log"
)
const (
httpTimeout = 1 * time.Minute
)
// MetricsConfig is used to configure the creation of a Node Exporter http client
// that will connect to a particular zot instance.
type MetricsConfig struct {
// Address of the zot http server
Address string
// Transport to use for the http client.
Transport *http.Transport
// HTTPClient is the client to use.
HTTPClient *http.Client
}
type MetricsClient struct {
headers http.Header
config MetricsConfig
log log.Logger
}
func newHTTPMetricsClient() *http.Client {
defaultTransport := http.DefaultTransport.(*http.Transport).Clone() //nolint: forcetypeassert
defaultTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} //nolint: gosec
return &http.Client{
Timeout: httpTimeout,
Transport: defaultTransport,
}
}
// Creates a MetricsClient that can be used to retrieve in memory metrics
// The new MetricsClient retrieved must be cached and reused by the Node Exporter
// in order to prevent concurrent memory leaks.
func NewMetricsClient(config *MetricsConfig, logger log.Logger) *MetricsClient {
if config.HTTPClient == nil {
config.HTTPClient = newHTTPMetricsClient()
}
return &MetricsClient{config: *config, headers: make(http.Header), log: logger}
}
func (mc *MetricsClient) GetMetrics() (*MetricsInfo, error) {
metrics := &MetricsInfo{}
if _, err := mc.makeGETRequest(mc.config.Address+"/v2/metrics", metrics); err != nil {
return nil, err
}
return metrics, nil
}
func (mc *MetricsClient) makeGETRequest(url string, resultsPtr interface{}) (http.Header, error) {
req, err := http.NewRequestWithContext(context.Background(), "GET", url, nil)
if err != nil {
return nil, fmt.Errorf("metric scraping: %w", err)
}
resp, err := mc.config.HTTPClient.Do(req)
if err != nil {
return nil, fmt.Errorf("metric scraping error: %w", err)
}
defer resp.Body.Close()
if err := json.NewDecoder(resp.Body).Decode(resultsPtr); err != nil {
return nil, fmt.Errorf("metric scraping failed: %w", err)
}
return resp.Header, nil
}