mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-27 21:46:04 +02:00
![twitter-team](/assets/img/avatar_default.png)
Please note we have force-pushed a new initial commit in order to remove some publicly-available Twitter user information. Note that this process may be required in the future.
66 lines
2.9 KiB
Scala
66 lines
2.9 KiB
Scala
package com.twitter.home_mixer.service
|
|
|
|
import com.twitter.conversions.DurationOps._
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.Destination
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.EmptyResponseRateAlert
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.LatencyAlert
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.NotificationGroup
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.P99
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.Percentile
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.SuccessRateAlert
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.predicate.TriggerIfAbove
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.predicate.TriggerIfBelow
|
|
import com.twitter.product_mixer.core.functional_component.common.alert.predicate.TriggerIfLatencyAbove
|
|
import com.twitter.util.Duration
|
|
|
|
/**
|
|
* Notifications (email, pagerduty, etc) can be specific per-alert but it is common for multiple
|
|
* products to share notification configuration.
|
|
*/
|
|
object HomeMixerAlertConfig {
|
|
val DefaultNotificationGroup: NotificationGroup = NotificationGroup(
|
|
warn = Destination(emails = Seq("")),
|
|
critical = Destination(emails = Seq(""))
|
|
)
|
|
|
|
object BusinessHours {
|
|
val DefaultNotificationGroup: NotificationGroup = NotificationGroup(
|
|
warn = Destination(emails = Seq("")),
|
|
critical = Destination(emails = Seq(""))
|
|
)
|
|
|
|
def defaultEmptyResponseRateAlert(warnThreshold: Double = 50, criticalThreshold: Double = 80) =
|
|
EmptyResponseRateAlert(
|
|
notificationGroup = DefaultNotificationGroup,
|
|
warnPredicate = TriggerIfAbove(warnThreshold),
|
|
criticalPredicate = TriggerIfAbove(criticalThreshold)
|
|
)
|
|
|
|
def defaultSuccessRateAlert(
|
|
threshold: Double = 99.5,
|
|
warnDatapointsPastThreshold: Int = 20,
|
|
criticalDatapointsPastThreshold: Int = 30,
|
|
duration: Int = 30
|
|
) = SuccessRateAlert(
|
|
notificationGroup = DefaultNotificationGroup,
|
|
warnPredicate = TriggerIfBelow(threshold, warnDatapointsPastThreshold, duration),
|
|
criticalPredicate = TriggerIfBelow(threshold, criticalDatapointsPastThreshold, duration),
|
|
)
|
|
|
|
def defaultLatencyAlert(
|
|
latencyThreshold: Duration = 200.millis,
|
|
warningDatapointsPastThreshold: Int = 15,
|
|
criticalDatapointsPastThreshold: Int = 30,
|
|
duration: Int = 30,
|
|
percentile: Percentile = P99
|
|
): LatencyAlert = LatencyAlert(
|
|
notificationGroup = DefaultNotificationGroup,
|
|
percentile = percentile,
|
|
warnPredicate =
|
|
TriggerIfLatencyAbove(latencyThreshold, warningDatapointsPastThreshold, duration),
|
|
criticalPredicate =
|
|
TriggerIfLatencyAbove(latencyThreshold, criticalDatapointsPastThreshold, duration)
|
|
)
|
|
}
|
|
}
|