> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flashcat.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# OceanBase 告警事件

> 通过 webhook 的方式同步 OceanBase 告警事件到 Flashduty On-call，实现告警事件自动化降噪处理

<div className="hide">
  ## 在 Flashduty On-call

  ***

  您可通过以下2种方式，获取一个集成推送地址，任选其一即可。

  ### 使用专属集成

  当您不需要将告警事件路由到不同的协作空间，优先选择此方式，更简单。

  <AccordionGroup>
    <Accordion title="展开">
      1. 进入 Flashduty 控制台，选择 **协作空间**，进入某个空间的详情页面
      2. 选择 **集成数据** tab，点击 **添加一个集成**，进入添加集成页面
      3. 选择 **OceanBase** 集成，点击 **保存**，生成卡片。
      4. 点击生成的卡片，可以查看到 **推送地址**，复制备用，完成。
    </Accordion>
  </AccordionGroup>

  ### 使用共享集成

  当您需要根据告警事件的 Payload 信息，将告警路由到不同的协作空间，优先选择此方式。

  <AccordionGroup>
    <Accordion title="展开">
      1. 进入 Flashduty 控制台，选择 **集成中心=>告警事件**，进入集成选择页面。
      2. 选择 **OceanBase** 集成：
         * **集成名称**：为当前集成定义一个名称。
      3. 配置默认路由，并选择对应的协作空间（集成创建后可以前往 `路由` 进行更多路由规则的配置）。
      4. 点击 **保存** 后，复制当前页面的新生成的 **推送地址** 备用。
      5. 完成。
    </Accordion>
  </AccordionGroup>
</div>

## 在 OceanBase

***

<div className="md-block">
  ## 一、OceanBase告警推送配置

  ### 步骤1：配置告警通道

  1. 登录您的OceanBase控制台，选择告警中心。
  2. 进入**告警通道** ，单击**新建通道**按钮，开始新建。
  3. 通道类型选择 **自定义脚本** 。
  4. 基本配置内容，如下图所示：

  <img alt="drawing" width="600" src="https://fcpub-1301667576.cos.ap-nanjing.myqcloud.com/flashduty/doc/oceanbase-1.png" />

  5. 配置通道中复制以下脚本内容，同时**请将脚本中的 integration\_key 参数补充上 Flashduty 推送地址中的 integration\_key 值**。

  ```
  #!/usr/bin/env bash

  function sendToFlashduty() {
      URL="${address}/event/push/alert/standard?integration_key=${integration_key}"
      curl -s -X POST ${URL} -H 'Content-Type: application/json' -d '{
          "event_status": "'${alert_level}'",
          "alert_key": "'${alarm_id}'",
          "description": "'"${alarm_description//\"/\\\"}"'",
          "title_rule": "$app_types::$name::$alarm_targets",
          "event_time":'${timestamp}',
          "labels": {
              "app_types":"'${app_type}'",
              "id":"'${alarm_id}'",
              "name":"'${alarm_name}'",
              "alarm_level":"'${alarm_level}'",
              "alarm_status":"'${alarm_status}'",
              "alarm_active_at":"'${alarm_active_at}'",
              "alarm_threshold":"'${alarm_threshold}'",
              "alarm_type":"'${alarm_type}'",
              "alarm_targets":"'${alarm_target}'",
              "ob_cluster_group":"'${ob_cluster_group}'",
              "ob_cluster":"'${ob_cluster}'",
              "hostIP":"'${host_ip}'",
              "app_cluster":"'${app_cluster}'",
              "alarm_description":"'"${alarm_description//\"/\\\"}"'",
              "alarm_url":"'${alarm_url}'"
          }
      }'

      return $?
  }

  alarm_name=$(echo ${alarm_name} | sed  "s/ /_/g")
  alarm_target=$(echo ${alarm_target} | sed  "s/ /_/g")

  #使用告警更新时间作为告警产生时间
  timestamp=$(TZ=UTC date -d "${alarm_updated_at}" +%s)

  #OceanBase告警通知的状态和级别是中文，所以先转Md5，再做判断
  levelMd5=$(echo ${alarm_level} | md5sum | awk '{print$1}')
  statusMd5=$(echo ${alarm_status} | md5sum | awk '{print$1}')

  #状态Md5
  active="048d106318302b41372b4292b5696ad4"
  Inactive="bf7da164d431439fe9668fbc964110c4"

  #告警级别Md5
  down="2e1558b0a152fae2dd15884561b1508d"
  critical="59b9b38574ca2ee4f5e264b56f49a83f"
  alert="723931b03a5d1cec59eac40cf0703580"   
  caution="abf4d55ba8926eff32cb44065e634ed3"
  info="6aae3f4254789d72aa0cc8ed55b8f11f"

  address="https://api.flashcat.cloud"
  integration_key=""

  #将OceanBase的告警级别定义做转换
  if [[ ${statusMd5} == ${Inactive} ]];then
      alert_level="Ok"
      timestamp=$(TZ=UTC date -d "${alarm_resolved_at}" +%s)
  elif [[ ${statusMd5} == "${active}" ]];then
      if [[ ${levelMd5} == ${down} || ${levelMd5} == ${critical} ]];then
          alert_level="Critical"
      elif [[ ${levelMd5} == ${alert} ]];then
          alert_level="Warning"
      elif [[ ${levelMd5} == ${caution}  ||  ${levelMd5} == ${info} ]];then
          alert_level="Info"
      fi
  fi

  #只有状态是告警中或恢复告警才发通知，屏蔽或抑制的不发通知
  if [[ ${statusMd5} == ${active} || ${statusMd5} == ${Inactive} ]];then
      sendToFlashduty
  fi
  ```

  6. Response 校验信息填写 {} 即可。
  7. 消息配置中的告警消息格式选择 Markdown。
  8. 告警消息模板 **选择简体中文**，并填写以下内容并提交。

  ```
  OCP告警通知-单条告警
  - 告警ID： ${alarm_id}
  - 名称：${alarm_name}
  - 级别：${alarm_level}
  - 告警对象：${alarm_target}
  - 服务： ${service}
  - 概述：${alarm_summary}
  - 生成时间：${alarm_active_at}
  - 更新时间： ${alarm_updated_at}
  - 恢复时间：${alarm_resolved_at}
  - 详情：${alarm_description}
  - 状态： ${alarm_status}
  - 告警类型： ${alarm_type}
  - 告警阈值： ${alarm_threshold}
  - 集群组： ${ob_cluster_group}
  - 集群： ${ob_cluster}
  - 主机： ${host_ip}
  - 应用集群： ${app_cluster}
  - OCP链接：${alarm_url}
  ```

  ### 步骤2：配置告警推送

  1. 新建推送配置，路径：**告警中心=>告警推送=>新建推送配置**。
  2. 推送类型、指定对象按需配置即可。

  <img alt="drawing" width="600" src="https://fcpub-1301667576.cos.ap-nanjing.myqcloud.com/flashduty/doc/oceanbase-2.png" />

  3. 推送语言选择 **简体中文**。
  4. 告警通道选择 **Flashduty** 。
  5. 开启 **恢复通知**。
  6. 提交。

  <img alt="drawing" width="600" src="https://fcpub-1301667576.cos.ap-nanjing.myqcloud.com/flashduty/doc/oceanbase-3.png" />
</div>

## 二、状态对照

<div className="md-block">
  | OceanBase | Flashduty | 状态 |
  | --------- | --------- | -- |
  | 停服        | Critical  | 严重 |
  | 严重        | Warning   | 严重 |
  | 警告        | Warning   | 警告 |
  | 注意        | Info      | 提醒 |
  | 提醒        | Info      | 提醒 |
</div>

## 状态对照

***

<div className="md-block">
  | OceanBase | Flashduty | 状态 |
  | --------- | --------- | -- |
  | 停服        | Critical  | 严重 |
  | 严重        | Warning   | 严重 |
  | 警告        | Warning   | 警告 |
  | 注意        | Info      | 提醒 |
  | 提醒        | Info      | 提醒 |
</div>
