github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/boom/application/applications/metricspersisting/helm.go (about)

     1  package metricspersisting
     2  
     3  import (
     4  	"errors"
     5  	"strconv"
     6  
     7  	"github.com/caos/orbos/internal/utils/helper"
     8  
     9  	k8serrors "k8s.io/apimachinery/pkg/api/errors"
    10  
    11  	"github.com/caos/orbos/internal/operator/boom/api/latest"
    12  	"github.com/caos/orbos/internal/operator/boom/application/applications/metricspersisting/config"
    13  	"github.com/caos/orbos/internal/operator/boom/application/applications/metricspersisting/helm"
    14  	"github.com/caos/orbos/internal/operator/boom/application/applications/metricspersisting/info"
    15  	"github.com/caos/orbos/internal/operator/boom/application/applications/metricspersisting/servicemonitor"
    16  	"github.com/caos/orbos/internal/operator/boom/labels"
    17  	"github.com/caos/orbos/internal/operator/boom/templator/helm/chart"
    18  	"github.com/caos/orbos/internal/utils/clientgo"
    19  	"github.com/caos/orbos/internal/utils/kubectl"
    20  	"github.com/caos/orbos/mntr"
    21  )
    22  
    23  func (p *Prometheus) SpecToHelmValues(monitor mntr.Monitor, toolsetCRDSpec *latest.ToolsetSpec) interface{} {
    24  	version, err := kubectl.NewVersion().GetKubeVersion(monitor)
    25  	if err != nil {
    26  		monitor.Error(err)
    27  		return nil
    28  	}
    29  
    30  	_, getSecretErr := clientgo.GetSecret("grafana-cloud", info.GetNamespace())
    31  	telemetrySecretAbsent := k8serrors.IsNotFound(errors.Unwrap(getSecretErr))
    32  	if getSecretErr != nil && !telemetrySecretAbsent {
    33  		monitor.Info("Not sending telemetry data to MISSION as secret grafana-cloud is missing in namespace caos-system")
    34  	}
    35  
    36  	configResult := config.ScrapeMetricsCrdsConfig(info.GetInstanceName(), info.GetNamespace(), toolsetCRDSpec)
    37  	if configResult == nil {
    38  		return nil
    39  	}
    40  
    41  	imageTags := p.GetImageTags()
    42  	image := "quay.io/prometheus/prometheus"
    43  
    44  	if toolsetCRDSpec != nil && toolsetCRDSpec.MetricsPersisting != nil {
    45  		helper.OverwriteExistingValues(imageTags, map[string]string{
    46  			image: toolsetCRDSpec.MetricsPersisting.OverwriteVersion,
    47  		})
    48  		helper.OverwriteExistingKey(imageTags, &image, toolsetCRDSpec.MetricsPersisting.OverwriteImage)
    49  	}
    50  
    51  	values := helm.DefaultValues(imageTags, image)
    52  	if configResult.StorageSpec != nil {
    53  		storageSpec := &helm.StorageSpec{
    54  			VolumeClaimTemplate: &helm.VolumeClaimTemplate{
    55  				Spec: &helm.VolumeClaimTemplateSpec{
    56  					StorageClassName: configResult.StorageSpec.StorageClass,
    57  					AccessModes:      configResult.StorageSpec.AccessModes,
    58  					Resources: &helm.Resources{
    59  						Requests: &helm.Request{
    60  							Storage: configResult.StorageSpec.Storage,
    61  						},
    62  					},
    63  				},
    64  			},
    65  		}
    66  
    67  		values.Prometheus.PrometheusSpec.StorageSpec = storageSpec
    68  	}
    69  
    70  	if configResult.ServiceMonitors != nil {
    71  		additionalServiceMonitors := make([]*servicemonitor.Values, 0)
    72  		for _, specServiceMonitor := range configResult.ServiceMonitors {
    73  			valuesServiceMonitor := servicemonitor.SpecToValues(specServiceMonitor)
    74  			additionalServiceMonitors = append(additionalServiceMonitors, valuesServiceMonitor)
    75  		}
    76  
    77  		values.Prometheus.AdditionalServiceMonitors = additionalServiceMonitors
    78  	}
    79  
    80  	if configResult.AdditionalScrapeConfigs != nil {
    81  		values.Prometheus.PrometheusSpec.AdditionalScrapeConfigs = configResult.AdditionalScrapeConfigs
    82  	}
    83  
    84  	spec := toolsetCRDSpec.MetricsPersisting
    85  	if spec == nil {
    86  		return values
    87  	}
    88  
    89  	values.Prometheus.PrometheusSpec.ExternalLabels = make(map[string]string)
    90  	if spec.ExternalLabels != nil {
    91  		for k, v := range spec.ExternalLabels {
    92  			if k == "orb" {
    93  				monitor.Info("Label-key \"orb\" is already used internally and will be ignored")
    94  			} else {
    95  				values.Prometheus.PrometheusSpec.ExternalLabels[k] = v
    96  			}
    97  		}
    98  	}
    99  
   100  	if getSecretErr == nil && !telemetrySecretAbsent {
   101  		values.Prometheus.PrometheusSpec.ExternalLabels["orb"] = p.orb
   102  		values.Prometheus.PrometheusSpec.RemoteWrite = append(values.Prometheus.PrometheusSpec.RemoteWrite, &helm.RemoteWrite{
   103  			URL: "https://prometheus-us-central1.grafana.net/api/prom/push",
   104  			BasicAuth: &helm.BasicAuth{
   105  				Username: &helm.SecretKeySelector{
   106  					Name: "grafana-cloud",
   107  					Key:  "username",
   108  				},
   109  				Password: &helm.SecretKeySelector{
   110  					Name: "grafana-cloud",
   111  					Key:  "password",
   112  				},
   113  			},
   114  			WriteRelabelConfigs: []*helm.ValuesRelabelConfig{{
   115  				Action: "keep",
   116  				SourceLabels: []string{
   117  					"__name__",
   118  					"job",
   119  				},
   120  				Regex: "caos_.+;.*|up;caos_remote_.+",
   121  			}},
   122  		})
   123  	}
   124  
   125  	if spec.RemoteWrite != nil {
   126  		writeRelabelConfigs := make([]*helm.ValuesRelabelConfig, 0)
   127  		if spec.RemoteWrite.RelabelConfigs != nil && len(spec.RemoteWrite.RelabelConfigs) > 0 {
   128  			for _, relabelConfig := range spec.RemoteWrite.RelabelConfigs {
   129  				mod := 0
   130  				if relabelConfig.Modulus != "" {
   131  					internalMod, err := strconv.Atoi(relabelConfig.Modulus)
   132  					if err != nil {
   133  						return err
   134  					}
   135  					mod = internalMod
   136  				}
   137  
   138  				writeRelabelConfigs = append(writeRelabelConfigs, &helm.ValuesRelabelConfig{
   139  					Action:       relabelConfig.Action,
   140  					SourceLabels: relabelConfig.SourceLabels,
   141  					Separator:    relabelConfig.Separator,
   142  					TargetLabel:  relabelConfig.TargetLabel,
   143  					Regex:        relabelConfig.Regex,
   144  					Modulus:      uint64(mod),
   145  					Replacement:  relabelConfig.Replacement,
   146  				})
   147  			}
   148  		}
   149  
   150  		values.Prometheus.PrometheusSpec.RemoteWrite = append(values.Prometheus.PrometheusSpec.RemoteWrite, &helm.RemoteWrite{
   151  			URL: spec.RemoteWrite.URL,
   152  			BasicAuth: &helm.BasicAuth{
   153  				Username: &helm.SecretKeySelector{
   154  					Name: spec.RemoteWrite.BasicAuth.Username.Name,
   155  					Key:  spec.RemoteWrite.BasicAuth.Username.Key,
   156  				},
   157  				Password: &helm.SecretKeySelector{
   158  					Name: spec.RemoteWrite.BasicAuth.Password.Name,
   159  					Key:  spec.RemoteWrite.BasicAuth.Password.Key,
   160  				},
   161  			},
   162  			WriteRelabelConfigs: writeRelabelConfigs,
   163  		})
   164  	}
   165  
   166  	if spec.Tolerations != nil {
   167  		for _, tol := range spec.Tolerations {
   168  			values.Prometheus.PrometheusSpec.Tolerations = append(values.Prometheus.PrometheusSpec.Tolerations, tol)
   169  		}
   170  	}
   171  
   172  	promSelectorLabels := labels.GetPromSelector(info.GetInstanceName())
   173  	promSelector := &helm.Selector{MatchLabels: promSelectorLabels}
   174  	resourceLabels := labels.GetRuleLabels(info.GetInstanceName(), info.GetName())
   175  
   176  	values.Prometheus.PrometheusSpec.RuleSelector = promSelector
   177  	values.Prometheus.PrometheusSpec.PodMonitorSelector = promSelector
   178  	values.Prometheus.PrometheusSpec.ServiceMonitorSelector = promSelector
   179  
   180  	rules, err := helm.GetDefaultRules(resourceLabels)
   181  	if err != nil {
   182  		panic(err)
   183  	}
   184  	values.DefaultRules.Labels = resourceLabels
   185  	values.KubeTargetVersionOverride = version
   186  	values.AdditionalPrometheusRules = []*helm.AdditionalPrometheusRules{rules}
   187  
   188  	values.FullnameOverride = info.GetInstanceName()
   189  
   190  	if spec.NodeSelector != nil {
   191  		for k, v := range spec.NodeSelector {
   192  			values.Prometheus.PrometheusSpec.NodeSelector[k] = v
   193  		}
   194  	}
   195  
   196  	if spec.Resources != nil {
   197  		values.Prometheus.PrometheusSpec.Resources = spec.Resources
   198  	}
   199  
   200  	return values
   201  }
   202  
   203  func (p *Prometheus) GetChartInfo() *chart.Chart {
   204  	return helm.GetChartInfo()
   205  }
   206  
   207  func (p *Prometheus) GetImageTags() map[string]string {
   208  	return helm.GetImageTags()
   209  }