DingTalk
DingTalk 통합은 오늘 알림 전용 입니다 (DingTalk 그룹으로 발화된 알림 push). IM 브릿지 양방향 모드는 계획되어 있지만 출하되지 않음; validator 는 향후 호환을 위해 stream/webhook 모드에서 dingtalk 를 수락합니다.
| Mode | Status |
|---|---|
| 알림 | 지원됨. 커스텀 그룹 봇, 서명됨. |
| IM 브릿지 | 스캐폴드 존재; 프로덕션 지원 보류. |
Payload
DingTalk 의 커스텀 봇은 표준 텍스트 메시지 형태를 수락:
{
"msgtype": "text",
"text": {"content": "[CRITICAL] node-01 swap_high\nswap_in_pages > 1000 for 5m\nsource: alert\ndedupe: alert:swap_high:device=7"}
}body 자체는 서명되지 않음. DingTalk 은 대신 URL 쿼리 파라미터로 요청을 인증합니다 — 서명 참고.
이것은 Feishu 와 WeCom sender 가 사용하는 같은 flat-text 포매터이며, formatText 가 생성합니다.
서명
커스텀 봇에 加签 (signed) 가 켜져 있으면 DingTalk 은 요청에 timestamp 와 sign URL 쿼리 파라미터를 요구합니다.
timestamp = milliseconds since epoch
stringToSign = timestamp + "\n" + secret
sign = base64(HMAC-SHA256(key=secret, message=stringToSign))서명 키는 시크릿 단독 (Feishu 와 다름 — Feishu 는 시크릿이 string-to-sign 의 일부). signDingTalkURL 헬퍼는 두 쿼리 파라미터를 모두 추가:
POST https://oapi.dingtalk.com/robot/send?access_token=…×tamp=1717012345000&sign=…body 는 plain JSON 으로 유지. 서명된 URL + body 가 DingTalk 이 인증하는 대상.
밀리초 timestamp 사용
DingTalk 서명은 초가 아닌 밀리초 를 기대합니다. signer 는 time.Now().UnixMilli() 를 사용. 초 정밀도 timestamp 는 310000 "sign invalid" 응답을 줍니다.
설정
- 대상 DingTalk 그룹에서 → 群设置 → 智能群助手 → 添加机器人 → 自定义. 이름과 아바타 부여.
- 安全设置 → 加签 선택, 시크릿 복사. (IP 화이트리스트 또는 키워드 필터를 대신 선택할 수도 있음; Ongrid sender 는 어느 것이든 지원하나 서명 모드 권장.)
- webhook URL 복사 — 다음과 같이 생김:
https://oapi.dingtalk.com/robot/send?access_token=<token>. - Ongrid 에서: Settings → Channels → New → Provider =
dingtalk→ Endpoint = webhook URL → Secret = 2 단계의 서명 시크릿 (키워드 또는 IP 화이트리스트 모드를 선택했다면 건너뜀).
테스트 메시지는 그룹의 "안전" 규칙과 일치해야 함
키워드 필터를 선택했다면 테스트 메시지 body 가 반드시 그 키워드를 포함해야 합니다. 아니면 DingTalk 이 거부. 기본 Ongrid 테스트 메시지는 [INFO] Ongrid test. 일치하는 키워드 (Ongrid 가 동작) 를 구성하거나 서명 모드를 선택하세요.
특이점
at 미지원
현재 sender 는 순수 msgtype: text 만 출하. 특정 사용자 멘션 (atMobiles / atUserIds / isAtAll) 은 아직 payload 빌더에 없음. 오늘 필요하다면 일반 webhook 을 사용; 네이티브 지원은 향후 개선 사항.
4xx 에서의 재시도는 의도적
DingTalk 은 프로토콜 레벨 실패 (서명 불일치, 메시지 너무 김, 봇 rate-limit) 에도 HTTP 200 을 반환하며 JSON body 에 errcode 가 들어 있습니다. sender 는 모든 2xx 를 성공으로 취급하고 non-2xx HTTP 상태 코드만 표면화합니다. 봇이 조용히 전달을 멈추면 매니저 로그에서 dingtalk: send_text: code=… 를 확인하세요 — Feishu 와 DingTalk 은 "200 OK + body 의 errcode" 패턴을 공유합니다.
DingTalk 메시지 rate-limit
DingTalk 은 커스텀 봇 메시지를 봇당 분당 20 으로 제한합니다. 알림 파이프라인의 댐핑 (dedupe 키당 기본 5 분) 은 대개 이 아래에 있지만, 고-카디널리티 클러스터는 더 높은 댐핑 윈도우 또는 규칙별 채널 라우팅이 필요할 수 있습니다.
Feishu 와의 비교
| Aspect | DingTalk | Feishu |
|---|---|---|
| 서명 쿼리 / body | URL 쿼리 (timestamp, sign) | Body 필드 (timestamp, sign) |
| Timestamp 단위 | 밀리초 | 초 |
| 서명 키 | secret | timestamp + "\n" + secret |
| HMAC 알고리즘 | SHA-256 | SHA-256 |
| 빈 body 서명 | 아니오 (sign 은 stringToSign 위) | 예 (HMAC 메시지는 비어 있음) |
표면적으로 비슷한 두 프로토콜, 세 가지 실제 차이. 정확히 이 이유로 별도 Sender 에 존재합니다.