RECIPE 086
API 에러 자동 감지 → 개발팀 알림 + 티켓 생성
- ▸애플리케이션 에러 로그에서 임계값 초과 에러 자동 감지
- ▸Slack 개발팀 채널에 에러 상세 정보 즉시 알림
- ▸Jira/GitHub에 버그 티켓 자동 생성
✅사전 준비
- □에러 로그 소스 결정: Sentry 웹훅, CloudWatch, 또는 커스텀 로그 API
- □에러 심각도 분류 기준 정의 (critical/error/warning)
- □Slack #dev-alerts 채널 웹훅 URL
- □Jira 프로젝트 키 및 이슈 타입 ID 확인
Sentry 웹훅 수신 설정
// Sentry: Settings → Integrations → Webhooks
// 또는 Alert Rules → Actions → Send a notification via...
Node: Webhook
Path: /sentry-error
Method: POST
// 에러 심각도 필터 (IF 노드)
Condition: {{ $json.data.event.level }} == 'error'
또는: {{ $json.data.event.level }} == 'fatal'Slack 에러 알림 포맷
:rotating_light: *프로덕션 에러 감지*
심각도: {{ $json.data.event.level.toUpperCase() }}
에러: {{ $json.data.event.title }}
파일: {{ $json.data.event.culprit }}
발생 횟수: {{ $json.data.event.times_seen }}회
최초 발생: {{ $json.data.event.firstSeen }}
상세 링크: {{ $json.url }}
@dev-team 즉시 확인 바랍니다.Jira 버그 티켓 자동 생성
Node: HTTP Request
Method: POST
URL: https://YOUR_DOMAIN.atlassian.net/rest/api/3/issue
Authentication: Basic Auth
Body:
{
"fields": {
"project": { "key": "PROJ" },
"summary": "[자동생성] {{ $json.data.event.title }}",
"description": {
"type": "doc",
"version": 1,
"content": [{
"type": "paragraph",
"content": [{ "type": "text", "text": "Sentry 링크: {{ $json.url }}" }]
}]
},
"issuetype": { "name": "Bug" },
"priority": { "name": "{{ $json.data.event.level === 'fatal' ? 'Critical' : 'High' }}" }
}
}💡 TIP동일 에러가 5분 내 3번 이상 발생한 경우에만 티켓을 생성하도록 쿨다운 로직을 추가하면 중복 티켓 생성을 방지할 수 있습니다. Sheets나 Redis에 마지막 알림 시각을 저장하는 방식을 사용하세요.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"recipeId": "recipe086",
"title": "당근마켓 키워드 알림 자동화",
"chapter": 8,
"category": "국내 서비스 특화 레시피",
"difficulty": "⭐",
"estimatedTime": "20분",
"usedApps": [
"HTTP Request (당근마켓 RSS/API)",
"Slack"
],
"description": "1시간마다 당근마켓 검색 결과를 자동 수집해, 내가 원하는 키워드의 새 게시물이 올라오면 Slack에 제목·가격·링크를 즉시 알려줍니다. 특정 물건이나 지역·카테고리 매물을 모니터링할 때 유용합니다.",
"nodes": [
{
"id": "node1",
"type": "n8n-nodes-base.scheduleTrigger",
"name": "1시간마다 실행",
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 * * * *"
}
]
}
}
},
{
"id": "node2",
"type": "n8n-nodes-base.httpRequest",
"name": "당근마켓 검색 결과 수집",
"parameters": {
"method": "GET",
"url": "https://www.daangn.com/search/{{$env.DAANGN_KEYWORD}}",
"headers": {
"User-Agent": "Mozilla/5.0"
}
}
},
{
"id": "node3",
"type": "n8n-nodes-base.htmlExtract",
"name": "게시물 정보 추출",
"parameters": {
"extractionValues": {
"values": [
{
"key": "title",
"cssSelector": ".article-title",
"returnValue": "text"
},
{
"key": "price",
"cssSelector": ".article-price",
"returnValue": "text"
},
{
"key": "link",
"cssSelector": "a.article-card",
"returnValue": "href"
}
]
}
}
},
{
"id": "node4",
"type": "n8n-nodes-base.if",
"name": "새 게시물 여부 확인",
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$json['link']}}",
"operation": "isNotEmpty"
}
]
}
}
},
{
"id": "node5",
"type": "n8n-nodes-base.slack",
"name": "새 게시물 Slack 알림",
"parameters": {
"channel": "={{$env.PERSONAL_SLACK_ID}}",
"text": "🥕 당근마켓 새 게시물!\n\n*{{$json['title']}}*\n가격: {{$json['price']}}\n🔗 {{$json['link']}}"
}
}
],
"envVariables": {
"DAANGN_KEYWORD": "모니터링할 검색 키워드 (URL 인코딩)",
"PERSONAL_SLACK_ID": "본인 Slack DM ID"
},
"tips": [
"당근마켓은 공식 API를 제공하지 않아 HTTP Request로 웹 페이지를 파싱하는 방식을 사용합니다. 사이트 구조 변경 시 CSS 셀렉터를 업데이트해야 할 수 있어요.",
"중복 알림을 방지하려면 처리된 게시물 링크 목록을 Google Sheets에 저장하고 IF 노드에서 비교하세요.",
"지역을 필터링하려면 URL에 지역 파라미터를 추가하거나 HTML 파싱 단계에서 지역 정보를 추출해 IF 노드로 필터링하세요."
],
"qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe086"
}