# Compute Engine

Compute Engine 是 Clinic 诊断任务执行引擎。整个 Compute Engine 完全构建于 [AWS SAM](https://aws.amazon.com/serverless/sam/) 和 [AWS lambda](https://aws.amazon.com/lambda/) 之上。

Compute Engine 功能可以分为两大部分：
- 任务执行引擎
- 任务本身

## 简介

![arch](.doc/computer-engine-arch.png)

### 任务执行引擎 `./framework`

任务执行引擎是一个使用 golang 实现的 SAM application。它负责提供任务相关的 HTTP API，持久化任务元信息，并与 AWS lambda API 交互（执行任务）。

HTTP API 有两层路由组合。首先用 AWS api gateway 做了第一层，然后 golang 程序内部的 web server 做了第二层。

持久化存储使用 DynamoDB（dev 和 staging) 和 TiDBCloud（prod）。

详细启动配置参考 [template.yaml](framework/template.yaml)。

### 任务 `./jobs`

任务的业务逻辑任意，目前有 python 和 golang 两种实现方式。每个任务都是一个 SAM application。

详细启动配置参考各个任务的 `template.yaml` 文件（有些任务没有 `template.yaml`，在 Github Action 中会生成默认的 `template.yaml`）。

### 任务注册与执行

AWS lambda 扮演了任务注册表的角色。由于 AWS SAM 底层是 AWS lambda，每次 CD 完成，各个任务都会以 lambda function 的形式发布到 AWS lambda，这样就完成了注册。

任务执行引擎调用 lambda API 获取任务列表，然后根据任务列表选择并执行任务。

### 诊断规则

诊断规则是特定诊断任务的输入。它用 YAML object 编写，定义了数据类型、数据搜索条件、诊断建议等内容。

目前诊断规则基本可以分为两类：
- 数据源是 log，数据搜索条件是文本模式匹配
- 数据源是 metric，数据搜索条件是 Prometheus rule

未来，还将有其他类型的诊断规则。例如：
- 数据源是客户 TiDB 内的 `information_schema` 的某张表，数据搜索条件是 SQL

包含不同运算逻辑的诊断规则需要分配到不同任务中执行。

> YAML object 编写的诊断规则只是一种形式，诊断规则也可以直接 hardcode 到 golang、python 代码中。

## 提交新的诊断规则建议

- 在此项目创建一个 [issue](https://github.com/pingcap-inc/compute-engine/issues/new)，语言不限，格式不限，可参考[样例](https://github.com/pingcap-inc/compute-engine/issues/29)
- Issue 的正文中最好包含：
  - Background: 这个规则能解决什么问题（有问题的具体案例最佳）
  - Root Cause: 导致问题的根因是什么
  - Diagnosis: 问题的诊断方法（人/专家们是怎么诊断这个问题）
  - Workaround: 如果确实发生该问题，可以如何绕过
- 关于规则本身的问题，尽量在 issue 中（而非 IM 工具/邮件）讨论
- issue 需添加合适的 label
  - 所有的诊断规则都要添加诊断规则标签，即 "diagnose rule"。
  - 诊断诊断规则要按模块划分， "tidb"、"tikv"、cdc"、"lightling"、"tiflash"、"pd" 等 label 名称分别表示对应模块的规则。"slow query" label 名称表示慢日志相关的规则。
  - 诊断规则涉及到统计项打上 "metric" label，涉及到日志打上 "log" label，涉及配置的打上 "configuration" 的标签。
  - 诊断规则如果无效，打上 "invalid" 规则。
  - 有些 issue 本身不是规则，只是索引，打上 "wiki" 标签。
