使用Terraform玩转SLS告警

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: Terraform是有HashiCorp公司开源的IT基础架构的自动化编排工具,“Write,Plan and Create Infrastructure as Code”,Terraform的命令行接口(CLI)提供了一种简单的机制,用于将配置文件部署到阿里云或者其他任意支持的云上,并对其进行版本控制。SLS告警告警是一站式告警监控、降噪、事务管理、通知分派的智能运维平台。包含日志/时序存储、告警监控、告警管理、通知管理等模块;强大的功能当然也有自动化配置的需求,本文将介绍如何使用Terraform进行简单的配置,即可完成在无界面的告警配置。

前言

Terraform是有HashiCorp公司开源的IT基础架构的自动化编排工具,“Write,Plan and Create Infrastructure as Code”,Terraform的命令行接口(CLI)提供了一种简单的机制,用于将配置文件部署到阿里云或者其他任意支持的云上,并对其进行版本控制。

SLS告警告警是一站式告警监控、降噪、事务管理、通知分派的智能运维平台。包含日志/时序存储、告警监控、告警管理、通知管理等模块;强大的功能当然也有自动化配置的需求,本文将介绍如何使用Terraform进行简单的配置,即可完成在无界面的告警配置。

安装和配置Terraform

Terraform安装和配置可以参考阿里云Terraform的官方链接,并且在Cloud Shell中已经集成Terraform命令行。

SLS告警相关资源介绍

SLS告警主要涉及三类操作:

  • 告警资源初始化
  • 告警监控规则管理
  • 告警策略/资源数据管理

告警资源初始化

  • 初始化告警资源
  • 中心Project:名称为sls-alert-{uid}-{region},其中uid为阿里云主账号,region为用户指定的中心Project地域
  • 中心Logstore:名称为internal-alert-center-log,该logstore挂载在中心Project下,为免费Logstore,主要用来存储告警在执行过程中的执行历史和诊断信息。
  • 内置告警仪表盘:包括全局告警排障中心,全局告警链路中心,全局告警规则中心,开放告警中心。
  • 每个阿里云主账号只需要初始化一次即可;多次操作幂等。
  • 初始化Project告警资源
  • 告警监控规则必须挂载在SLS的某个Project下,在某个Project下创建告警规则之前,需要先初始化Project下的告警资源
  • 告警历史统计Logstore:名称为internal-alert-history,该Logstore为免费Logstore,存储了当前Project下所有告警规则的评估历史记录,包括每次评估的状态和告警触发状态。
  • 内置告警历史统计仪表盘:名称为internal-alert-analysis,仪表盘为内置仪表盘,展示了告警监控规则的执行历史成功率等。
  • 每个Project只需要初始化一次即可;多次操作幂等。

告警监控规则管理

告警监控规则是指可以设置对时序,日志等数据源的监控设置,包含协同监控,分组评估,触发条件设置,严重度设置,无数据告警和告警恢复等条件参数的设置。

告警资源数据管理

在SLS告警中,监控规则触发后,触发的告警消息会发现设置好的告警策略中,告警策略包含合并、静默、抑制等降噪处理,经过降噪处理后会发往指定的行动策略,行动策略可以简单的理解为通知渠道;

通知渠道包含短信、语音、邮件、Webhook、钉钉、微信、飞书、Function Compute和EventBridge等。里面涉及用户、用户组、Webhook的管理;

以上告警策略、行动策略、用户、用户组、Webhook等,在SLS中统称为告警资源数据。

使用Terraform管理SLS告警

配置身份信息以及告警相关的中心区域

export ALICLOUD_ACCESS_KEY="LTAIUrZCw3********"

export ALICLOUD_SECRET_KEY="zfwwWAMWIAiooj14GQ2*************"

export ALICLOUD_REGION="cn-heyuan"

初始化阿里云告警资源

如下配置会在ALICLOUD_REGION下创建资源如下:

  • project:名称格式为sls-alert-{uid}-{region}
  • logstore:internal-alert-center-log(该logstore免费)
  • Project内置仪表盘:全局告警排障中心,全局告警链路中心,全局告警规则中心,开放告警中心
  • 具体参数含义可以参考:alicloud_log_alert_resource
data "alicloud_log_alert_resource""example" {
  type          ="user"  lang          ="cn"}

初始化Project告警资源

如下配置会在test-project下创建如下资源:

  • logstore:internal-alert-log (该logstore免费)
  • 告警仪表盘
  • 注意,test-project需要在ALICLOUD_REGION这个region下
  • 具体参数含义可以参考:alicloud_log_alert_resource
data "alicloud_log_alert_resource""example" {
  type          ="project"  project       ="test-project"}

创建告警规则

以下配置将会创建告警监控规则,主要包括如下内容:

  • 告警名称、定时策略、无数据告警等
  • 查询列表,可以指定logstore和metricstore查询
  • 标签,标注配置,分组评估,严重度配置等
  • 告警策略和行动策略配置
  • 具体参数含义参考:alicloud_log_alert
resource "alicloud_log_alert""example" {
  version           ="2.0"  type              ="default"  project_name      ="test-project"  alert_name        ="tf-test-alert-2"  alert_displayname ="tf-test-alert-displayname-2"  dashboard         ="tf-test-dashboard"  mute_until        ="1632486684"  no_data_fire      ="false"  no_data_severity  =8  send_resolved     =true  schedule_interval ="5m"  schedule_type     ="FixedRate"  query_list {
    store       ="tf-test-logstore"    store_type  ="log"    project     ="test-project"    region      ="cn-heyuan"    chart_title ="chart_title"start="-60s"    end         ="20s"    query       ="* AND aliyun | select count(1) as cnt"    time_span_type ="Custom"  }
  query_list {
    store       ="tf-test-logstore-5"    store_type  ="log"    project     ="test-project"    region      ="cn-heyuan"    chart_title ="chart_title"start="-60s"    end         ="20s"    query       ="error | select count(1) as error_cnt"    time_span_type ="Custom"  }
  join_configurations {
      type ="cross_join"      condition =""  }
  labels {
    key ="env"    value ="test"  }
  labels {
    key ="env1"    value ="test1"  }
  annotations {
    key ="title"    value ="alert title-1"  }
  annotations {
    key ="desc"    value ="alert desc"  }
  annotations {
    key ="test_key"    value ="test value"  }
  group_configuration {
    type   ="custom"    fields = ["a", "b", "d"]
  }
  severity_configurations {
    severity =8    eval_condition = {
      condition ="cnt > 3"      count_condition ="__count__ > 3"    }
  }
  severity_configurations {
    severity =6    eval_condition = {
      condition =""      count_condition ="__count__ > 0"    }
  }
  severity_configurations {
    severity =2    eval_condition = {
      condition =""      count_condition =""    }
  }
  policy_configuration {
    alert_policy_id  ="sls.builtin.dynamic"    action_policy_id ="sls_test_action"    repeat_interval  ="1m"  }
}

告警资源创建

告警资源主要包括用户、用户组、值班组、webhook集成、告警策略、行动策略、内容模板、默认日志和渠道额度等。接下来以用户创建为例,介绍terraform格式,下面附有相关资源列表及结构介绍。

用户创建

  • resource_name使用资源类型表格中的sls.common.user
  • record_id表示用户的ID
  • tag表示用户名称
  • value是一个JSON字符串,参照上表中的结构示例
resource "alicloud_log_resource_record""user" {
  resource_name         ="sls.common.user"  record_id             ="test_tf_user"  tag                   ="test tf user"  value                 ="{\n\t\"user_name\": \"test tf user\", \n\t\"sms_enabled\": true, \n\t\"phone\": \"18888888889\", \n\t\"voice_enabled\": false, \n\t\"email\": [\n\t\t\"test@qq.com\"\n\t], \n\t\"enabled\": true, \n\t\"user_id\": \"test_tf_user\", \n\t\"country_code\": \"86\"\n}"}


相关资源列表

资源类型

resource_name

record_id

tag

value结构举例

备注

用户

sls.common.user

值同user_id

值同user_name

{
    "user_id": "xiaoming",
    "user_name": "小明",
    "email": [
        "xiaoming@example.com"
    ],
    "country_code": "86",
    "phone": "13334567890",
    "enabled": true,
    "sms_enabled": true,
    "voice_enabled": true
}

用户组

sls.common_user_group

值同

user_group_id

值同

user_group_name

{ 
    "user_group_id": "group-xiaoming",
    "user_group_name": "分组-小明",
    "enabled": true,
    "members": [
        "xiaoming"
    ]
}
  • record_id:user_id
  • tag: user_name

值班组

sls.alert.oncall_group

值同oncall_id

值同

oncall_name

{
    "oncall_id": "default_oncall",
    "oncall_name": "default oncall",
    "enabled": true,
    "overrides": [],
    "rotations": [
        {
            "targets": [
                {
                    "type": "user",
                    "target_id": "jizhi"
                },
                {
                    "type": "user_group",
                    "target_id": "alert-dev"
                }
            ],
            "end_time": 0,
            "shift_day": "",
            "shift_time": "12:00",
            "shift_type": "day",
            "start_time": 1633017600,
            "shift_minute": 0,
            "end_time_type": "none",
            "shift_interval": 1,
            "shift_week_custom": null,
            "restriction_date_type": "workday",
            "restriction_time_type": "allday",
            "restriction_week_range": null,
            "restriction_time_custom_range": null
        }
    ],
    "calendar_id": "default_calendar"
}

webhook集成

sls.alert.action_webhook

值同id

值同name

{
    "id": "custom-test",
    "name": "自定义webhook测试",
    "type": "custom",
    "url": "http://localhost:9099/data/webhook",
    "method": "POST",
    "headers": [
        {
            "key": "Content-Type",
            "value": "application/json"
        },
        {
            "key": "Foo",
            "value": "bar"
        }
    ]
}
  • type类型有:
    • dingtalk
    • wechat
    • lark
    • slack
    • custom
  • 除了 custom 类型外,其余几类 method 字段固定为 POST,headers 固定为空数组。

告警策略

sls.alert.alert_policy

值同policy_id

值同policy_name

{
    "policy_id": "sls.builtin",
    "policy_name": "内置告警策略",
    "parent_id": "sls.root",
    "is_default": false,
    "group_script": "fire(action_policy=\"sls.builtin\", group={\"project\": \"__a__\", \"uid\": alert.aliuid}, group_wait=\"5s\", group_interval=\"2m\", repeat_interval=\"2m\")\nstop()\nfire(action_policy=\"sls.builtin\", group={\"alert_id\": alert.alert_id}, group_wait=\"5s\", group_interval=\"10s\", repeat_interval=\"2m\")\nif alert.labels.name ~= \"^\\\\w+s$\":\n\tfire(action_policy=\"sls.builtin\", group={\"product\": \"xxs\"}, group_wait=\"5s\", group_interval=\"10s\", repeat_interval=\"2m\")\n\tstop()\nstop()\nfire(action_policy=\"sls.builtin\", group={\"label_name\": alert.labels.name}, group_wait=\"10s\", group_interval=\"10s\", repeat_interval=\"2m\")",
    "inhibit_script": "if alert.severity >= 8:\n    silence alert.severity < 6",
    "silence_script": ""
}
  • is_default 固定为 false
  • group_script 为路由合并策略
  • inhibit_script 为抑制策略
  • silence_script 为静默策略
  • 通过Terraform配置,group_script、inhibit_script 以及 silence_script 只包含DSL脚本信息,没有UI配置信息,因此控制台上无法看到相应的图形展示

行动策略

sls.alert.action_policy

值同action_policy_id

值同action_policy_name

{
    "action_policy_id": "sls.builtin",
    "action_policy_name": "默认行动策略",
    "labels": {},
    "is_default": false,
    "primary_policy_script": "fire(type=\"webhook_integration\", integration_type=\"dingtalk\", webhook_id=\"dingtalk-test\", template_id=\"default-template\", period=\"any\")",
    "secondary_policy_script": "fire(type=\"voice\", users=[\"jizhi\"], groups=[\"group-jizhi\"], template_id=\"default-template\")",
    "escalation_start_enabled": false,
    "escalation_start_timeout": "10s",
    "escalation_inprogress_enabled": false,
    "escalation_inprogress_timeout": "10s",
    "escalation_enabled": false,
    "escalation_timeout": "4h0m0s"
}
  • is_default 固定为 false
  • labels 为保留字段,固定为{}
  • primary_policy_script 为第一行动策略
  • secondary_policy_script 为第二行动策略
  • escalation_* 为控制第二行动策略是否开启的配置,可参考控制台上配置项
  • 通过Terraform配置的话,primary_policy_script 以及 secondary_policy_script 只包含DSL脚本信息,没有UI配置信息,因此控制台上无法看到相应的图形展示

内容模板

sls.alert.content_template

值同template_id

值同template_name

{
    "template_id": "default-template",
    "template_name": "默认模板",
    "is_default": false,
    "templates": {
        "fc": {
            "limit": 0,
            "locale": "zh-CN",
            "content": "",
            "send_type": "merged"
        },
        "sms": {
            "locale": "zh-CN",
            "content": ""
        },
        "lark": {
            "title": "Alerthub告警测试 ${alert_name}",
            "locale": "zh-CN",
            "content": ""
        },
        "email": {
            "locale": "zh-CN",
            "content": "",
            "subject": "SLS告警测试-jizhi-test"
        },
        "slack": {
            "title": "Alerthub告警测试 ${alert_name}",
            "locale": "zh-CN",
            "content": ""
        },
        "voice": {
            "locale": "zh-CN",
            "content": ""
        },
        "wechat": {
            "title": "Alerthub告警测试 ${alert_name}",
            "locale": "zh-CN",
            "content": ""
        },
        "webhook": {
            "limit": 0,
            "locale": "zh-CN",
            "content": "",
            "send_type": "merged"
        },
        "dingtalk": {
            "title": "Alerthub告警测试 ${alert_name}",
            "locale": "zh-CN",
            "content": ""
        },
        "event_bridge": {
            "locale": "zh-CN",
            "content": "",
            "subject": "wkb-test"
        },
        "message_center": {
            "locale": "zh-CN",
            "content": ""
        }
    }
}
  • is_default 固定为 false
  • templates 下包含每个渠道的模板配置,如果某个渠道的 content 为空,则使用系统默认的模板配置,参考 默认内容模板
  • locale 取值为 zh-CN 或 en-US
  • webhook 和 fc 渠道的 send_type 取值为 single 或者 merged,表示逐条通知或者合并通知

默认日历

sls.common.calender

值同calender_id

值同calender_name

{
    "calendar_id": "default_calendar",
    "calendar_name": "默认日历",
    "timezone": "Asia/Shanghai",
    "workdays": [
        1,
        2,
        3,
        4,
        5
    ],
    "worktime": [
        {
            "end_time": "21:00",
            "start_time": "09:00"
        }
    ],
    "reset_days": [],
    "holiday_sync": "china"
}
  • 默认日历的 id 固定为 default_calendar
  • 日历配置比较复杂,建议通过控制台来操作

渠道额度

sls.alert.channel_quota

值同id

值空

{
    "id": "default",
    "quota_script": "if user in [\"jizhi\"]:\n    set_limit(sms=5, voice=5, email=5)\nset_limit(sms=100, voice=100, email=100)"
}
  • id 固定为 default
  • quota_script 为 DSL 配置,通过 Terraform 配置会丢失UI配置信息,因此控制台上无法看到相应的图形展示
  • 建议通过控制台来配置

Terraform常用命令

  • 创建terraform.tf文件,输入上述内容,并保存在当前的执行目录中。
  • terraform init:初始化terraform配置
  • terraform plan:可以查看terraform.tf将修改与已生效(apply)的差异,结果以diff形式展示
  • terraform apply:将terraform.tf中的资源的创建和更新
  • terraform destory:对资源进行销毁
  • terraform import:对已有资源(通过非Terraform创建和管理的资源)进行导入。

参考




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
JSON Prometheus Cloud Native
Grafana 系列 -Loki- 基于日志实现告警
Grafana 系列 -Loki- 基于日志实现告警
|
7月前
|
Web App开发 存储 监控
日志服务之告警接入与管理
本教程介绍如何使用日志服务接入NGINX模拟数据,并配置告警规则来对NGINX访问错误进行监控。
334 0
|
5月前
|
监控 数据库
136 日志监控告警系统案例(代码实现)
136 日志监控告警系统案例(代码实现)
82 0
|
5月前
|
监控
135 日志监控告警系统案例(数据模型设计)
135 日志监控告警系统案例(数据模型设计)
79 0
|
5月前
|
消息中间件 监控 关系型数据库
134 日志监控告警系统案例(功能架构分析)
134 日志监控告警系统案例(功能架构分析)
72 0
|
5月前
|
分布式计算 监控 前端开发
133 日志监控告警系统案例(需求分析)
133 日志监控告警系统案例(需求分析)
54 0
|
SQL 监控 关系型数据库
【python小脚本】监听日志文件异常数据发送告警短信
老项目中有个用脚本启动的服务,很重要,用来做业务留痕的,涉及业务客户经常性投诉,是找第三方做的,时间长了维护需要花钱,老出各种未知bug,没办法处理所以机器上配了定时任务,定期的几天重启一次来解决。 但是有时候不知道什么原因,重启脚本运行,服务没起来,crond 也没有什么调度机制。 希望写个脚本做监控,当发现服务没起来,发送告警信息,或者重启服务。
139 0
|
监控
限制SLS告警通知时段的几种常见方法
在对系统进行监控告警的过程中,有时候并非在任何时候都要接收告警通知,本文会介绍几种常见的限制告警通知时段的方法,以及它们各自所适用的场景。
348 0
限制SLS告警通知时段的几种常见方法
|
机器人 定位技术
GrayLog+nxlog采集邮箱登录日志csv文件并实现邮箱异地登录钉钉机器人告警
GrayLog+nxlog采集邮箱登录日志csv文件并实现邮箱异地登录钉钉机器人告警
262 0
GrayLog+nxlog采集邮箱登录日志csv文件并实现邮箱异地登录钉钉机器人告警
|
运维 监控 安全
启用控制面日志采集及告警提升系统稳定性
服务网格的控制面组件扮演的一个重要角色是负责推送网格的规则配置到数据面的Sidecar代理或者网关中。如果用户配置的网格规则内容存在一些冲突导致推送失败, 因此代理或者网关就接收不到最新的配置内容。 因为代理或网关在不重启的情况下, 仍然可以使用已经接收到的配置继续运行, 但是一旦这些Pod重启, 很有可能导致Sidecar代理或网关启动失败。 在很多实际的客户场景中, 经常出现用户误配置引发的网关或代理不可用问题, 因此启用控制面的日志告警, 及时发现问题、解决问题势在必行。 ASM支持采集控制平面日志和日志告警,例如采集ASM控制平面向数据平面Sidecar推送配置的相关日志。
238 0
启用控制面日志采集及告警提升系统稳定性

相关产品

  • 日志服务
  • 推荐镜像

    更多