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 }