github.com/netdata/go.d.plugin@v0.58.1/modules/k8s_state/cluster_meta.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package k8s_state
     4  
     5  import (
     6  	"fmt"
     7  	"io"
     8  	"net/http"
     9  	"time"
    10  
    11  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  )
    13  
    14  func (ks *KubeState) getKubeClusterID() string {
    15  	ns, err := ks.client.CoreV1().Namespaces().Get(ks.ctx, "kube-system", metav1.GetOptions{})
    16  	if err != nil {
    17  		ks.Warningf("error on getting 'kube-system' namespace UID: %v", err)
    18  		return ""
    19  	}
    20  	return string(ns.UID)
    21  }
    22  
    23  func (ks *KubeState) getKubeClusterName() string {
    24  	client := http.Client{Timeout: time.Second}
    25  	n, err := getGKEKubeClusterName(client)
    26  	if err != nil {
    27  		ks.Debugf("error on getting GKE cluster name: %v", err)
    28  	}
    29  	return n
    30  }
    31  
    32  func getGKEKubeClusterName(client http.Client) (string, error) {
    33  	id, err := doMetaGKEHTTPReq(client, "http://metadata/computeMetadata/v1/project/project-id")
    34  	if err != nil {
    35  		return "", err
    36  	}
    37  	loc, err := doMetaGKEHTTPReq(client, "http://metadata/computeMetadata/v1/instance/attributes/cluster-location")
    38  	if err != nil {
    39  		return "", err
    40  	}
    41  	name, err := doMetaGKEHTTPReq(client, "http://metadata/computeMetadata/v1/instance/attributes/cluster-name")
    42  	if err != nil {
    43  		return "", err
    44  	}
    45  
    46  	return fmt.Sprintf("gke_%s_%s_%s", id, loc, name), nil
    47  }
    48  
    49  func doMetaGKEHTTPReq(client http.Client, url string) (string, error) {
    50  	req, err := http.NewRequest(http.MethodGet, url, nil)
    51  	if err != nil {
    52  		return "", err
    53  	}
    54  
    55  	req.Header.Add("Metadata-Flavor", "Google")
    56  	resp, err := client.Do(req)
    57  	if err != nil {
    58  		return "", err
    59  	}
    60  	defer closeHTTPRespBody(resp)
    61  
    62  	if resp.StatusCode != http.StatusOK {
    63  		return "", fmt.Errorf("'%s' returned HTTP status code %d", url, resp.StatusCode)
    64  	}
    65  
    66  	bs, err := io.ReadAll(resp.Body)
    67  	if err != nil {
    68  		return "", err
    69  	}
    70  
    71  	s := string(bs)
    72  	if s == "" {
    73  		return "", fmt.Errorf("an empty response from '%s'", url)
    74  	}
    75  
    76  	return s, nil
    77  }
    78  
    79  func closeHTTPRespBody(resp *http.Response) {
    80  	if resp != nil && resp.Body != nil {
    81  		_, _ = io.Copy(io.Discard, resp.Body)
    82  		_ = resp.Body.Close()
    83  	}
    84  }