@@ -439,7 +439,7 @@ func (r *MetricStorageReconciler) reconcileNormal(
439439 instance .Status .Conditions .MarkTrue (telemetryv1 .DashboardDefinitionReadyCondition , telemetryv1 .DashboardsNotEnabledMessage )
440440 instance .Status .Conditions .MarkTrue (telemetryv1 .DashboardPluginReadyCondition , telemetryv1 .DashboardsNotEnabledMessage )
441441 } else {
442- if res , err := r .createDashboardObjects (ctx , instance , eventHandler ); err != nil {
442+ if res , err := r .createDashboardObjects (ctx , instance , helper , eventHandler ); err != nil {
443443 return res , err
444444 }
445445 }
@@ -601,7 +601,7 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
601601 return ctrl.Result {}, err
602602 }
603603
604- connectionInfo , err := getComputeNodesConnectionInfo (instance , helper )
604+ connectionInfo , err := getComputeNodesConnectionInfo (instance , helper , telemetry . ServiceName )
605605 if err != nil {
606606 Log .Info (fmt .Sprintf ("Cannot get compute node connection info. Scrape configs not created. Error: %s" , err ))
607607 }
@@ -624,18 +624,26 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
624624 return ctrl.Result {}, err
625625 }
626626
627+ connectionInfo , err = getComputeNodesConnectionInfo (instance , helper , telemetryv1 .TelemetryPowerMonitoring )
628+ if err != nil {
629+ Log .Info (fmt .Sprintf ("Cannot get compute node connection info. Scrape configs not created. Error: %s" , err ))
630+ }
631+
627632 // kepler scrape endpoints
628633 keplerEndpoints , _ := getKeplerTargets (connectionInfo )
629634 if err != nil {
630635 Log .Info (fmt .Sprintf ("Cannot get Kepler targets. Scrape configs not created. Error: %s" , err ))
631636 }
632637
633- // Kepler ScrapeConfig for non-tls nodes
634- keplerServiceName := fmt .Sprintf ("%s-kepler" , telemetry .ServiceName )
635- err = r .createServiceScrapeConfig (ctx , instance , Log , "Kepler" ,
636- keplerServiceName , keplerEndpoints , false ) // Currently Kepler doesn't support TLS so tlsEnabled is set to false
637- if err != nil {
638- return ctrl.Result {}, err
638+ // keplerEndpoint is reported as empty slice when telemetry-power-monitoring service is not enabled
639+ if len (keplerEndpoints ) > 0 {
640+ // Kepler ScrapeConfig for non-tls nodes
641+ keplerServiceName := fmt .Sprintf ("%s-kepler" , telemetry .ServiceName )
642+ err = r .createServiceScrapeConfig (ctx , instance , Log , "Kepler" ,
643+ keplerServiceName , keplerEndpoints , false ) // Currently Kepler doesn't support TLS so tlsEnabled is set to false
644+ if err != nil {
645+ return ctrl.Result {}, err
646+ }
639647 }
640648
641649 instance .Status .Conditions .MarkTrue (telemetryv1 .ScrapeConfigReadyCondition , condition .ReadyMessage )
@@ -673,7 +681,7 @@ func getKeplerTargets(nodes []ConnectionInfo) ([]string, []string) {
673681 return tls , nonTLS
674682}
675683
676- func (r * MetricStorageReconciler ) createDashboardObjects (ctx context.Context , instance * telemetryv1.MetricStorage , eventHandler handler.EventHandler ) (ctrl.Result , error ) {
684+ func (r * MetricStorageReconciler ) createDashboardObjects (ctx context.Context , instance * telemetryv1.MetricStorage , helper * helper. Helper , eventHandler handler.EventHandler ) (ctrl.Result , error ) {
677685 Log := r .GetLogger (ctx )
678686 uiPluginObj := & obsui.UIPlugin {
679687 ObjectMeta : metav1.ObjectMeta {
@@ -766,7 +774,14 @@ func (r *MetricStorageReconciler) createDashboardObjects(ctx context.Context, in
766774 "grafana-dashboard-openstack-node" : dashboards .OpenstackNode (datasourceName ),
767775 "grafana-dashboard-openstack-vm" : dashboards .OpenstackVM (datasourceName ),
768776 "grafana-dashboard-openstack-rabbitmq" : dashboards .OpenstackRabbitmq (datasourceName ),
769- "grafana-dashboard-openstack-kepler" : dashboards .OpenstackKepler (datasourceName ),
777+ }
778+
779+ // atleast one nodeset must have "telemetry-power-monitoring" service enabled for kepler dashboard to be created
780+ connectionInfo , err := getComputeNodesConnectionInfo (instance , helper , telemetryv1 .TelemetryPowerMonitoring )
781+ if err != nil {
782+ Log .Info (fmt .Sprintf ("Cannot get compute node connection info. Power monitoring dashboard not created. Error: %s" , err ))
783+ } else if len (connectionInfo ) > 0 {
784+ dashboardCMs ["grafana-dashboard-openstack-kepler" ] = dashboards .OpenstackKepler (datasourceName )
770785 }
771786
772787 for dashboardName , desiredCM := range dashboardCMs {
@@ -838,6 +853,7 @@ func (r *MetricStorageReconciler) ensureWatches(
838853func getComputeNodesConnectionInfo (
839854 instance * telemetryv1.MetricStorage ,
840855 helper * helper.Helper ,
856+ telemetryServiceName string ,
841857) ([]ConnectionInfo , error ) {
842858 ipSetList , err := getIPSetList (instance , helper )
843859 if err != nil {
@@ -855,24 +871,23 @@ func getComputeNodesConnectionInfo(
855871 return []ConnectionInfo {}, err
856872 }
857873 nodeSetGroup := inventory .Groups [secret .Labels ["openstackdataplanenodeset" ]]
858- containsTelemetry := false
874+ containsTargetService := false
859875 for _ , svc := range nodeSetGroup .Vars ["edpm_services" ].([]interface {}) {
860- if svc .(string ) == "telemetry" {
861- containsTelemetry = true
876+ if svc .(string ) == telemetryServiceName {
877+ containsTargetService = true
862878 }
863879 }
864- if ! containsTelemetry {
865- // Telemetry isn't deployed on this nodeset
866- // there is no reason to include these nodes
867- // for scraping by prometheus
880+ if ! containsTargetService {
881+ // If Telemetry|TelemetryPowerMonitoring isn't
882+ // deployed on this nodeset there is no reason
883+ // to include these nodes for scraping by prometheus
868884 continue
869885 }
870886 for name , item := range nodeSetGroup .Hosts {
871887 namespacedName := & types.NamespacedName {
872888 Name : name ,
873889 Namespace : instance .GetNamespace (),
874890 }
875-
876891 if len (ipSetList .Items ) > 0 {
877892 // if we have IPSets, lets go to search for the IPs there
878893 address , _ = getAddressFromIPSet (instance , & item , namespacedName , helper )
0 commit comments