use of com.linkedin.cruisecontrol.detector.AnomalyType in project cruise-control by linkedin.
the class ParameterUtils method anomalyTypes.
private static Set<AnomalyType> anomalyTypes(HttpServletRequest request, boolean isEnable) throws UnsupportedEncodingException {
Set<String> selfHealingForString = parseParamToStringSet(request, isEnable ? ENABLE_SELF_HEALING_FOR_PARAM : DISABLE_SELF_HEALING_FOR_PARAM);
Set<AnomalyType> anomalyTypes = new HashSet<>();
try {
for (String shfString : selfHealingForString) {
anomalyTypes.add(KafkaAnomalyType.valueOf(shfString.toUpperCase()));
}
} catch (IllegalArgumentException iae) {
throw new UserRequestException(String.format("Unsupported anomaly types in %s. Supported: %s", selfHealingForString, KafkaAnomalyType.cachedValues()));
}
return Collections.unmodifiableSet(anomalyTypes);
}
use of com.linkedin.cruisecontrol.detector.AnomalyType in project cruise-control by linkedin.
the class SelfHealingNotifier method selfHealingEnabledRatio.
@Override
public synchronized Map<AnomalyType, Float> selfHealingEnabledRatio() {
Map<AnomalyType, Float> selfHealingEnabledRatio = new HashMap<>();
long nowMs = _time.milliseconds();
long uptimeMs = uptimeMs(nowMs);
for (AnomalyType anomalyType : KafkaAnomalyType.cachedValues()) {
long enabledTimeMs = enabledTimeMs(anomalyType, nowMs);
selfHealingEnabledRatio.put(anomalyType, ((float) enabledTimeMs / uptimeMs));
}
return selfHealingEnabledRatio;
}
use of com.linkedin.cruisecontrol.detector.AnomalyType in project cruise-control by linkedin.
the class AdminRequest method processUpdateSelfHealingRequest.
protected void processUpdateSelfHealingRequest(Map<AnomalyType, Boolean> selfHealingBefore, Map<AnomalyType, Boolean> selfHealingAfter) {
UpdateSelfHealingParameters updateSelfHealingParameters = _parameters.updateSelfHealingParameters();
if (updateSelfHealingParameters != null) {
Set<AnomalyType> disableSelfHealingFor = updateSelfHealingParameters.disableSelfHealingFor();
Set<AnomalyType> enableSelfHealingFor = updateSelfHealingParameters.enableSelfHealingFor();
for (AnomalyType anomalyType : disableSelfHealingFor) {
selfHealingBefore.put(anomalyType, _kafkaCruiseControl.setSelfHealingFor(anomalyType, false));
selfHealingAfter.put(anomalyType, false);
}
for (AnomalyType anomalyType : enableSelfHealingFor) {
selfHealingBefore.put(anomalyType, _kafkaCruiseControl.setSelfHealingFor(anomalyType, true));
selfHealingAfter.put(anomalyType, true);
}
if (!disableSelfHealingFor.isEmpty() || !enableSelfHealingFor.isEmpty()) {
LOG.info("Self healing state is modified by user (before: {} after: {}).", selfHealingBefore, selfHealingAfter);
}
}
}
use of com.linkedin.cruisecontrol.detector.AnomalyType in project cruise-control by linkedin.
the class AlertaSelfHealingNotifier method alertTopicAnomaly.
private void alertTopicAnomaly(AnomalyType anomalyType, final String localHostname, List<AlertaMessage> alertaMessages, TopicAnomaly topicAnomaly) {
if (topicAnomaly instanceof TopicPartitionSizeAnomaly) {
TopicPartitionSizeAnomaly topicPartitionSizeAnomaly = (TopicPartitionSizeAnomaly) topicAnomaly;
for (Map.Entry<TopicPartition, Double> entry : topicPartitionSizeAnomaly.sizeInMbByPartition().entrySet()) {
AlertaMessage alertaMessage = new AlertaMessage(localHostname, ALERT_MESSAGE_PREFIX_TOPIC_PARTITION_SIZE_ANOMALY + entry.getKey().toString());
alertaMessage.setSeverity(NotifierUtils.getAlertSeverity(anomalyType).toString());
alertaMessage.setGroup(AlertaAlertGroup.PERFORMANCE.toString());
alertaMessage.setValue(String.format("%f MB", entry.getValue()));
alertaMessage.setCreateTime(CruiseControlUtils.utcDateFor(topicAnomaly.detectionTimeMs(), 3, ChronoUnit.SECONDS));
alertaMessages.add(alertaMessage);
}
} else if (topicAnomaly instanceof TopicReplicationFactorAnomaly) {
TopicReplicationFactorAnomaly topicReplicationFactorAnomaly = (TopicReplicationFactorAnomaly) topicAnomaly;
for (Entry<Short, Set<TopicReplicationFactorAnomalyEntry>> entry : topicReplicationFactorAnomaly.badTopicsByDesiredRF().entrySet()) {
entry.getValue().forEach(topicReplicationFactorAnomalyEntry -> {
AlertaMessage alertaMessage = new AlertaMessage(localHostname, ALERT_MESSAGE_PREFIX_TOPIC_REPLICATION_FACTOR_ANOMALY + topicReplicationFactorAnomalyEntry.topicName());
alertaMessage.setSeverity(NotifierUtils.getAlertSeverity(anomalyType).toString());
alertaMessage.setGroup(AlertaAlertGroup.PERFORMANCE.toString());
alertaMessage.setValue(String.format("%.2f", topicReplicationFactorAnomalyEntry.violationRatio()));
alertaMessage.setCreateTime(CruiseControlUtils.utcDateFor(topicAnomaly.detectionTimeMs(), 3, ChronoUnit.SECONDS));
alertaMessages.add(alertaMessage);
});
}
} else {
AlertaMessage alertaMessage = new AlertaMessage(localHostname, anomalyType.toString());
alertaMessage.setSeverity(NotifierUtils.getAlertSeverity(anomalyType).toString());
alertaMessage.setGroup(AlertaAlertGroup.PERFORMANCE.toString());
alertaMessage.setCreateTime(CruiseControlUtils.utcDateFor(topicAnomaly.detectionTimeMs(), 3, ChronoUnit.SECONDS));
alertaMessages.add(alertaMessage);
}
}
use of com.linkedin.cruisecontrol.detector.AnomalyType in project cruise-control by linkedin.
the class AnomalyDetectorState method onAnomalyHandle.
/**
* Update state regarding how the anomaly has been handled.
*
* @param anomaly The anomaly to handle.
* @param status A status information regarding how the anomaly was handled.
*/
synchronized void onAnomalyHandle(Anomaly anomaly, AnomalyState.Status status) {
AnomalyType anomalyType = anomaly.anomalyType();
String anomalyId = anomaly.anomalyId();
if (status == AnomalyState.Status.FIX_STARTED) {
_ongoingSelfHealingAnomaly = anomaly;
}
AnomalyState recentAnomalyState = _recentAnomaliesByType.get(anomalyType).get(anomalyId);
if (recentAnomalyState != null) {
recentAnomalyState.setStatus(status);
} else if (LOG.isDebugEnabled()) {
LOG.debug("Anomaly (type: {}, anomalyId: {}) is no longer in the anomaly detector state cache.", anomalyType, anomalyId);
}
}
Aggregations