Автор |sqlboy-юженc
Редактор | Дебра Чен

В реальных приложениях принято уведомлять конкретных людей о конкретных задачах. Хотя Apache DolphinScheduler предоставляет группы оповещений и экземпляры оповещений в своем центре безопасности, конфигурация может быть относительно сложной, и вам необходимо указывать группы оповещений во время запланированных задач. В этой статье вы узнаете простой метод, не требующий сложной настройки. Вам просто нужно добавить поле «Имя DingTalk» (dingding_name) в таблицу пользователей (t_ds_user), указать номера телефонов пользователей, сохранить соответствующие имена DingTalk и добиться автоматических оповещений DingTalk для конкретных людей при сбое задач в Apache DolphinScheduler.

Установите плагин plpython3u.

psql etl -U postgres
create extension plpython3u

Установите библиотеку запросов

cd /opt && wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pip install requests

Создайте процедуру для отправки сообщений DingTalk

plpython3u — ненадежный язык, поэтому его могут использовать только суперпользователи.

create or replace function tool.sp_send(
    message json,
    webhook varchar,
    secret varchar
)
returns text
language plpython3u
security definer 
as $function$
import requests
import json
import time
import hmac
import hashlib
import base64
import urllib.parse
v_timestamp = str(round(time.time() * 1000))
p_secret = secret
secret_enc = p_secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(v_timestamp, p_secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
v_sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
p_webhook = webhook
webhook_url = p_webhook+"&timestamp="+v_timestamp+"&sign="+v_sign
p_message = json.loads(message)
response = requests.post(webhook_url, data=json.dumps(p_message), headers={"Content-Type": "application/json"})
return response.text
$function$;
alter function tool.sp_send(json,varchar,varchar) owner to tool;
grant execute on function tool.sp_send(json,varchar,varchar) to public

Проверьте процедуру отправки сообщений DingTalk

select sp_send('{
    "msgtype": "actionCard",
    "actionCard": {
        "title": "20 Years Ago, I Wanted to Build an Apple Coffee Shop, Which Became the Predecessor of Apple Store",
        "text": "![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png) \n\n #### Steve Jobs Wanted to Build an Apple Coffee Shop 20 Years Ago \n\n The design of Apple Store is shifting from the original tech sense to a more lifestyle approach, a direction that can be traced back to Apple's plan to establish a coffee shop 20 years ago.",
        "btnOrientation": "0",
        "btns": [
            {
                "title": "Good Content",
                "actionURL": "https://www.dingtalk.com/"
            },
            {
                "title": "Not Interested",
                "actionURL": "https://www.dingtalk.com/"
            }
        ]
    }
}'::json)
  • Использованная литература:

Пользовательские настройки безопасности роботов — открытая платформа DingTalk
https://open.dingtalk.com/document/robots/customize-robot-security-settings

Доступ к пользовательскому роботу — открытая платформа DingTalk
https://open.dingtalk.com/document/robots/custom-robot-access

Добавьте поле «Имя DingTalk» в таблицу t_ds_user.

alter table t_ds_user add column dingding_name varchar(100);
-- Update the DingTalk usernames corresponding to Dolphin accounts manually

Напишите триггер

CREATE OR REPLACE FUNCTION dp.tg_ds_udef_alert_ding()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
declare
    i record;
    v_user varchar;
    v_mobile varchar;
    v_content text;
    v_message varchar;
begin
    if new.state in (4,5,6) then 
        for i in (
            -- Your query to fetch relevant data
        ) loop 
            v_mobile := i.phone;
            v_user := i.dingding_name;
            v_content := 'Dolphin workflow execution failed, please handle it ASAP!\r\nProject Name:\r\n'||i.project_name||'\r\nWorkflow Name:\r\n'||i.process_name||'\r\nTask Names:\r\n'||i.task_name;
            v_message := $v_message${
    "at": {
        "atMobiles":[
            "$v_message$||v_mobile||$v_message$"
        ],
        "atUserIds":[
            "$v_message$||v_user||$v_message$"
        ],
        "isAtAll": false
    },
    "text": {
        "content":"$v_message$||v_content||$v_message$"
    },
    "msgtype":"text"
}$v_message$;
            perform tool.sp_send(v_message::json);
        end loop;
    end if;
    return new;
end;
$function$;
create trigger tg_state_ds_process_instance after update on t_ds_process_instance for each row execute procedure tg_ds_udef_alert_ding()

Тестирование

Предупреждение о сбое выполнения рабочего процесса сообщается автоматически, и сообщение отправляется назначенному лицу.

Присоединяйтесь к сообществу

Добро пожаловать, заполните эту форму, чтобы стать докладчиком Apache DolphinScheduler: https://forms.gle/MS2fQDhG4n9Hh2yv5:)

Есть много способов принять участие и внести свой вклад в сообщество DolphinScheduler, в том числе:

Документы, перевод, Вопросы и ответы, тесты, коды, статьи,основные доклады,и т. д.

Мы предполагаем, что первый PR (документ, код), который будет способствовать, будет простым и его следует использовать для ознакомления с процессом подачи заявки и стилем сотрудничества с сообществом.

Итак, сообщество составило следующий список задач, подходящих для новичков: https://github.com/apache/dolphinscheduler/contribute

Список проблем, не связанных с новичками:

https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+

Как внести свой вклад:

https://github.com/apache/dolphinscheduler/blob/8944fdc62295883b0fa46b137ba8aee4fde9711a/docs/docs/en/contribute/join/contribute.md

Репозиторий кода GitHub: https://github.com/apache/dolphinscheduler

Официальный сайт:https://dolphinscheduler.apache.org/

Список рассылки:dev@[email protected]

Твиттер:@DolphinSchedule

YouTube:https://www.youtube.com/@apachedolphinscheduler

Slack:https://s.apache.org/dolphinscheduler-slack

Руководство для участников:https://dolphinscheduler.apache.org/en-us/community/index.html

Ваша звезда для проекта очень важна, не стесняйтесь зажечь звезду для Apache DolphinScheduler ❤️