From 95a493d9c4277a051f2c06222a4e3206cd1ebf95 Mon Sep 17 00:00:00 2001 From: mphanias Date: Tue, 2 Apr 2024 14:47:31 +0530 Subject: [PATCH] OM-184 - support pod-name/ server-ip added support to use server-ip or pod-name/host-name according to the environment mode running in kubernetes return host-name/pod-name as service label-value in vm / docker return ipaddress as service label-value --- internal/pkg/config/config.go | 26 ++++++++++++++++++++ internal/pkg/executors/otel_metrics.go | 8 +++++- internal/pkg/executors/prometheus.go | 8 +++++- internal/pkg/statprocessors/sp_latency.go | 2 +- internal/pkg/statprocessors/sp_namespaces.go | 6 ++--- internal/pkg/statprocessors/sp_node_stats.go | 4 +-- internal/pkg/statprocessors/sp_sets.go | 4 +-- internal/pkg/statprocessors/sp_sindex.go | 4 +-- internal/pkg/statprocessors/sp_users.go | 2 +- internal/pkg/statprocessors/sp_xdr.go | 4 +-- internal/pkg/statprocessors/statsrefresh.go | 4 +++ 11 files changed, 57 insertions(+), 15 deletions(-) diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 05afd0bf..b51a84bf 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -46,6 +46,9 @@ type Config struct { OtelPushInterval uint8 `toml:"push_interval"` OtelServerStatFetchInterval uint8 `toml:"server_stat_fetch_interval"` } `toml:"OpenTelemetry"` + + IsKubernetes bool + HostName string } `toml:"Agent"` Aerospike struct { @@ -200,6 +203,27 @@ func (c *Config) FetchCloudInfo(md toml.MetaData) { } } +func (c *Config) FetchKubernetesInfo(md toml.MetaData) { + // envKubeConfig := os.Getenv("KUBECONFIG") + envKubeServiceHost := os.Getenv("KUBERNETES_SERVICE_HOST") + envKubeServicePort := os.Getenv("KUBERNETES_SERVICE_PORT") + + log.Info("Checking is Running in Kubernetes environment ? - Kubernetes Host: ", envKubeServiceHost, " and Kubernetes Port: ", envKubeServicePort) + Cfg.Agent.IsKubernetes = false + if envKubeServiceHost != "" && len(strings.TrimSpace(envKubeServiceHost)) > 0 { + Cfg.Agent.IsKubernetes = true + + // get host-name + var err error + Cfg.Agent.HostName, err = os.Hostname() + if err != nil { + log.Errorln(err) + return + } + + } +} + // Initialize exporter configuration func InitConfig(configFile string) { // to print everything out regarding reading the config in app init @@ -225,6 +249,8 @@ func InitConfig(configFile string) { Cfg.ValidateAndUpdate(md) Cfg.FetchCloudInfo(md) + + Cfg.FetchKubernetesInfo(md) } // Set log file path diff --git a/internal/pkg/executors/otel_metrics.go b/internal/pkg/executors/otel_metrics.go index 691e05fc..3c1f7fab 100644 --- a/internal/pkg/executors/otel_metrics.go +++ b/internal/pkg/executors/otel_metrics.go @@ -18,9 +18,15 @@ func sendNodeUp(meter metric.Meter, ctx context.Context, commonLabels []attribut metric.WithDescription("Aerospike node active status"), ) + service := statprocessors.Service + if config.Cfg.Agent.IsKubernetes { + statprocessors.Service = config.Cfg.Agent.HostName + service = config.Cfg.Agent.HostName + } + labels := []attribute.KeyValue{ attribute.String("cluster_name", statprocessors.ClusterName), - attribute.String("service", statprocessors.Service), + attribute.String("service", service), attribute.String("build", statprocessors.Build), } diff --git a/internal/pkg/executors/prometheus.go b/internal/pkg/executors/prometheus.go index 055f0040..cc176d97 100644 --- a/internal/pkg/executors/prometheus.go +++ b/internal/pkg/executors/prometheus.go @@ -63,7 +63,13 @@ func (o *PrometheusImpl) Collect(ch chan<- prometheus.Metric) { return } - ch <- prometheus.MustNewConstMetric(nodeActiveDesc, prometheus.GaugeValue, 1.0, statprocessors.ClusterName, statprocessors.Service, statprocessors.Build) + // if kubernetes then send host-name/pod-name else send server-ip as-isnh + service := statprocessors.Service + if config.Cfg.Agent.IsKubernetes { + service = config.Cfg.Agent.HostName + statprocessors.Service = config.Cfg.Agent.HostName + } + ch <- prometheus.MustNewConstMetric(nodeActiveDesc, prometheus.GaugeValue, 1.0, statprocessors.ClusterName, service, statprocessors.Build) for _, wm := range refreshed_metrics { PushToPrometheus(wm, ch) diff --git a/internal/pkg/statprocessors/sp_latency.go b/internal/pkg/statprocessors/sp_latency.go index 614a7e09..d38dd0a2 100644 --- a/internal/pkg/statprocessors/sp_latency.go +++ b/internal/pkg/statprocessors/sp_latency.go @@ -4,7 +4,7 @@ import ( "strings" commons "github.com/aerospike/aerospike-prometheus-exporter/internal/pkg/commons" - "github.com/aerospike/aerospike-prometheus-exporter/internal/pkg/config" + config "github.com/aerospike/aerospike-prometheus-exporter/internal/pkg/config" log "github.com/sirupsen/logrus" ) diff --git a/internal/pkg/statprocessors/sp_namespaces.go b/internal/pkg/statprocessors/sp_namespaces.go index de364b65..93998bc3 100644 --- a/internal/pkg/statprocessors/sp_namespaces.go +++ b/internal/pkg/statprocessors/sp_namespaces.go @@ -123,7 +123,7 @@ func (nw *NamespaceStatsProcessor) refreshIndexPressure(singleInfoKey string, in nsName := values[0] labels := []string{commons.METRIC_LABEL_CLUSTER_NAME, commons.METRIC_LABEL_SERVICE, commons.METRIC_LABEL_NS} - labelValues := []string{rawMetrics[Infokey_ClusterName], rawMetrics[Infokey_Service], nsName} + labelValues := []string{ClusterName, Service, nsName} // Server index-pressure output: test:0:0;bar_device:0:0;materials:0:0 // ignore first element - namespace @@ -182,7 +182,7 @@ func (nw *NamespaceStatsProcessor) refreshNamespaceStats(singleInfoKey string, i // default: aerospike_namespace_ constructedStatname = stat labels = []string{commons.METRIC_LABEL_CLUSTER_NAME, commons.METRIC_LABEL_SERVICE, commons.METRIC_LABEL_NS} - labelValues = []string{rawMetrics[Infokey_ClusterName], rawMetrics[Infokey_Service], nsName} + labelValues = []string{ClusterName, Service, nsName} if isArrayType { constructedStatname, labels, labelValues = nw.handleArrayStats(nsName, stat, pv, stats, deviceType, rawMetrics) @@ -287,7 +287,7 @@ func (nw *NamespaceStatsProcessor) handleArrayStats(nsName string, statToProcess compositeStatName := deviceType + "_" + statType + "_" + statName deviceOrFileName := allNamespaceStats[deviceType+"."+statType+"["+statIndex+"]"] labels := []string{commons.METRIC_LABEL_CLUSTER_NAME, commons.METRIC_LABEL_SERVICE, commons.METRIC_LABEL_NS, statType + "_index", statType} - labelValues := []string{rawMetrics[Infokey_ClusterName], rawMetrics[Infokey_Service], nsName, statIndex, deviceOrFileName} + labelValues := []string{ClusterName, Service, nsName, statIndex, deviceOrFileName} return compositeStatName, labels, labelValues diff --git a/internal/pkg/statprocessors/sp_node_stats.go b/internal/pkg/statprocessors/sp_node_stats.go index f1355a90..884b05de 100644 --- a/internal/pkg/statprocessors/sp_node_stats.go +++ b/internal/pkg/statprocessors/sp_node_stats.go @@ -42,8 +42,8 @@ func (sw *NodeStatsProcessor) Refresh(infoKeys []string, rawMetrics map[string]s log.Tracef("node-configs:%s", nodeConfigs) log.Tracef("node-stats:%s", nodeStats) - clusterName := rawMetrics[Infokey_ClusterName] - service := rawMetrics[Infokey_Service] + clusterName := ClusterName + service := Service // we are sending configs and stats in same refresh call, as both are being sent to prom, instead of doing prom-push in 2 functions // handle configs diff --git a/internal/pkg/statprocessors/sp_sets.go b/internal/pkg/statprocessors/sp_sets.go index 8a938d5a..a677bb11 100644 --- a/internal/pkg/statprocessors/sp_sets.go +++ b/internal/pkg/statprocessors/sp_sets.go @@ -41,8 +41,8 @@ func (sw *SetsStatsProcessor) Refresh(infoKeys []string, rawMetrics map[string]s var allMetricsToSend = []AerospikeStat{} for i := range setStats { - clusterName := rawMetrics[Infokey_ClusterName] - service := rawMetrics[Infokey_Service] + clusterName := ClusterName + service := Service stats := commons.ParseStats(setStats[i], ":") for stat, value := range stats { diff --git a/internal/pkg/statprocessors/sp_sindex.go b/internal/pkg/statprocessors/sp_sindex.go index 0bc5ee2d..1734ac8d 100644 --- a/internal/pkg/statprocessors/sp_sindex.go +++ b/internal/pkg/statprocessors/sp_sindex.go @@ -72,8 +72,8 @@ func (siw *SindexStatsProcessor) Refresh(infoKeys []string, rawMetrics map[strin sindexName := sindexInfoKeySplit[1] log.Tracef("sindex-stats:%s:%s:%s", nsName, sindexName, rawMetrics[sindex]) - clusterName := rawMetrics[Infokey_ClusterName] - service := rawMetrics[Infokey_Service] + clusterName := ClusterName + service := Service stats := commons.ParseStats(rawMetrics[sindex], ";") for stat, value := range stats { diff --git a/internal/pkg/statprocessors/sp_users.go b/internal/pkg/statprocessors/sp_users.go index f623489a..05485cff 100644 --- a/internal/pkg/statprocessors/sp_users.go +++ b/internal/pkg/statprocessors/sp_users.go @@ -149,7 +149,7 @@ func (uw *UserStatsProcessor) refreshUserStats(infoKeys []string, rawMetrics map func internalCreateLocalAerospikeStat(rawMetrics map[string]string, pStatName string, username string) (AerospikeStat, []string, []string) { labels := []string{commons.METRIC_LABEL_CLUSTER_NAME, commons.METRIC_LABEL_SERVICE, commons.METRIC_LABEL_USER} - labelValues := []string{rawMetrics[Infokey_ClusterName], rawMetrics[Infokey_Service], username} + labelValues := []string{ClusterName, Service, username} allowed := isMetricAllowed(commons.CTX_USERS, pStatName) asMetric := NewAerospikeStat(commons.CTX_USERS, pStatName, allowed) diff --git a/internal/pkg/statprocessors/sp_xdr.go b/internal/pkg/statprocessors/sp_xdr.go index 40af77b0..77b69a22 100644 --- a/internal/pkg/statprocessors/sp_xdr.go +++ b/internal/pkg/statprocessors/sp_xdr.go @@ -129,12 +129,12 @@ func (xw *XdrStatsProcessor) handleRefresh(infoKeyToProcess string, xdrRawMetric } labels := []string{commons.METRIC_LABEL_CLUSTER_NAME, commons.METRIC_LABEL_SERVICE, commons.METRIC_LABEL_DC_NAME} - labelValues := []string{clusterName, service, dcName} + labelValues := []string{ClusterName, Service, dcName} // if namespace exists, add it to the label and label-values array if len(ns) > 0 { labels = []string{commons.METRIC_LABEL_CLUSTER_NAME, commons.METRIC_LABEL_SERVICE, commons.METRIC_LABEL_DC_NAME, commons.METRIC_LABEL_NS} - labelValues = []string{clusterName, service, dcName, ns} + labelValues = []string{ClusterName, Service, dcName, ns} } // pushToPrometheus(asMetric, pv, labels, labelsValues, ch) diff --git a/internal/pkg/statprocessors/statsrefresh.go b/internal/pkg/statprocessors/statsrefresh.go index ba36f3eb..aca75720 100644 --- a/internal/pkg/statprocessors/statsrefresh.go +++ b/internal/pkg/statprocessors/statsrefresh.go @@ -2,6 +2,7 @@ package statprocessors import ( commons "github.com/aerospike/aerospike-prometheus-exporter/internal/pkg/commons" + "github.com/aerospike/aerospike-prometheus-exporter/internal/pkg/config" "github.com/aerospike/aerospike-prometheus-exporter/internal/pkg/dataprovider" log "github.com/sirupsen/logrus" ) @@ -68,6 +69,9 @@ func Refresh() ([]AerospikeStat, error) { // set global values ClusterName, Service, Build = rawMetrics[Infokey_ClusterName], rawMetrics[Infokey_Service], rawMetrics[Infokey_Build] + if config.Cfg.Agent.IsKubernetes { + Service = config.Cfg.Agent.HostName + } // sanitize the utf8 strings before sending them to watchers for k, v := range rawMetrics {