master
go 78 lines 1.75 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package k8s_state
4
5 import (
6 "errors"
7 "fmt"
8 "io"
9 "net/http"
10 "time"
11
12 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
14 "github.com/netdata/netdata/go/plugins/pkg/web"
15 )
16
17 func (c *Collector) getKubeClusterID() string {
18 ns, err := c.client.CoreV1().Namespaces().Get(c.ctx, "kube-system", metav1.GetOptions{})
19 if err != nil {
20 c.Warningf("error on getting 'kube-system' namespace UID: %v", err)
21 return ""
22 }
23 return string(ns.UID)
24 }
25
26 func (c *Collector) getKubeClusterName() string {
27 client := &http.Client{Timeout: time.Second}
28 n, err := getGKEKubeClusterName(client)
29 if err != nil {
30 c.Debugf("error on getting GKE cluster name: %v", err)
31 }
32 return n
33 }
34
35 func getGKEKubeClusterName(client *http.Client) (string, error) {
36 id, err := doMetaGKEHTTPReq(client, "http://metadata/computeMetadata/v1/project/project-id")
37 if err != nil {
38 return "", err
39 }
40 loc, err := doMetaGKEHTTPReq(client, "http://metadata/computeMetadata/v1/instance/attributes/cluster-location")
41 if err != nil {
42 return "", err
43 }
44 name, err := doMetaGKEHTTPReq(client, "http://metadata/computeMetadata/v1/instance/attributes/cluster-name")
45 if err != nil {
46 return "", err
47 }
48
49 return fmt.Sprintf("gke_%s_%s_%s", id, loc, name), nil
50 }
51
52 func doMetaGKEHTTPReq(client *http.Client, url string) (string, error) {
53 req, err := http.NewRequest(http.MethodGet, url, nil)
54 if err != nil {
55 return "", err
56 }
57
58 req.Header.Add("Metadata-Flavor", "Google")
59
60 var resp string
61
62 if err := web.DoHTTP(client).Request(req, func(body io.Reader) error {
63 bs, rerr := io.ReadAll(body)
64 if rerr != nil {
65 return rerr
66 }
67
68 if resp = string(bs); len(resp) == 0 {
69 return errors.New("empty response")
70 }
71
72 return nil
73 }); err != nil {
74 return "", err
75 }
76
77 return resp, nil
78 }