@@ -195,6 +195,7 @@ def to_json_data(self):
195
195
EXP_TYPE_REDUCE = 'reduce'
196
196
EXP_TYPE_RESAMPLE = 'resample'
197
197
EXP_TYPE_MATH = 'math'
198
+ EXP_TYPE_THRESHOLD = 'threshold'
198
199
199
200
# Alert Expression Reducer Function
200
201
EXP_REDUCER_FUNC_MIN = 'min'
@@ -1418,6 +1419,23 @@ def to_json_data(self):
1418
1419
1419
1420
return expression
1420
1421
1422
+ @attr .s
1423
+ class AlertExpressionv10 (AlertExpression ):
1424
+ """
1425
+ Specific to Grafana v10.x, adds support for threshold expression type
1426
+ """
1427
+
1428
+ expressionType = attr .ib (
1429
+ default = EXP_TYPE_CLASSIC ,
1430
+ validator = in_ ([
1431
+ EXP_TYPE_CLASSIC ,
1432
+ EXP_TYPE_REDUCE ,
1433
+ EXP_TYPE_RESAMPLE ,
1434
+ EXP_TYPE_MATH ,
1435
+ EXP_TYPE_THRESHOLD
1436
+ ])
1437
+ )
1438
+
1421
1439
1422
1440
@attr .s
1423
1441
class Alert (object ):
@@ -1510,6 +1528,16 @@ def is_valid_triggersv9(instance, attribute, value):
1510
1528
is_valid_target (instance , "alert trigger target" , trigger )
1511
1529
1512
1530
1531
+ def is_valid_triggersv10 (instance , attribute , value ):
1532
+ """Validator for AlertRule triggers for Grafana v9"""
1533
+ for trigger in value :
1534
+ if not (isinstance (trigger , Target ) or isinstance (trigger , AlertExpressionv10 )):
1535
+ raise ValueError (f"{ attribute .name } must either be a Target or AlertExpressionV10" )
1536
+
1537
+ if isinstance (trigger , Target ):
1538
+ is_valid_target (instance , "alert trigger target" , trigger )
1539
+
1540
+
1513
1541
@attr .s
1514
1542
class AlertRulev8 (object ):
1515
1543
"""
@@ -1620,10 +1648,8 @@ def to_json_data(self):
1620
1648
1621
1649
1622
1650
@attr .s
1623
- class AlertRulev9 (object ):
1651
+ class _BaseAlertRule (object ):
1624
1652
"""
1625
- Create a Grafana 9.x+ Alert Rule
1626
-
1627
1653
:param title: The alert's title, must be unique per folder
1628
1654
:param triggers: A list of Targets and AlertConditions.
1629
1655
The Target specifies the query, and the AlertCondition specifies how this is used to alert.
@@ -1650,7 +1676,6 @@ class AlertRulev9(object):
1650
1676
"""
1651
1677
1652
1678
title = attr .ib ()
1653
- triggers = attr .ib (factory = list , validator = is_valid_triggersv9 )
1654
1679
annotations = attr .ib (factory = dict , validator = instance_of (dict ))
1655
1680
labels = attr .ib (factory = dict , validator = instance_of (dict ))
1656
1681
@@ -1678,7 +1703,7 @@ class AlertRulev9(object):
1678
1703
dashboard_uid = attr .ib (default = "" , validator = instance_of (str ))
1679
1704
panel_id = attr .ib (default = 0 , validator = instance_of (int ))
1680
1705
1681
- def to_json_data (self ):
1706
+ def _render_triggers (self ):
1682
1707
data = []
1683
1708
1684
1709
for trigger in self .triggers :
@@ -1696,6 +1721,21 @@ def to_json_data(self):
1696
1721
else :
1697
1722
data += [trigger .to_json_data ()]
1698
1723
1724
+ return data
1725
+
1726
+ def to_json_data (self ):
1727
+ pass
1728
+
1729
+
1730
+ @attr .s
1731
+ class AlertRulev9 (_BaseAlertRule ):
1732
+ """
1733
+ Create a Grafana 9.x+ Alert Rule
1734
+ """
1735
+
1736
+ triggers = attr .ib (factory = list , validator = is_valid_triggersv9 )
1737
+
1738
+ def to_json_data (self ):
1699
1739
return {
1700
1740
"uid" : self .uid ,
1701
1741
"for" : self .evaluateFor ,
@@ -1704,13 +1744,35 @@ def to_json_data(self):
1704
1744
"grafana_alert" : {
1705
1745
"title" : self .title ,
1706
1746
"condition" : self .condition ,
1707
- "data" : data ,
1747
+ "data" : self . _render_triggers () ,
1708
1748
"no_data_state" : self .noDataAlertState ,
1709
1749
"exec_err_state" : self .errorAlertState ,
1710
1750
},
1711
1751
}
1712
1752
1713
1753
1754
+ @attr .s
1755
+ class AlertRulev10 (_BaseAlertRule ):
1756
+ """
1757
+ Create a Grafana 10.x+ Alert Rule
1758
+ """
1759
+
1760
+ triggers = attr .ib (factory = list , validator = is_valid_triggersv10 )
1761
+
1762
+ def to_json_data (self ):
1763
+ return {
1764
+ "uid" : self .uid ,
1765
+ "for" : self .evaluateFor ,
1766
+ "labels" : self .labels ,
1767
+ "annotations" : self .annotations ,
1768
+ "title" : self .title ,
1769
+ "condition" : self .condition ,
1770
+ "data" : self ._render_triggers (),
1771
+ "noDataState" : self .noDataAlertState ,
1772
+ "execErrState" : self .errorAlertState ,
1773
+ }
1774
+
1775
+
1714
1776
@attr .s
1715
1777
class AlertFileBasedProvisioning (object ):
1716
1778
"""
0 commit comments