본 포스팅은 2023년 01월 01일을 기준으로 작성되었습니다.
Elasticsearch에서 빈도, 조건, 작업 등을 설정하여 특정 조건이 trigger되면 작업이 수행되도록 하는 시스템입니다. Kibana UI를 활용하면 임계값을 설정하여, 더 advanced한 watcher를 설정 가능합니다.
schedule(trigger): 쿼리 실행과 조건 체크하기 위한 일정
query(input): 쿼리를 작성하여 조건 입력
condition: 작업 실행 여부 결정 조건
actions: 이메일 전송같은 다른 시스템으로 푸시하기 위한 수행할 작업
모든 watcher 기록은 elasticsearch 인덱스에 기록됩니다.
Watcher는 Elasticserch 기반으로 elasticsearch 내부에서 실행됩니다.(Kibana UI로도 설정 가능) 반면, Alerts는 Elasticsearch와 분리된 Kibana 고유의 기능입니다.
두 기능 모두 상태를 감지하고 대응 조치를 실행하는 식으로 작동하지만 완전히 독립적인 시스템입니다.
예약 검사는 Elasticsearch가 아닌 Kibana에서 실행
Alerts는 전체 규칙이 아니라, 감지된 조건이 발생할 때마다 Alerts 실행
Watcher보다 Alerts이 낫다(?)
Alerts가 Watcher보다 나중에 생긴 기능이라 더 많은 최신의 기능을 가지고 있습니다. 그렇기에 Alerts가 더 유용하다고 볼 수도 있겠으나, Watcher만의 (리포트 전송 같은) 고유 기능이 있어 Alerts와는 사용 용도가 구분된다고 볼 수 있습니다.
Step1. Elastic Cloud를 사용하고 있다면, https://cloud.elastic.co/deployments로 로그인하여 설정을 변경할 deployment를 선택합니다. (아니면 패스)
Step2. 왼쪽 메뉴바에서 Security를 클릭하여 Sercurity 페이지로 이동 합니다. 그리고 Elasticsearch Keystore란의 Add settings 버튼을 클릭합니다.
Step3. Setting name란에 xpack.notification.slack.account.monitoring.secure_url를 입력하고, Secret란에는 Slack에서 복사해온 웹후크URL를 붙여넣습니다.
Setting을 완료하게 되면 아래와 같이 Security keys란에 추가된 것을 확인할 수 있습니다.
Step4. Kibana의 Dev tools로 이동하여 아래 명령어를 실행 해줍니다. Watcher Slack alert 세팅 완료!
POST _nodes/reload_secure_settings
Step1. Slack에서 왼쪽 메뉴바에의 앱 버튼을 클릭합니다. (앱 버튼이 바로 보이지 않는다면 사진2와 같이 "Slack 찾아보기"를 클릭하면 찾을 수 있습니다.)
Step2. 검색창에 "webhook"을 검색하여 "Incoming WebHooks" 추가를 클릭하면 브라우저가 열릴 것입니다.
Step3. "Slack에 추가" 버튼을 클릭합니다.
Step4. 수신 받을 채널을 선택 (또는 생성)하고, "수신 웹후크 통합 앱 추가"를 클릭합니다.
Step5. "웹후크 URL"를 복사한 후 "설정 저장"을 클릭합니다.
Step1. Watcher에서 Create를 클릭하면 두 가지 옵션이 나옵니다. "Create threshold alert"를 클릭합니다.
Create threshold alert: 시각화가 잘 되어 있어 간단하게 설정가능
Create advanced watch: 디테일한 설정이 가능한 watcher설정 가능
Step2. 각 항목을 채워줍니다.
Name: Watcher 이름
Indices to query: 쿼리를 실행할 인덱스 (또는 인덱스 패턴)
Time field: 타임필드 선택(@timestamp)
Run watch every: 알림 받을 주기
Step3. 인덱스와 Time Field를 선택하고 나면 아래와 같이 Match the following condition란이 나타납니다. 원하는 쿼리를 만들어 봅시다. (좀 더 디테일한 쿼리를 설정하고 싶다면, Create advanced watch로 만들어야 합니다.)
Step4. 원하는 쿼리를 설정했다면, 이제 알림을 설정 할 차례입니다. 오른쪽 하단에 Add action을 열어 Slack을 선택합니다.
Step5. Send a sample message를 클릭하여 Slack으로 메시지가 잘 오는지 우선 확인해봅시다. Message란에 원하는 멘트를 적고 Create alert를 클릭해줍니다.
✔ 알쓸엘TIP!
{{ctx}}를 샘플메시지로 전송하면 데이터 구조를 볼 수 있습니다. (아래 이미지 참고) 예로 들면, {{ctx.metadata.name}}를 입력하면 "Today report alert"을 불러 올수 있고, {{ctx.payload.result}}를 입력하면 쿼리의 결과인 "4280"값을 받을 수 있습니다. (배열 일 경우, 배열이 통채로 불러와집니다.)Step1. 먼저 Create threshold alert 에서 대략적인 구조를 만든 후 Request code 를 복사해옵니다. Create threshold alert 에서 화면 오른쪽 하단의 "Show request" 버튼을 클릭하면 오른쪽에 Request code 팝업이 나타납니다.
해당 코드를 복사해옵니다.
Step2. 다시 Watcher 페이지에서 Create를 클릭하고 "Create advanced watch"를 클릭합니다.
코드란에 (기존에 있는 코드 삭제 후) 복사했던 Request code를 붙여 넣어줍니다.
그리고 PUT _watcher/watch 로 시작하는 행은 삭제한다.
여기까지는 Create threshold alert를 Create advanced watch로 똑같이 옮겨 만든 작업입니다. 이제 query문과 aggs 등을 적절히 수정하면 됩니다.
아래는 Slack으로 보내는 알림 메시지 수정을 간단하게 보여줍다.
},
"actions": {
"slack_1": {
"slack": {
"message": {
"from": "Elastic Watcher",
"attachments": [
{
"color": "#24BBB1",
"fields": [
{
"title": "{{ctx.metadata.name}}",
"value": """Timestamp: {{ctx.trigger.triggered_time}}
```{{ctx.payload.results}}```""",
"short": false
}
]
}
]
}
}
}
},
{
"trigger": {
"schedule": {
"interval": "10s"
}
},
"input": {
"none": {}
},
"condition": {
"always": {}
},
"actions": {
"send_email": {
"email": {
"profile": "standard",
"attachments": {
"weekly_report.png": {
"reporting": {
"url": "https://elastic***.cloud.com:9243/api/reporting/generate/pngV2?AV.......",
"auth": {
"basic": {
"username": "younabiya",
"password": "::es_redacted::"
}
}
}
},
"monthly_report.pdf": {
"reporting": {
"url": "https://elastic***.cloud.com:9243/api/reporting/generate/prinlayout......",
"retries": 40,
"interval": "15s",
"auth": {
"basic": {
"username": "younabiya",
"password": "::es_redacted::"
}
}
}
}
},
"to": [
"test@naver.com"
],
"subject": "Watcher Reporting",
"body": {
"html": "<img src='cid:weekly_report.png' style='width: 300px'>"
}
}
}
}
}