Skip to content

Commit 792e4ac

Browse files
committed
feat: add cert-manager missing issuer log alert configuration and monitoring resource
1 parent c294e54 commit 792e4ac

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Supported services:
3333

3434
| Name | Description | Type | Default | Required |
3535
|------|-------------|------|---------|:--------:|
36+
| <a name="input_certificate"></a> [certificate](#input\_certificate) | Configuration for cert-manager missing issuer log alert. Allows customization of project, cluster, namespace, notification channels, alert documentation, enablement, extra filters, auto-close timing, and notification rate limiting. | <pre>object({<br/> enabled = optional(bool, true)<br/> cluster_name = string<br/> project_id = optional(string, null)<br/> namespace = optional(string, "cert-manager")<br/> notification_enabled = optional(bool, true)<br/> notification_channels = optional(list(string), [])<br/> logmatch_notification_rate_limit = optional(string, "300s")<br/> alert_documentation = optional(string, null)<br/> auto_close_seconds = optional(number, 3600)<br/> filter_extra = optional(string, "")<br/> })</pre> | n/a | yes |
3637
| <a name="input_cloud_sql"></a> [cloud\_sql](#input\_cloud\_sql) | Configuration for Cloud SQL monitoring alerts. Supports customization of project, auto-close timing, notification channels, and per-instance alert thresholds for CPU, memory, and disk utilization. | <pre>object({<br/> project_id = optional(string, null)<br/> auto_close = optional(string, "86400s") # default 24h<br/> notification_enabled = optional(bool, true)<br/> notification_channels = optional(list(string), [])<br/> instances = optional(map(object({<br/> cpu_utilization = optional(list(object({<br/> severity = optional(string, "WARNING"),<br/> threshold = optional(number, 0.90)<br/> alignment_period = optional(string, "120s")<br/> duration = optional(string, "300s")<br/> })), [<br/> {<br/> threshold = 0.85,<br/> duration = "1200s",<br/> },<br/> {<br/> severity = "CRITICAL",<br/> threshold = 1,<br/> duration = "300s",<br/> alignment_period = "60s",<br/> }<br/> ])<br/> memory_utilization = optional(list(object({<br/> severity = optional(string, "WARNING"),<br/> threshold = optional(number, 0.90)<br/> alignment_period = optional(string, "300s")<br/> duration = optional(string, "300s")<br/> })), [<br/> {<br/> severity = "WARNING",<br/> },<br/> {<br/> severity = "CRITICAL",<br/> threshold = 0.95,<br/> }<br/> ])<br/> disk_utilization = optional(list(object({<br/> severity = optional(string, "WARNING"),<br/> threshold = optional(number, 0.85)<br/> alignment_period = optional(string, "300s")<br/> duration = optional(string, "600s")<br/> })), [<br/> {<br/> severity = "WARNING",<br/> },<br/> {<br/> severity = "CRITICAL",<br/> threshold = 0.95,<br/> }<br/> ])<br/> })), {})<br/> })</pre> | n/a | yes |
3738
| <a name="input_kyverno"></a> [kyverno](#input\_kyverno) | Configuration for Kyverno monitoring alerts. Allows customization of cluster name, project, notification channels, alert documentation, metric thresholds, auto-close timing, enablement, extra filters, and namespace. | <pre>object({<br/> enabled = optional(bool, true)<br/> cluster_name = string<br/> project_id = optional(string, null)<br/> notification_enabled = optional(bool, true)<br/> notification_channels = optional(list(string), [])<br/> # Rate limit for notifications, e.g. "300s" for 5 minutes, used only for log match alerts<br/> logmatch_notification_rate_limit = optional(string, "300s")<br/> alert_documentation = optional(string, null)<br/> auto_close_seconds = optional(number, 3600)<br/> filter_extra = optional(string, "")<br/> namespace = optional(string, "kyverno")<br/> })</pre> | n/a | yes |
3839
| <a name="input_notification_channels"></a> [notification\_channels](#input\_notification\_channels) | List of notification channel IDs to notify when an alert is triggered | `list(string)` | `[]` | no |
@@ -50,6 +51,7 @@ Supported services:
5051

5152
| Name | Type |
5253
|------|------|
54+
| [google_monitoring_alert_policy.certificate_logmatch_alert](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/monitoring_alert_policy) | resource |
5355
| [google_monitoring_alert_policy.cloud_sql_cpu_utilization](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/monitoring_alert_policy) | resource |
5456
| [google_monitoring_alert_policy.cloud_sql_disk_utilization](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/monitoring_alert_policy) | resource |
5557
| [google_monitoring_alert_policy.cloud_sql_memory_utilization](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/monitoring_alert_policy) | resource |

certificate_log_alert.tf

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
locals {
2+
certificate_project_id = var.certificate.project_id != null ? var.certificate.project_id : var.project_id
3+
certificate_alert_documentation = (
4+
var.certificate.alert_documentation != null
5+
? var.certificate.alert_documentation
6+
: <<-EOT
7+
cert-manager is reporting that an Issuer or ClusterIssuer resource referenced by a Certificate cannot be found. This may indicate that the Issuer/ClusterIssuer has been deleted or is otherwise unavailable.
8+
EOT
9+
)
10+
certificate_notification_channels = var.certificate.notification_enabled ? (length(var.certificate.notification_channels) > 0 ? var.certificate.notification_channels : var.notification_channels) : []
11+
12+
certificate_log_filter = <<-EOT
13+
(
14+
(
15+
resource.type="k8s_container"
16+
AND resource.labels.project_id="${local.certificate_project_id}"
17+
AND resource.labels.cluster_name="${var.certificate.cluster_name}"
18+
AND resource.labels.namespace_name="${var.certificate.namespace}"
19+
)
20+
OR (
21+
log_id("events")
22+
AND resource.labels.project_id="${local.certificate_project_id}"
23+
AND resource.labels.cluster_name="${var.certificate.cluster_name}"
24+
AND (
25+
jsonPayload.involvedObject.namespace="${var.certificate.namespace}"
26+
OR jsonPayload.metadata.namespace="${var.certificate.namespace}"
27+
)
28+
)
29+
)
30+
AND (
31+
textPayload=~"Referenced \\"(Issuer|ClusterIssuer)\\" not found"
32+
OR jsonPayload.message=~"Referenced \\"(Issuer|ClusterIssuer)\\" not found"
33+
OR jsonPayload.note=~"Referenced \\"(Issuer|ClusterIssuer)\\" not found"
34+
)
35+
${trimspace(var.certificate.filter_extra)}
36+
EOT
37+
}
38+
39+
resource "google_monitoring_alert_policy" "certificate_logmatch_alert" {
40+
count = (
41+
var.certificate.enabled
42+
&& trimspace(var.certificate.cluster_name) != ""
43+
) ? 1 : 0
44+
45+
display_name = "cert-manager missing Issuer/ClusterIssuer (cluster=${var.certificate.cluster_name}, namespace=${var.certificate.namespace})"
46+
combiner = "OR"
47+
enabled = var.certificate.enabled
48+
49+
conditions {
50+
display_name = "Log match: cert-manager Issuer/ClusterIssuer not found"
51+
condition_matched_log {
52+
filter = local.certificate_log_filter
53+
}
54+
}
55+
56+
documentation {
57+
content = local.certificate_alert_documentation
58+
mime_type = "text/markdown"
59+
}
60+
61+
notification_channels = local.certificate_notification_channels
62+
63+
alert_strategy {
64+
auto_close = "${var.certificate.auto_close_seconds}s"
65+
notification_rate_limit {
66+
period = var.certificate.logmatch_notification_rate_limit
67+
}
68+
}
69+
}

variables.tf

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,19 @@ variable "kyverno" {
8282
namespace = optional(string, "kyverno")
8383
})
8484
}
85+
86+
variable "certificate" {
87+
description = "Configuration for cert-manager missing issuer log alert. Allows customization of project, cluster, namespace, notification channels, alert documentation, enablement, extra filters, auto-close timing, and notification rate limiting."
88+
type = object({
89+
enabled = optional(bool, true)
90+
cluster_name = string
91+
project_id = optional(string, null)
92+
namespace = optional(string, "cert-manager")
93+
notification_enabled = optional(bool, true)
94+
notification_channels = optional(list(string), [])
95+
logmatch_notification_rate_limit = optional(string, "300s")
96+
alert_documentation = optional(string, null)
97+
auto_close_seconds = optional(number, 3600)
98+
filter_extra = optional(string, "")
99+
})
100+
}

0 commit comments

Comments
 (0)