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 }