# tasktor **Repository Path**: hulu20/tasktor ## Basic Information - **Project Name**: tasktor - **Description**: 自定义数据监控告警, 基于GoFrame开发的Prometheus exporter - **Primary Language**: Go - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-02-15 - **Last Updated**: 2023-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 流程架构图V0 ![image-20230215122023702](https://gitee.com/hulu20/common/raw/master/img/tasktor.jpg) #### 项目环境 ```shell 指标接口: goframe 2.0 + prometheus client 监控系统: prometheus server + alertmanager 数据来源: php task or python task --> rds 此监控系统优点: 1. 全自动化任务监控, 只要把任务状态update到数据库,就能对已有和新加任务进行监控告警 2. 告警可以根据任务通知到负责人 3. 告警有静默配置,比如一个告警持续没解决,多少小时内只会触发一次告警 4. 大盘数据,可以实时看到任务状态,并根据不同的条件进行筛选 ``` #### 大盘展示 ![image-20230214183135987](https://gitee.com/hulu20/common/raw/master/img/task-grafana-list.png) #### 钉钉告警 ![image-20230215165625091](https://gitee.com/hulu20/common/raw/master/img/task-alert-dingding.png) #### 数据来源 ```sql 1. 脚本启动,写入基础数据入rds 表 - (任务名称,所属系统, 任务状态,数据量,入库时间,更新时间) 2. 执行成功或失败,更新状态到rds表 # 表结构 CREATE TABLE `task_monitor_log` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `task_name` varchar(50) NOT NULL COMMENT '任务名称', `task_tag` varchar(20) NOT NULL DEFAULT 'ERP' COMMENT '任务所属系统', `username` varchar(20) NOT NULL DEFAULT '' COMMENT '任务负责人', `status` tinyint(1) NOT NULL DEFAULT '3' COMMENT '状态 1:成功 2:失败 3:执行中', `should_count` int(10) NOT NULL DEFAULT '0' COMMENT '应更新总量', `actual_count` int(10) NOT NULL DEFAULT '0' COMMENT '实际更新量', `start_at` bigint(10) NOT NULL DEFAULT '0' COMMENT '开始时间', `end_at` bigint(10) NOT NULL DEFAULT '0' COMMENT '结束时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_taskname` (`task_name`), KEY `idx_start_at` (`start_at`), KEY `idx_end_at` (`end_at`), KEY `idx_startat_tasktype` (`start_at`,`task_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务执行监控明细表' # 相关问题确认 1. 任务日志数据,每个任务执行的时候都会上传状态,后期这个数据将会很大,生命周期设置为3个月 2. 3个月外的数据是否需要归档 - 需讨论 3. 如需归档,归档到ADB,如不需归档,删除即可 4. 相关代码建议进行封装,后期所有任务都需要按照此规范进行上传状态 # 已有问题 1. 目前已经存在一个 table_mabang_stock_sku_sales_monitor 表, 后期这个表所涉及的功能请迁移到 table_task_monitor_log 表, 注意表结构有变化 ``` #### 监控系统 ```shell 1. 搭建监控信息 prometheus + grafana + alertmanage 2. 大屏数据 3. 自动告警 3.1 任务状态为失败,进行告警 3.2 任务执行超过12小时,进行告警 3.3 如果告警找不到对应人钉钉,则进行默认钉钉通知 ``` #### tasktor 指标接口 ```sql 1. 获取当前所有任务最新信息 SELECT task_name,username,status,should_count,actual_count,start_at from task_monitor_log a right JOIN (SELECT max(id) as id from task_monitor_log WHERE start_at >= UNIX_TIMESTAMP('2023-02-10') GROUP BY task_name) b on a.id = b.id 2. 向prometheus client 注册指标 3. 向外提供相应接口 #指标返回格式 - 每个指标单独处理,主要是为了视图多样化,如果只是为了显示表格,使用状态指标即可 1. 状态指标 - 当状态失败时告警 task_monitor_status{name="xxx",tag="xxx",status="xxx",username="xxxx",shCount="111",acCount="123",startAt="12312312"} 1 # 状态 1:成功 2:失败 3:执行中 2. 应更新数据指标 task_monitor_shCount{name="xxx",tag="xxx",username="xxxx",status="xxx"} 111 #应更新数据指标 3. 实际更新数据指标 task_monitor_acCount{name="xxx",tag="xxx",username="xxxx",status="xxx"} 123 #实际更新数据指标 4. 执行时长 task_monitor_exTime{name="xxx",tag="xxx",username="xxxx",status="xxx"} 123123123 # 执行时长 ``` #### 环境定义 ```shell # 每次项目开发,都涉及到各种各样的环境,我们该如何独立环境配置文件,就我个人而已,一般是从如下考虑 1. 配置文件要简洁清晰,各环境配置独立不影响 2. 不要跨项目关联,比如读系统变量或者在nginx下设定,会造成迁移项目的时候,忘记此配置 3. 项目初始化的时候就应该确认加载,避免每次修改功能的时候,都要做加载动作 这里以go为例 config.yaml 是框架默认定义的配置文件, 当我在开发环境做开发的时候,我创建了一个开发环境配置文件,然后config.yaml 只需添加env 环境标识参数 程序的boot init 入口, 添加判断环境配置代码即可 ``` #### 示例代码 ![img](https://gitee.com/hulu20/common/raw/master/img/tasktor-envconfig.png) #### 监控配置常见问题 ```shell # 表格整合 query 需用公式 task_monitor_status{tag=~"$tag",instance=~"$instance",status=~"$status",username=~"$username"} - 0 1. 每次循环前先reset指标,否则会产生状态重复 2. grafana 使用的时间戳是毫秒 ``` #### 告警模板 ```shell {{ $var := .externalURL}}{{ range $k,$v:=.alerts }} {{if eq $v.status "resolved"}} ![Prometheus](https://gitee.com/hulu20/common/raw/master/img/dingtalk_recovery-v1.png) ## [Prometheus恢复信息]({{$v.generatorURL}}) #### [{{$v.annotations.summary}}]({{$var}}) #### **告警级别:**{{$v.labels.level}} #### **开始时间:**{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}} #### **结束时间:**{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} #### **故障主机:**{{$v.labels.instance}} #### **任务详情:**{{$v.labels.tag}} - {{$v.labels.name}} ##### {{$v.annotations.description}} {{else}} ![Prometheus](https://gitee.com/hulu20/common/raw/master/img/dingtalk_alert-v1.png) ## [Prometheus告警信息]({{$v.generatorURL}}) #### [{{$v.annotations.summary}}]({{$var}}) #### **告警级别:**{{$v.labels.level}} #### **开始时间:**{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}} #### **结束时间:**{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} #### **故障主机:**{{$v.labels.instance}} #### **任务详情:**{{$v.labels.tag}} - {{$v.labels.name}} ##### {{$v.annotations.description}} {{end}} {{ end }} ``` #### 告警规则 ```shell groups: - name: taskAlert rules: - alert: statusAlert expr: task_monitor_status{} - 0 == 2 for: 1m labels: level: 2 severity: 'warning' annotations: summary: "任务告警" description: "任务执行失败,请尽快处理" - alert: runingAlert expr: floor(task_monitor_exTime{status=~"runing"}/3600) >= 5 for: 1m labels: level: 2 severity: 'warning' annotations: summary: "任务告警" description: "任务执行时间过长, 执行时间超过 {{ $value }} 小时,请尽快处理" ``` #### Grafana 模板配置 ```json json文件位置: manifest/opts/tasktor-grafana.json ``` ## 特别鸣谢 - [GoFrame](https://github.com/gogf/gf) ## 免责声明: > 1、Tasktor仅限自己学习使用,一切商业行为与Tasktor无关。 > > 2、用户不得利用Tasktor从事非法行为,用户应当合法合规的使用,发现用户在使用产品时有任何的非法行为,Gfast有权配合有关机关进行调查或向政府部门举报,Tasktor不承担用户因非法行为造成的任何法律责任,一切法律责任由用户自行承担,如因用户使用造成第三方损害的,用户应当依法予以赔偿。 > > 3、所有与使用Tasktor相关的资源直接风险均由用户承担。