diff --git a/slo-violation-detector/src/main/java/configuration/Constants.java b/slo-violation-detector/src/main/java/configuration/Constants.java index aad8dcb..5b92a08 100644 --- a/slo-violation-detector/src/main/java/configuration/Constants.java +++ b/slo-violation-detector/src/main/java/configuration/Constants.java @@ -38,6 +38,7 @@ public class Constants { public static int kept_values_per_metric = 5; //Default to be overriden from the configuration file. This indicates how many metric values are kept to calculate the "previous" metric value during the rate of change calculation public static String roc_calculation_mode = "prototype"; public static boolean single_slo_rule_active = true; //default value to be overriden + public static boolean assume_slo_rule_version_is_always_updated = false; public static double roc_limit = 1; public static double epsilon = 0.00000000001; public static Level debug_logging_level = Level.OFF; diff --git a/slo-violation-detector/src/main/java/runtime/Main.java b/slo-violation-detector/src/main/java/runtime/Main.java index dbd16fe..9be7276 100644 --- a/slo-violation-detector/src/main/java/runtime/Main.java +++ b/slo-violation-detector/src/main/java/runtime/Main.java @@ -30,7 +30,6 @@ import static utility_beans.generic_component_functionality.CharacterizedThread. @SpringBootApplication public class Main { - public static Long current_slo_rules_version = -1L;//initialization public static HashMap detectors = new HashMap<>(); public static void main(String[] args) { @@ -64,6 +63,7 @@ public class Main { kept_values_per_metric = Integer.parseInt(prop.getProperty("stored_values_per_metric", "5")); //TODO remove from docs as well: self_publish_rule_file = Boolean.parseBoolean(prop.getProperty("self_publish_rule_file")); single_slo_rule_active = Boolean.parseBoolean(prop.getProperty("single_slo_rule_active")); + assume_slo_rule_version_is_always_updated = Boolean.parseBoolean((prop.getProperty("assume_slo_rule_version_is_always_updated"))); time_horizon_seconds = Integer.parseInt(prop.getProperty("time_horizon_seconds")); slo_violation_probability_threshold = Double.parseDouble(prop.getProperty("slo_violation_probability_threshold")); diff --git a/slo-violation-detector/src/main/java/slo_violation_detector_engine/detector/DetectorSubcomponent.java b/slo-violation-detector/src/main/java/slo_violation_detector_engine/detector/DetectorSubcomponent.java index 4b776b9..e5528c3 100644 --- a/slo-violation-detector/src/main/java/slo_violation_detector_engine/detector/DetectorSubcomponent.java +++ b/slo-violation-detector/src/main/java/slo_violation_detector_engine/detector/DetectorSubcomponent.java @@ -26,6 +26,7 @@ import static utility_beans.monitoring.RealtimeMonitoringAttribute.aggregate_met public class DetectorSubcomponent extends SLOViolationDetectorSubcomponent { public static final SynchronizedInteger detector_integer_id = new SynchronizedInteger(); + private Long current_slo_rule_version = -1L; public static Map detector_subcomponents = Collections.synchronizedMap(new HashMap<>()); //A HashMap containing all detector subcomponents private DetectorSubcomponentState subcomponent_state; public final AtomicBoolean stop_signal = new AtomicBoolean(false); @@ -165,4 +166,12 @@ public class DetectorSubcomponent extends SLOViolationDetectorSubcomponent { return associated_detector; } + + public Long getCurrent_slo_rule_version() { + return current_slo_rule_version; + } + + public void setCurrent_slo_rule_version(Long current_slo_rule_version) { + this.current_slo_rule_version = current_slo_rule_version; + } } diff --git a/slo-violation-detector/src/main/java/slo_violation_detector_engine/detector/DetectorSubcomponentUtilities.java b/slo-violation-detector/src/main/java/slo_violation_detector_engine/detector/DetectorSubcomponentUtilities.java index ffce0c6..fb1991a 100644 --- a/slo-violation-detector/src/main/java/slo_violation_detector_engine/detector/DetectorSubcomponentUtilities.java +++ b/slo-violation-detector/src/main/java/slo_violation_detector_engine/detector/DetectorSubcomponentUtilities.java @@ -1,6 +1,5 @@ package slo_violation_detector_engine.detector; -import groovy.util.logging.Log; import metric_retrieval.AttributeSubscription; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -21,7 +20,6 @@ import static configuration.Constants.*; import static slo_violation_detector_engine.director.DirectorSubcomponent.MESSAGE_CONTENTS; import static slo_violation_detector_engine.generic.ComponentState.prop; import static slo_violation_detector_engine.generic.Runnables.get_severity_calculation_runnable; -import static runtime.Main.*; import static utility_beans.monitoring.PredictedMonitoringAttribute.getPredicted_monitoring_attributes; public class DetectorSubcomponentUtilities { @@ -119,13 +117,21 @@ public class DetectorSubcomponentUtilities { } - public static boolean slo_rule_arrived_has_updated_version(String rule_representation) { + public static boolean slo_rule_arrived_has_updated_version(String rule_representation,DetectorSubcomponent detector, boolean assume_version_is_always_updated) { + if (assume_version_is_always_updated){ //This behaviour shortcuts this method + return true; + } + //TODO: The json object version is ignored for now. However, it should not be, we should keep track separately per application JSONObject json_object = null; long json_object_version = 1; try { json_object = (JSONObject) new JSONParser().parse(rule_representation); - //json_object_version = (Long) json_object.get("version"); - json_object_version++; + if (json_object.containsKey("version")){ + json_object_version = (Long) json_object.get("version"); + }else{ + Logger.getGlobal().log(info_logging_level,"The rule which was received does not have a version field, and as we do not assume the version of the rule is always updated, it is ignored"); + } + //json_object_version++; } catch (NullPointerException n){ n.printStackTrace(); Logger.getGlobal().log(info_logging_level,"Unfortunately a null message was sent to the SLO Violation Detector, which is being ignored"); @@ -135,9 +141,9 @@ public class DetectorSubcomponentUtilities { Logger.getGlobal().log(info_logging_level,"Could not parse the JSON of the new SLO, assuming it is not an updated rule..."); return false; } - if (json_object_version > current_slo_rules_version){ - Logger.getGlobal().log(info_logging_level,"An SLO with updated version ("+json_object_version+" vs older "+current_slo_rules_version+") has arrived"); - current_slo_rules_version=json_object_version; + if (json_object_version > detector.getCurrent_slo_rule_version()){ + Logger.getGlobal().log(info_logging_level,"An SLO with updated version ("+json_object_version+" vs older "+detector.getCurrent_slo_rule_version()+") has arrived"); + detector.setCurrent_slo_rule_version(json_object_version); return true; }else { Logger.getGlobal().log(info_logging_level,"Taking no action for the received SLO message as the version number is not updated"); @@ -267,7 +273,7 @@ public class DetectorSubcomponentUtilities { associated_detector_subcomponent.can_modify_slo_rules.setValue(false); associated_detector_subcomponent.slo_rule_arrived.set(false); String rule_representation = MESSAGE_CONTENTS.get_synchronized_contents(associated_detector_subcomponent.get_application_name(),slo_rules_topic); - if (slo_rule_arrived_has_updated_version(rule_representation)) { + if (slo_rule_arrived_has_updated_version(rule_representation,associated_detector_subcomponent,assume_slo_rule_version_is_always_updated)) { if (single_slo_rule_active) { associated_detector_subcomponent.getSubcomponent_state().slo_rules.clear(); } diff --git a/slo-violation-detector/src/main/java/slo_violation_detector_engine/director/DirectorSubcomponent.java b/slo-violation-detector/src/main/java/slo_violation_detector_engine/director/DirectorSubcomponent.java index d2a976b..94ad76e 100644 --- a/slo-violation-detector/src/main/java/slo_violation_detector_engine/director/DirectorSubcomponent.java +++ b/slo-violation-detector/src/main/java/slo_violation_detector_engine/director/DirectorSubcomponent.java @@ -113,8 +113,6 @@ public class DirectorSubcomponent extends SLOViolationDetectorSubcomponent { - - BrokerSubscriber device_lost_subscriber = new BrokerSubscriber(topic_for_lost_device_announcement, broker_ip, broker_port, broker_username, broker_password, amq_library_configuration_location,EMPTY); BiFunction device_lost_subscriber_function = (broker_details, message) -> { BrokerPublisher persistent_publisher = new BrokerPublisher(topic_for_severity_announcement, broker_ip, broker_port, broker_username, broker_password, amq_library_configuration_location, true); diff --git a/slo-violation-detector/src/main/java/utility_beans/broker_communication/BrokerSubscriber.java b/slo-violation-detector/src/main/java/utility_beans/broker_communication/BrokerSubscriber.java index fa9e30a..e83c2a0 100644 --- a/slo-violation-detector/src/main/java/utility_beans/broker_communication/BrokerSubscriber.java +++ b/slo-violation-detector/src/main/java/utility_beans/broker_communication/BrokerSubscriber.java @@ -75,6 +75,11 @@ public class BrokerSubscriber { throw new RuntimeException(e); } } + this.topic = topic; + this.broker_ip = broker_ip; + this.broker_port = broker_port; + this.brokerUsername = brokerUsername; + this.brokerPassword = brokerPassword; broker_details = new BrokerSubscriptionDetails(broker_ip, brokerUsername, brokerPassword, application_name, topic); boolean subscriber_configuration_changed; if (!broker_and_topics_to_subscribe_to.containsKey(broker_ip)) { @@ -106,12 +111,6 @@ public class BrokerSubscriber { Logger.getGlobal().log(INFO, "HIGH level subscriber " + topic); } active_consumers_per_topic_per_broker_ip.get(broker_ip).put(topic, current_consumer); - - this.topic = topic; - this.broker_ip = broker_ip; - this.broker_port = broker_port; - this.brokerUsername = brokerUsername; - this.brokerPassword = brokerPassword; add_topic_consumer_to_broker_connector(current_consumer); } } diff --git a/slo-violation-detector/src/main/resources/config/eu.nebulous.slo_violation_detector.properties b/slo-violation-detector/src/main/resources/config/eu.nebulous.slo_violation_detector.properties index fb10b3c..1ea3894 100644 --- a/slo-violation-detector/src/main/resources/config/eu.nebulous.slo_violation_detector.properties +++ b/slo-violation-detector/src/main/resources/config/eu.nebulous.slo_violation_detector.properties @@ -4,6 +4,7 @@ metrics_bounds = avgResponseTime;unbounded;unbounded,custom2;0;3 slo_rules_topic = eu.nebulouscloud.monitoring.slo.new single_slo_rule_active = true +assume_slo_rule_version_is_always_updated = false #broker_ip_url = tcp://localhost:61616?wireFormat.maxInactivityDuration=0 broker_ip_url = nebulous-activemq broker_port = 5672