Skip to content

Commit

Permalink
Merge pull request #917 from bharathappali/performance-engine
Browse files Browse the repository at this point in the history
Performance engine
  • Loading branch information
dinogun authored Sep 12, 2023
2 parents 536a5bd + 43f7a33 commit 4ace564
Show file tree
Hide file tree
Showing 8 changed files with 1,264 additions and 105 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.autotune.analyzer.recommendations.RecommendationNotification;
import com.autotune.analyzer.recommendations.engine.CostRecommendationEngine;
import com.autotune.analyzer.recommendations.engine.KruizeRecommendationEngine;
import com.autotune.analyzer.recommendations.engine.PerformanceRecommendationEngine;
import com.autotune.analyzer.utils.AnalyzerConstants;
import com.autotune.common.data.result.ContainerData;
import com.autotune.common.data.result.ExperimentResultData;
Expand Down Expand Up @@ -57,6 +58,8 @@ private void init() {
CostRecommendationEngine costRecommendationEngine = new CostRecommendationEngine();
// TODO: Create profile based engine
AnalyzerConstants.RegisterRecommendationEngineStatus _unused_status = registerEngine(costRecommendationEngine);
PerformanceRecommendationEngine performanceRecommendationEngine = new PerformanceRecommendationEngine();
_unused_status = registerEngine(performanceRecommendationEngine);
// TODO: Add profile based once recommendation algos are available
}

Expand Down Expand Up @@ -126,6 +129,14 @@ public void generateRecommendation(KruizeObject kruizeObject, List<ExperimentRes
// Get the ContainerData from the KruizeObject and not from ResultData
ContainerData containerDataKruizeObject = k8sObjectKruizeObject.getContainerDataMap().get(cName);
for (KruizeRecommendationEngine engine : getEngines()) {
boolean isCostEngine = false;
boolean isPerfEngine = false;

if (engine.getEngineName().equalsIgnoreCase(RecommendationConstants.RecommendationEngine.EngineNames.COST))
isCostEngine = true;
if (engine.getEngineName().equalsIgnoreCase(RecommendationConstants.RecommendationEngine.EngineNames.PERFORMANCE))
isPerfEngine = true;

// Check if minimum data available to generate recommendation
if (!engine.checkIfMinDataAvailable(containerDataKruizeObject))
continue;
Expand All @@ -141,15 +152,25 @@ public void generateRecommendation(KruizeObject kruizeObject, List<ExperimentRes
}
// check if notification exists
boolean notificationExist = false;
if (containerRecommendations.getNotificationMap().containsKey(RecommendationConstants.NotificationCodes.INFO_COST_RECOMMENDATIONS_AVAILABLE))
if (isCostEngine && containerRecommendations.getNotificationMap().containsKey(RecommendationConstants.NotificationCodes.INFO_COST_RECOMMENDATIONS_AVAILABLE)) {
notificationExist = true;
} else if (isPerfEngine && containerRecommendations.getNotificationMap().containsKey(RecommendationConstants.NotificationCodes.INFO_PERFORMANCE_RECOMMENDATIONS_AVAILABLE))
notificationExist = true;

// If there is no notification add one
if (!notificationExist) {
RecommendationNotification recommendationNotification = new RecommendationNotification(
RecommendationConstants.RecommendationNotification.INFO_COST_RECOMMENDATIONS_AVAILABLE
);
containerRecommendations.getNotificationMap().put(recommendationNotification.getCode(), recommendationNotification);
if (isCostEngine) {
RecommendationNotification recommendationNotification = new RecommendationNotification(
RecommendationConstants.RecommendationNotification.INFO_COST_RECOMMENDATIONS_AVAILABLE
);
containerRecommendations.getNotificationMap().put(recommendationNotification.getCode(), recommendationNotification);
}
if (isPerfEngine) {
RecommendationNotification recommendationNotification = new RecommendationNotification(
RecommendationConstants.RecommendationNotification.INFO_PERFORMANCE_RECOMMENDATIONS_AVAILABLE
);
containerRecommendations.getNotificationMap().put(recommendationNotification.getCode(), recommendationNotification);
}
}

// Get the engine recommendation map for a time stamp if it exists else create one
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public static void generateRecommendation(KruizeObject kruizeObject) {
containerData.getContainerRecommendations().getNotificationMap().put(recommendationNotification.getCode(), recommendationNotification);
}
break;
case PROFILE_BASED:
case PERFORMANCE:
// Need to be implemented
break;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.autotune.analyzer.recommendations;

import com.autotune.analyzer.recommendations.subCategory.CostRecommendationSubCategory;
import com.autotune.analyzer.recommendations.subCategory.PerformanceRecommendationSubCategory;
import com.autotune.analyzer.recommendations.subCategory.RecommendationSubCategory;
import com.autotune.utils.KruizeConstants;

Expand Down Expand Up @@ -54,7 +55,44 @@ public enum RecommendationCategory {
}
),
// Need to update with profile based sub categories
PROFILE_BASED(KruizeConstants.JSONKeys.PROFILE_BASED, null);
PERFORMANCE(KruizeConstants.JSONKeys.PERFORMANCE, new PerformanceRecommendationSubCategory[]{
new PerformanceRecommendationSubCategory(
KruizeConstants.JSONKeys.SHORT_TERM,
KruizeConstants.RecommendationEngineConstants
.DurationBasedEngine.DurationAmount.SHORT_TERM_DURATION_DAYS,
TimeUnit.DAYS,
KruizeConstants.RecommendationEngineConstants
.DurationBasedEngine.RecommendationDurationRanges
.SHORT_TERM_TOTAL_DURATION_UPPER_BOUND_MINS,
KruizeConstants.RecommendationEngineConstants
.DurationBasedEngine.RecommendationDurationRanges
.SHORT_TERM_TOTAL_DURATION_LOWER_BOUND_MINS
),
new PerformanceRecommendationSubCategory(
KruizeConstants.JSONKeys.MEDIUM_TERM,
KruizeConstants.RecommendationEngineConstants
.DurationBasedEngine.DurationAmount.MEDIUM_TERM_DURATION_DAYS,
TimeUnit.DAYS,
KruizeConstants.RecommendationEngineConstants
.DurationBasedEngine.RecommendationDurationRanges
.MEDIUM_TERM_TOTAL_DURATION_UPPER_BOUND_MINS,
KruizeConstants.RecommendationEngineConstants
.DurationBasedEngine.RecommendationDurationRanges
.MEDIUM_TERM_TOTAL_DURATION_LOWER_BOUND_MINS
),
new PerformanceRecommendationSubCategory(
KruizeConstants.JSONKeys.LONG_TERM,
KruizeConstants.RecommendationEngineConstants
.DurationBasedEngine.DurationAmount.LONG_TERM_DURATION_DAYS,
TimeUnit.DAYS,
KruizeConstants.RecommendationEngineConstants
.DurationBasedEngine.RecommendationDurationRanges
.LONG_TERM_TOTAL_DURATION_UPPER_BOUND_MINS,
KruizeConstants.RecommendationEngineConstants
.DurationBasedEngine.RecommendationDurationRanges
.LONG_TERM_TOTAL_DURATION_LOWER_BOUND_MINS
),
});

private String name;
private RecommendationSubCategory[] recommendationSubCategories;
Expand Down Expand Up @@ -101,6 +139,11 @@ public enum RecommendationNotification {
RecommendationConstants.RecommendationNotificationMsgConstant.COST_RECOMMENDATIONS_AVAILABLE,
RecommendationConstants.RecommendationNotificationTypes.INFO
),
INFO_PERFORMANCE_RECOMMENDATIONS_AVAILABLE(
NotificationCodes.INFO_PERFORMANCE_RECOMMENDATIONS_AVAILABLE,
RecommendationNotificationMsgConstant.PERFORMANCE_RECOMMENDATIONS_AVAILABLE,
RecommendationNotificationTypes.INFO
),
INFO_NOT_ENOUGH_DATA(
RecommendationConstants.NotificationCodes.INFO_NOT_ENOUGH_DATA,
RecommendationConstants.RecommendationNotificationMsgConstant.NOT_ENOUGH_DATA,
Expand Down Expand Up @@ -292,6 +335,7 @@ private NotificationCodes() {
// Range: 112100 - 112199
public static final int COST_ENGINE_START = 112100;
public static final int INFO_COST_RECOMMENDATIONS_AVAILABLE = 112101;
public static final int INFO_PERFORMANCE_RECOMMENDATIONS_AVAILABLE = 112102;
public static final int COST_ENGINE_END = 112199;
// Subsystem subsection: Profile Based Engine
// Range: 112200 - 112299
Expand Down Expand Up @@ -659,6 +703,7 @@ public static final class RecommendationValueConstants {
public static final class RecommendationNotificationMsgConstant {
public static final String NOT_ENOUGH_DATA = "There is not enough data available to generate a recommendation.";
public static final String COST_RECOMMENDATIONS_AVAILABLE = "Cost Recommendations Available";
public static final String PERFORMANCE_RECOMMENDATIONS_AVAILABLE = "Performance Recommendations Available";
public static final String CPU_RECORDS_ARE_IDLE = "CPU Usage is less than a millicore, No CPU Recommendations can be generated";
public static final String CPU_RECORDS_ARE_ZERO = "CPU usage is zero, No CPU Recommendations can be generated";
public static final String MEMORY_RECORDS_ARE_ZERO = "Memory Usage is zero, No Memory Recommendations can be generated";
Expand Down Expand Up @@ -698,7 +743,7 @@ private RecommendationEngine() {
public static class EngineNames {
public static String DEFAULT_NAME = "Default";
public static String COST = "Cost";
public static String PROFILE_BASED = "Profile Based";
public static String PERFORMANCE = "Performance";

private EngineNames() {

Expand All @@ -707,7 +752,7 @@ private EngineNames() {

public static class EngineKeys {
public static String COST_KEY = "cost";
public static String PROFILE_BASED_KEY = "profile_based";
public static String PERFORMANCE_BASED_KEY = "performance";

private EngineKeys() {

Expand Down
Loading

0 comments on commit 4ace564

Please sign in to comment.