12.2. 自定义日志记录警报
在日志记录 5.7 及更新的版本中,用户可以配置 LokiStack 部署来生成自定义警报和记录的指标。如果要使用自定义 警报和记录规则,您必须启用 LokiStack 规则器组件。
LokiStack 基于日志的警报和记录的指标通过将 LogQL 表达式提供给 ruler 组件来触发。Loki Operator 管理了一个针对所选 LokiStack 大小优化的标尺,可以是 1x.extra-small
、1x.small
或 1x.medium
。
要提供这些表达式,您必须创建一个 AlertingRule
自定义资源 (CR),其中包含与 Prometheus 兼容的 警报规则,或包含 Prometheus 兼容的 记录规则 的 RecordingRule
CR。
管理员可以为 application
, audit
, 或 infrastructure
租户配置基于日志的警报或记录指标数据。没有管理员权限的用户可为他们有权访问的应用程序
租户配置基于日志的警报或记录指标。
应用程序、审计和基础架构警报默认发送到 openshift-monitoring
命名空间中的 OpenShift Container Platform 监控堆栈 Alertmanager,除非您禁用了本地 Alertmanager 实例。如果启用了用于监控 openshift-user-workload-monitoring
命名空间中的用户定义的项目的 Alertmanager,应用程序警报默认发送到此命名空间中的 Alertmanager。
12.2.1. 配置规则器
启用 LokiStack 规则器组件后,用户可以定义一组 LogQL 表达式,用于触发日志记录警报或记录指标。
管理员可以通过修改 LokiStack
自定义资源(CR) 来启用规则器。
先决条件
- 已安装 Red Hat OpenShift Logging Operator 和 Loki Operator。
-
您已创建了
LokiStack
CR。 - 有管理员权限。
流程
通过确保
LokiStack
CR 包含以下 spec 配置来启用规则器:apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: <name> namespace: <namespace> spec: # ... rules: enabled: true 1 selector: matchLabels: openshift.io/<label_name>: "true" 2 namespaceSelector: matchLabels: openshift.io/<label_name>: "true" 3
12.2.2. 授权 LokiStack 规则 RBAC 权限
管理员可以允许用户通过将集群角色绑定到 username 来创建和管理自己的警报和记录规则。集群角色定义为 ClusterRole
对象,其中包含用户所需的基于角色的访问控制(RBAC)权限。
在日志记录 5.8 及更高版本中,为 LokiStack 提供了以下用于警报和记录规则的集群角色:
运行名称 | 描述 |
---|---|
|
具有此角色的用户具有管理级别访问权限来管理警报规则。此集群角色授予在 |
|
具有此角色的用户可以查看与 |
|
具有此角色的用户有权创建、更新和删除 |
|
具有此角色的用户可以读取 |
|
具有此角色的用户具有管理记录规则的管理级别访问权限。此集群角色授予在 |
|
具有此角色的用户可以查看与 |
|
具有此角色的用户有权创建、更新和删除 |
|
具有此角色的用户可以读取 |
12.2.2.1. 例子
要为用户应用集群角色,您必须将现有集群角色绑定到特定用户名。
集群角色可以是集群或命名空间范围,具体取决于您使用的角色绑定。使用 RoleBinding
对象时,如使用 oc adm policy add-role-to-user
命令时,集群角色仅适用于指定的命名空间。当使用 ClusterRoleBinding
对象时,如使用 oc adm policy add-cluster-role-to-user
命令时,集群角色会应用到集群中的所有命名空间。
以下示例命令为指定用户在集群中的特定命名空间中创建、读取、更新和删除(CRUD)权限:
特定命名空间中警报规则 CRUD 权限的集群角色绑定命令示例
$ oc adm policy add-role-to-user alertingrules.loki.grafana.com-v1-admin -n <namespace> <username>
以下命令为所有命名空间中的警报规则授予指定用户管理员权限:
管理员权限的集群角色绑定命令示例
$ oc adm policy add-cluster-role-to-user alertingrules.loki.grafana.com-v1-admin <username>
其他资源
12.2.3. 使用 Loki 创建基于日志的警报规则
AlertingRule
CR 包含一组规格和 webhook 验证定义,用于声明单个 LokiStack
实例的警报规则组。另外,webhook 验证定义支持规则验证条件:
-
如果
AlertingRule
CR 包含无效的interval
周期,则它是一个无效的警报规则 -
如果
AlertingRule
CR 包含无效的for
周期,则它是一个无效的警报规则 -
如果
AlertingRule
CR 包含无效的 LogQLexpr
,则它是一个无效的警报规则。 -
如果
AlertingRule
CR 包含两个同名的组,则它是一个无效的警报规则。 - 如果以上都不适用,则警报规则被视为有效。
租户类型 | AlertingRule CR 的有效命名空间 |
---|---|
application | |
audit |
|
infrastructure |
|
先决条件
- Red Hat OpenShift Logging Operator 5.7 及更新的版本
- OpenShift Container Platform 4.13 及更新的版本
流程
创建
AlertingRule
自定义资源 (CR):基础架构 AlertingRule CR 示例
apiVersion: loki.grafana.com/v1 kind: AlertingRule metadata: name: loki-operator-alerts namespace: openshift-operators-redhat 1 labels: 2 openshift.io/<label_name>: "true" spec: tenantID: "infrastructure" 3 groups: - name: LokiOperatorHighReconciliationError rules: - alert: HighPercentageError expr: | 4 sum(rate({kubernetes_namespace_name="openshift-operators-redhat", kubernetes_pod_name=~"loki-operator-controller-manager.*"} |= "error" [1m])) by (job) / sum(rate({kubernetes_namespace_name="openshift-operators-redhat", kubernetes_pod_name=~"loki-operator-controller-manager.*"}[1m])) by (job) > 0.01 for: 10s labels: severity: critical 5 annotations: summary: High Loki Operator Reconciliation Errors 6 description: High Loki Operator Reconciliation Errors 7
- 1
- 创建此
AlertingRule
CR 的命名空间必须具有与 LokiStackspec.rules.namespaceSelector
定义匹配的标签。 - 2
labels
块必须与 LokiStackspec.rules.selector
定义匹配。- 3
infrastructure
租户的AlertingRule
CR 只在openshift-*
,kube-\*
, 或default
命名空间中被支持。- 4
kubernetes_namespace_name:
的值必须与metadata.namespace
的值匹配。- 5
- 此必需字段的值必须是
critical
、warning
或info
。 - 6
- 这个字段是必须的。
- 7
- 这个字段是必须的。
应用程序 AlertingRule CR 示例
apiVersion: loki.grafana.com/v1 kind: AlertingRule metadata: name: app-user-workload namespace: app-ns 1 labels: 2 openshift.io/<label_name>: "true" spec: tenantID: "application" groups: - name: AppUserWorkloadHighError rules: - alert: expr: | 3 sum(rate({kubernetes_namespace_name="app-ns", kubernetes_pod_name=~"podName.*"} |= "error" [1m])) by (job) for: 10s labels: severity: critical 4 annotations: summary: 5 description: 6
应用
AlertingRule
CR:$ oc apply -f <filename>.yaml