Prometheus 数据源标签映射

StoryBoard 链接 (任务 #28682): https://storyboard.openstack.org/#!/story/2004682

此蓝图描述了将 Prometheus 的告警标签映射到 Vitrage 的方法,以便 Vitrage 能够识别发出告警的资源。

问题描述

Vitrage 维护一个包含资源和告警的实体图。每个告警应连接到图中的其资源,以便支持告警关联。在 Prometheus 中,告警基于一个指标,每个指标可以有不同的 Labels。这些标签包含足够的信息来识别资源,但是对于每个告警,Vitrage 可能需要使用一个或多个不同的标签。

此蓝图的目的是定义一种方法,使 Vitrage 能够轻松确定每个 Prometheus 告警的识别方法。

在下面描述的使用案例中,我们希望在 Vitrage 中创建一个 Prometheus 告警顶点,并使用 on 边将其连接到图中的正确资源。

Prometheus 告警结构

Prometheus 告警包含几个字段,包括

  • annotations - 注释,包括告警的 titledescription

  • labels - 一个或多个标签的列表。这些标签由告警规则和告警基于的指标生成。

  • status - 告警的当前状态:firingresolved

Prometheus 告警示例

{
    "annotations": {
        "description": "The average amount of CPU time spent in idle mode, per second, over the last minute (in seconds)",
        "title": "High average CPU time on idle mode"
    },
    "endsAt": "2018-12-30T09:43:52.589431274Z",
    "generatorURL": "http://devstack-rocky-release-4:9090/graph?g0.expr=100+%2A+%281+-+avg+by%28instance%29+%28irate%28node_cpu_seconds_total%7Bjob%3D%22node%22%2Cmode%3D%22idle%22%7D%5B5m%5D%29%29%29+%3E+20&g0.tab=1",
    "labels": {
        "alertname": "AvgCPUTimeOnIdleMode",
        "instance": "135.248.18.109:9100",
        "severity": "warning"
    },
    "receivers": [
        "vitrage"
    ],
    "startsAt": "2018-12-26T15:22:07.589431274Z",
    "status": "firing"
}

Prometheus 告警结构的完整描述可以在 prometheus_alert_description 中找到

基于 libvirt 指标的告警

所有 libvirt 告警都具有以下标签

  • instance: 包含导出器运行的主机名/IP

  • domain: 导出器正在抓取的 libvirt 名称

基于 libvirt CPU 指标的告警

Prometheus 告警示例

{
    "annotations": {
        "description": "Test alert to test libvirt exporter.\n",
        "title": "High cpu usage on vm"
    },
    "endsAt": "2018-12-30T09:44:05.91446215Z",
    "generatorURL": "http://devstack-rocky-release-4:9090/graph?g0.expr=rate%28libvirt_domain_info_cpu_time_seconds_total%5B1m%5D%29+%2A+10000+%3E+13&g0.tab=1",
    "labels": {
        "alertname": "HighCpuOnVmAlert",
        "domain": "instance-00000004",
        "instance": "135.248.18.109:9177",
        "job": "libvirt",
        "severity": "critical"
    },
    "receivers": [
        "vitrage"
    ],
    "startsAt": "2018-12-26T15:23:05.91446215Z",
    "status": "firing"
}

Vitrage 资源

Vitrage 资源可以通过 instancedomain 标签唯一标识。

基于 libvirt 网络指标的告警

Prometheus 告警示例

{
    "annotations": {
        "description": "Another test alert to test libvirt exporter.\n",
        "title": "High traffic on bridge"
    },
    "endsAt": "2018-12-30T09:43:50.91446215Z",
    "generatorURL": "http://devstack-rocky-release-4:9090/graph?g0.expr=rate%28libvirt_domain_interface_stats_receive_bytes_total%5B5m%5D%29+%3E+0&g0.tab=1",
    "labels": {
        "alertname": "HighTrafficOnBridge",
        "domain": "instance-00000004",
        "instance": "135.248.18.109:9177",
        "job": "libvirt",
        "severity": "critical",
        "source_bridge": "br-int",
        "target_device": "tap456ab233-f4"
    },
    "receivers": [
        "vitrage"
    ],
    "startsAt": "2018-12-26T15:22:05.91446215Z",
    "status": "firing"
}

Vitrage 资源

  • 短期:在节点或实例上引发告警。Vitrage 资源可以通过 instancedomain 标签唯一标识。

  • 长期:Vitrage 应为 br-int 保留一个资源,告警应连接到该资源。Vitrage 资源可以通过 instancedomainsource_bridgetarget_device 标签唯一标识。

节点指标

Prometheus 告警

所有节点指标都具有一个 instance,其中包含导出器的地址。导出器可以从其运行的实例中抓取指标。在这种情况下,``instance`` 标签代表资源地址。它还可以抓取来自实例的不同指标(例如网络指标)。在这种情况下,instance 只是导出器的地址,其他标签指示资源。

基于节点 CPU 指标的告警

Prometheus 告警

CPU 指标是从实例抓取的,因此 instance 标签代表资源地址。

Prometheus 告警示例

{
    "annotations": {
        "description": "The average amount of CPU time spent in idle mode, per second, over the last minute (in seconds)",
        "title": "High average CPU time on idle mode"
    },
    "endsAt": "2018-12-30T09:43:52.589431274Z",
    "generatorURL": "http://devstack-rocky-release-4:9090/graph?g0.expr=100+%2A+%281+-+avg+by%28instance%29+%28irate%28node_cpu_seconds_total%7Bjob%3D%22node%22%2Cmode%3D%22idle%22%7D%5B5m%5D%29%29%29+%3E+20&g0.tab=1",
    "labels": {
        "alertname": "AvgCPUTimeOnIdleMode",
        "instance": "135.248.18.109:9100",
        "severity": "warning"
    },
    "receivers": [
        "vitrage"
    ],
    "startsAt": "2018-12-26T15:22:07.589431274Z",
    "status": "firing"
}

Vitrage 资源

Vitrage 资源可以通过 instance 标签唯一标识。

基于节点文件系统指标的告警

Prometheus 告警示例

{
    "annotations": {
        "description": "\"Consider ssh'ing into the instance and removing files or clean\ntemp files\"\n",
        "device": "/dev/vda1",
        "mount_point": "/",
        "runbook": "troubleshooting/filesystem_alerts_inodes.md",
        "title": "High number of inode usage",
        "value": "92.42%"
    },
    "endsAt": "2018-12-30T09:43:52.589431274Z",
    "generatorURL": "http://devstack-rocky-release-4:9090/graph?g0.expr=node_filesystem_files_free%7Bfstype%3D~%22%28ext.%7Cxfs%29%22%2Cjob%3D%22node%22%7D+%2F+node_filesystem_files%7Bfstype%3D~%22%28ext.%7Cxfs%29%22%2Cjob%3D%22node%22%7D+%2A+100+%3C%3D+100&g0.tab=1",
    "labels": {
        "alertname": "HighInodeUsage",
        "device": "/dev/vda1",
        "fstype": "ext4",
        "instance": "135.248.18.109:9100",
        "job": "node",
        "mountpoint": "/",
        "severity": "critical"
    },
    "receivers": [
        "vitrage"
    ],
    "startsAt": "2018-12-26T15:22:07.589431274Z",
    "status": "firing"
}

Vitrage 资源

  • 短期:在节点或实例上引发告警。Vitrage 资源可以通过 instance 标签唯一标识。

  • 长期:Vitrage 应为 ext4 保留一个资源,告警应连接到该资源。Vitrage 资源可以通过 instancedevicefstype 标签唯一标识。

提议的变更

一个配置文件,将 Prometheus 标签映射到具有特定属性(id 或其他唯一属性)的相应 Vitrage 资源。映射很可能由告警名称和其他字段定义。

Prometheus 配置文件结构

配置文件包含一个 alerts 列表。每个告警包含 keyresource

key 包含唯一标识每个告警的标签。

resource 指定如何在 Vitrage 中标识告警所在的资源。它包含一个或多个 Vitrage 属性名称和相应的 Prometheus 告警标签。

配置文件示例

alerts:
- key:
    alertname: HighCpuOnVmAlert
    job: libvirt
  resource:
    instance_name: domain
    host_id: instance
- key:
    alertname: HighTrafficOnBridge
    job: libvirt
  resource:
    instance_name: domain
    host_id: instance
- key:
    alertname: AvgCPUTimeOnIdleMode
  resource:
    id: instance
- key:
    alertname: HighInodeUsage
    job: node
  resource:
    id: instance

备选方案

数据模型影响

REST API 影响

版本影响

其他最终用户影响

部署者影响

待定

开发者影响

Horizon 影响

实现

负责人

主要负责人

7mode3294 (Muhamad Najjar)

工作项

  • 加载配置文件并在 Prometheus 转换器中使用它。

  • 文档和测试。

依赖项

测试

单元测试、功能测试和 Tempest 测试

文档影响

新的配置将被记录

参考资料