关于 tencentcloud-cls-alarm
tencentcloud-cls-alarm 是用于管理 Tencent Cloud CLS 告警的技能,面向需要维护日志告警策略和通知配置的运维人员。它涵盖告警策略、通知组、静默屏蔽规则及触发记录。
主要功能
- 01查看和创建告警策略
- 02修改告警查询与触发阈值
- 03启用或停用告警
- 04管理通知组和接收方
- 05设置限时告警屏蔽
- 06查询告警触发记录
适用场景
- 01创建基于日志查询的告警
- 02调整告警阈值和通知对象
- 03部署期间暂时静默告警
- 04检查告警触发时间与记录
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ acedatacloud/ skills --skill tencentcloud-cls-alarm安装后在 Claude Code 中输入/tencentcloud-cls-alarm确认已加载。
附带文件scripts/cls_alarm.py
详细介绍
腾讯云 CLS — 告警管理
对 CLS 告警策略、通知组、静默屏蔽和告警执行日志进行 CRUD 操作。
设置: 请参阅 腾讯云身份验证。默认使用环境变量中的
TENCENTCLOUD_REGION;CLS 告警按区域管理。配套技能: 用于搜索日志内容的
tencentcloud-cls。
CLI(首选)
该技能提供 scripts/cls_alarm.py — 将所有告警/通知/屏蔽操作封装为子命令。
# $SKILL_DIR can point at another skill loaded this turn — anchor on our own
# script (re-run this at the top of every fresh-shell Bash block).
CLSA="$SKILL_DIR/scripts/cls_alarm.py"; [ -f "$CLSA" ] || CLSA=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/cls_alarm.py' 2>/dev/null | head -1)
[ -f "$CLSA" ] || { echo "tencentcloud-cls-alarm script not found (SKILL_DIR=$SKILL_DIR)" >&2; exit 1; }
python3 "$CLSA" alarms # list policies
python3 "$CLSA" alarm <alarm-id> # full detail
python3 "$CLSA" alarm-disable <alarm-id> # quick mute (Status=false)
python3 "$CLSA" alarm-enable <alarm-id>
python3 "$CLSA" alarm-create --json /tmp/alarm.json --dry-run
python3 "$CLSA" alarm-modify <alarm-id> --condition '$1.cnt > 20'
python3 "$CLSA" alarm-delete <alarm-id> --yes # destructive
python3 "$CLSA" notices # notice groups
python3 "$CLSA" notice <notice-id>
python3 "$CLSA" shields # mute rules
python3 "$CLSA" shield-create --notice-id <notice-id> --start $(date +%s) --end $(date -v+2H +%s) --type 1 --reason "deploy"
python3 "$CLSA" alarm-log --time 6h # firing history
对于 CLI 未提供的少见架构字段,可改用下方的原始 SDK 示例。
适用场景
- 检查现有告警策略(按名称、启用状态筛选)
- 创建基于日志的新告警:CQL/SQL 查询 → 触发条件 → 通知组
- 修改阈值、查询、周期、接收人
- 事件期间快速启用/禁用,以静默告警
- 管理通知组(接收人:用户、群组、Webhook,并支持升级通知)
- 部署期间使用有时限的屏蔽规则静默告警
- 获取告警执行日志,查看哪些告警触发过以及触发时间
依赖项
pip install tencentcloud-sdk-python
快速开始
import os
import json
from tencentcloud.common import credential
from tencentcloud.cls.v20201016 import cls_client, models
cred = credential.EnvironmentVariableCredential().get_credential()
client = cls_client.ClsClient(cred, os.environ["TENCENTCLOUD_REGION"])
关键概念
| 对象 | API 方法 | 说明 |
|---|---|---|
| 告警策略 | DescribeAlarms / CreateAlarm / ModifyAlarm / DeleteAlarm | 针对一个或多个主题的查询 + 条件 + 通知组 |
| 通知组 | DescribeAlarmNotices / CreateAlarmNotice / … | 接收人(用户/群组/Webhook)+ 升级通知 |
| 屏蔽规则 | DescribeAlarmShields / CreateAlarmShield / … | 作用于某个通知组的有时限静默规则 |
| 告警日志 | GetAlarmLog | 触发历史 |
工作流
列出告警策略
req = models.DescribeAlarmsRequest()
req.Limit = 100
# Optional filters: req.Filters = [{"Key": "name", "Values": ["DeepSeek"]}]
resp = client.DescribeAlarms(req)
for a in resp.Alarms:
print(a.AlarmId, a.Name, "Enable=", a.Enable, "Status=", a.Status)
获取单个告警策略的完整信息
req = models.DescribeAlarmsRequest()
req.Filters = [{"Key": "alarmId", "Values": ["<alarm-id>"]}]
resp = client.DescribeAlarms(req)
print(json.dumps(resp.Alarms[0]._serialize(), indent=2, ensure_ascii=False))
创建告警
req = models.CreateAlarmRequest()
req.Name = "OpenAI 5xx burst"
req.AlarmTargets = [{
"TopicId": "<trace-topic-id>",
"Query": "* | select count(*) as cnt where status_code >= 500",
"Number": 1,
"StartTimeOffset": -5,
"EndTimeOffset": 0,
"SyntaxRule": 1, # 1 = CQL, 0 = Lucene
}]
req.MonitorTime = {"Type": "Period", "Time": 1}
req.Condition = "$1.cnt > 10"
req.AlarmPeriod = 5 # evaluate every 5 minutes
req.TriggerCount = 1 # fire after 1 consecutive match
req.AlarmLevel = 2 # 0=Notice, 1=Warning, 2=Critical
req.AlarmNoticeIds = ["<notice-id-a>", "<notice-id-b>"]
req.MonitorObjectType = 0
req.Enable = True
resp = client.CreateAlarm(req)
print("Created", resp.AlarmId)
快速启用/禁用
req = models.ModifyAlarmRequest()
req.AlarmId = "<alarm-id>"
req.Status = False # mute (Status — runtime), keep Enable=True
client.ModifyAlarm(req)
Enable与Status是不同的字段。Enable=False会归档告警定义;Status=False是日常用于静默告警的开关。
修改阈值,而不重写整个载荷
req = models.ModifyAlarmRequest()
req.AlarmId = "<alarm-id>"
req.Condition = "$1.cnt > 20"
req.AlarmPeriod = 10
client.ModifyAlarm(req)
删除(有破坏性)
# Confirm with the user first — there's no undo.
req = models.DeleteAlarmRequest()
req.AlarmId = "<alarm-id>"
client.DeleteAlarm(req)
管理通知组
# List
req = models.DescribeAlarmNoticesRequest()
req.Limit = 100
for n in client.DescribeAlarmNotices(req).AlarmNotices:
print(n.AlarmNoticeId, n.Name, n.Type)
# Create
req = models.CreateAlarmNoticeRequest()
req.Name = "Ops on-call"
req.Type = "Trigger" # Trigger | Recovery | All
req.NoticeReceivers = [{
"ReceiverType": "Uin",
"ReceiverIds": [123456],
"ReceiverChannels": ["Email", "Sms"],
"StartTime": "00:00:00",
"EndTime": "23:59:59",
}]
req.WebCallbacks = [{
"Url": "https://hooks.example.com/cls",
"CallbackType": "WeCom",
"Method": "POST",
}]
resp = client.CreateAlarmNotice(req)
有时限的屏蔽规则(部署期间静默告警)
import time
req = models.CreateAlarmShieldRequest()
req.AlarmNoticeId = "<notice-id>"
req.StartTime = int(time.time())
req.EndTime = int(time.time()) + 7200 # 2 hours
req.Type = 1 # 1 = full shield, 2 = partial
req.Reason = "Deploy <git-sha>"
client.CreateAlarmShield(req)
查看告警触发历史
req = models.GetAlarmLogRequest()
req.From = int((time.time() - 86400) * 1000)
req.To = int(time.time() * 1000)
req.Query = 'alarm_name:"OpenAI*"'
req.Limit = 100
resp = client.GetAlarmLog(req)
for line in resp.Results:
print(line.Time, line.LogJson)
克隆告警
创建类似告警最快的方法是读取现有告警,移除只读字段,调整后重新创建:
import json
existing = client.DescribeAlarms(models.DescribeAlarmsRequest(Filters=[{"Key": "alarmId", "Values": ["<src-id>"]}])).Alarms[0]
payload = json.loads(json.dumps(existing._serialize())) # deep clone
for k in ("AlarmId", "CreateTime", "UpdateTime"):
payload.pop(k, None)
payload["Name"] = "OpenAI 5xx burst v2"
# ...edit other fields...
req = models.CreateAlarmRequest()
req.from_json_string(json.dumps(payload))
print(client.CreateAlarm(req).AlarmId)
重要提示
- 调用
CreateAlarm/ModifyAlarm前,务必预览载荷(json.dumps(req._serialize(), indent=2))——架构要求严格,错误信息也不够明确。 - 破坏性操作(
DeleteAlarm、DeleteAlarmNotice、DeleteAlarmShield)需要先在聊天中征得用户明确确认,再执行。 Enable(是否归档?)与Status(当前是否启用?)是不同的字段。日常静默告警请使用Status。- 屏蔽规则仅作用于单个
AlarmNoticeId。要列出所有全局屏蔽规则,请遍历所有通知组 ID。 - 默认区域为
ap-hongkong;如需使用其他区域,可通过cls_client.ClsClient(cred, "ap-singapore")指定。
控制台链接
评论
支持 Markdown