Skip to content

Commit a262bf3

Browse files
authored
PMM-12741 Percona templated alerts - interval & folder uid (#2919)
* PMM-12741 Use folder uid for alert rules & handle evaluation interval * PMM-12741 Format files * PMM-12741 Rename parameter
1 parent 3258363 commit a262bf3

File tree

11 files changed

+173
-110
lines changed

11 files changed

+173
-110
lines changed

api/managementpb/alerting/alerting.pb.go

+102-88
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/managementpb/alerting/alerting.pb.validate.go

+29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/managementpb/alerting/alerting.proto

+2
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ message CreateRuleRequest {
187187
map<string, string> custom_labels = 8;
188188
// Filters.
189189
repeated Filter filters = 9;
190+
// Evaluation Interval
191+
google.protobuf.Duration interval = 10;
190192
}
191193

192194
message CreateRuleResponse {}

api/managementpb/alerting/json/alerting.json

+5
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@
8383
"type": "string",
8484
"x-order": 2
8585
},
86+
"interval": {
87+
"type": "string",
88+
"title": "Evaluation Interval",
89+
"x-order": 9
90+
},
8691
"name": {
8792
"description": "Rule name.",
8893
"type": "string",

api/managementpb/alerting/json/client/alerting/create_rule_responses.go

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/swagger/swagger-dev.json

+5
Original file line numberDiff line numberDiff line change
@@ -26751,6 +26751,11 @@
2675126751
}
2675226752
},
2675326753
"x-order": 8
26754+
},
26755+
"interval": {
26756+
"type": "string",
26757+
"title": "Evaluation Interval",
26758+
"x-order": 9
2675426759
}
2675526760
}
2675626761
}

api/swagger/swagger.json

+5
Original file line numberDiff line numberDiff line change
@@ -22017,6 +22017,11 @@
2201722017
}
2201822018
},
2201922019
"x-order": 8
22020+
},
22021+
"interval": {
22022+
"type": "string",
22023+
"title": "Evaluation Interval",
22024+
"x-order": 9
2202022025
}
2202122026
}
2202222027
}

managed/services/grafana/client.go

+6-8
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,8 @@ import (
4646
var ErrFailedToGetToken = errors.New("failed to get token")
4747

4848
const (
49-
defaultEvaluationInterval = time.Minute
50-
pmmServiceTokenName = "pmm-agent-st" //nolint:gosec
51-
pmmServiceAccountName = "pmm-agent-sa" //nolint:gosec
49+
pmmServiceTokenName = "pmm-agent-st" //nolint:gosec
50+
pmmServiceAccountName = "pmm-agent-sa" //nolint:gosec
5251
)
5352

5453
// Client represents a client for Grafana API.
@@ -484,7 +483,7 @@ func (c *Client) DeleteServiceAccount(ctx context.Context, nodeName string, forc
484483
}
485484

486485
// CreateAlertRule creates Grafana alert rule.
487-
func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName string, rule *services.Rule) error {
486+
func (c *Client) CreateAlertRule(ctx context.Context, folderUID, groupName, interval string, rule *services.Rule) error {
488487
authHeaders, err := auth.GetHeadersFromContext(ctx)
489488
if err != nil {
490489
return err
@@ -497,7 +496,7 @@ func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName stri
497496
}
498497

499498
var group AlertRuleGroup
500-
if err := c.do(ctx, http.MethodGet, fmt.Sprintf("/api/ruler/grafana/api/v1/rules/%s/%s", folderName, groupName), "", authHeaders, nil, &group); err != nil {
499+
if err := c.do(ctx, http.MethodGet, fmt.Sprintf("/api/ruler/grafana/api/v1/rules/%s/%s", folderUID, groupName), "", authHeaders, nil, &group); err != nil {
501500
return err
502501
}
503502

@@ -509,8 +508,7 @@ func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName stri
509508
group.Rules = append(group.Rules, b)
510509

511510
if group.Interval == "" {
512-
// TODO: align it with grafanas default value: https://grafana.com/docs/grafana/v9.0/setup-grafana/configure-grafana/#min_interval
513-
group.Interval = defaultEvaluationInterval.String()
511+
group.Interval = interval
514512
}
515513

516514
if err = validateDurations(group.Interval, rule.For); err != nil {
@@ -522,7 +520,7 @@ func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName stri
522520
return err
523521
}
524522

525-
if err := c.do(ctx, "POST", fmt.Sprintf("/api/ruler/grafana/api/v1/rules/%s", folderName), "", authHeaders, body, nil); err != nil {
523+
if err := c.do(ctx, "POST", fmt.Sprintf("/api/ruler/grafana/api/v1/rules/%s", folderUID), "", authHeaders, body, nil); err != nil {
526524
if err != nil {
527525
if cErr, ok := errors.Cause(err).(*clientError); ok { //nolint:errorlint
528526
return status.Error(codes.InvalidArgument, cErr.ErrorMessage)

managed/services/management/alerting/deps.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
)
2525

2626
type grafanaClient interface {
27-
CreateAlertRule(ctx context.Context, folderName, groupName string, rule *services.Rule) error
27+
CreateAlertRule(ctx context.Context, folderUID, groupName, interval string, rule *services.Rule) error
2828
GetDatasourceUIDByID(ctx context.Context, id int64) (string, error)
2929
GetFolderByUID(ctx context.Context, uid string) (*gapi.Folder, error)
3030
}

managed/services/management/alerting/mock_grafana_client_test.go

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

managed/services/management/alerting/service.go

+10-8
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ import (
5252
)
5353

5454
const (
55-
templatesDir = "/srv/alerting/templates"
56-
portalRequestTimeout = 2 * time.Minute // time limit to get templates list from the portal
55+
templatesDir = "/srv/alerting/templates"
56+
portalRequestTimeout = 2 * time.Minute // time limit to get templates list from the portal
57+
defaultEvaluationInterval = time.Minute
5758

5859
dirPerm = os.FileMode(0o775)
5960
)
@@ -701,11 +702,6 @@ func (s *Service) CreateRule(ctx context.Context, req *alerting.CreateRuleReques
701702
return nil, status.Error(codes.InvalidArgument, "Rule group name should be specified.")
702703
}
703704

704-
folder, err := s.grafanaClient.GetFolderByUID(ctx, req.FolderUid)
705-
if err != nil {
706-
return nil, err
707-
}
708-
709705
metricsDatasourceUID, err := s.grafanaClient.GetDatasourceUIDByID(ctx, 1) // 1 - it's id of Metrics datasource in PMM
710706
if err != nil {
711707
return nil, err
@@ -803,7 +799,13 @@ func (s *Service) CreateRule(ctx context.Context, req *alerting.CreateRuleReques
803799
Labels: labels,
804800
}
805801

806-
err = s.grafanaClient.CreateAlertRule(ctx, folder.Title, req.Group, &rule)
802+
// TODO: align it with grafanas default value: https://grafana.com/docs/grafana/v9.0/setup-grafana/configure-grafana/#min_interval
803+
interval := defaultEvaluationInterval.String()
804+
if req.Interval != nil {
805+
interval = req.Interval.AsDuration().String()
806+
}
807+
808+
err = s.grafanaClient.CreateAlertRule(ctx, req.FolderUid, req.Group, interval, &rule)
807809
if err != nil {
808810
return nil, err
809811
}

0 commit comments

Comments
 (0)