Datadog의 Workflow automation 을 이용한 자동화를 소개합니다.
Datadog로 monitoring 하면서 수집된 data 혹은 발생한 event를 workflow에 활용할 수 있습니다.
이번 예시는 Disk를 monitoring 하면서 Disk에 사용량이 많아 file을 삭제 해야 하는 경우,
주로 삭제하는 directory를 기준으로 삭제 file을 선별하고, file 삭제에 대한 승인 요청 및 실행자에게 삭제 파일 전달 등을
진행하는 Sample을 함께 확인하고자 합니다.
Workflow 생성 전 준비되어야 할 사항
1. 주로 파일을 삭제할 폴더를 모니터링 할 준비를 합니다.
폴더내의 file 목록과 file의 size를 확인 가능합니다.
- 참고 Datadog docs : Directory Integration
2. Disk 사용량을 감시하는 Monitor를 생성합니다. SK C&C를 통해 생성한 ORG에는 기본적으로
[경고] {{host.name}} 서버의 {{device_name.name}} Disk 사용량이 높습니다.
Monitor가 생성되어있습니다. 해당 monitor를 이용하시거나, clone 하여 사용하시면 됩니다.
없는 경우, system.disk.used 및 system.disk.total을 이용해 사용량을 감지하는 Monitor를 생성하시기 바랍니다.
3. Message를 전달할 Slack integration 및 채널 추가가 완료되어있어야 합니다.
Workflow 생성 및 설정
1. Datadog Console에서 Actions > Workflow Automation 메뉴에서 New Workflow를 클릭해 신규 Work flow를 생성합니다.
work flow 명칭 부분을 클릭해 수정할 수 있습니다.
2. Work flow가 실행될 Trigger를 선택합니다.
(Trigger 상세 설명 Docs : Trigger a workflow )
- 이번 Workflow는 monitor가 발생시 trigger 되도록 할 예정이므로 Monitor를 선택합니다.
3. Monitor에서 호출할 handle 명을 지정 합니다.
해당 handle 명은 Monitor 설정시 아래와 같이 Configure notifications & automations 에 설정해 monitor 에서 알람 event 발생시 workflow를 호출하게 됩니다.
혹은 @ Add mention을 클릭해 추가하거나, Trigger workflow 부분에 Add workflow를 클릭해 추가할 수도 있습니다.
4. workflow 를 구성을 미리 생각 해 본 뒤, 그게 맞는 Action을 배치 및 설정 합니다.
1) 이번에 구성해 볼 workflow는 아래와 같은 구성으로 진행 됩니다.
글로 미리 작성해 보거나, 구성도를 그려 미리 구성해 보는것도 좋은 방법입니다.
- Disk 사용율이 95% 이상인 경우 알람이 발생하면 work flow가 trigger되고,
- Trigger된 Monitor에서 tag(host 및 device) 정보들을 추출합니다.
- directory metric 에서 데이터를 가져올 query를 작성합니다.
(삭제 대상 파일이 있는 폴더의 용량이 큰 순서대로의 파일 중 5개정도 추출합니다. ) - directory metric 을 통해 데이터 수집이 된 경우, 그중 특정 로직을 추가해 실제 삭제할 파일을 추출합니다.
- 삭제할 파일 목록을 slack으로 승인 받습니다.
- 승인 받은 경우, 작업자에게 slack으로 삭제할 파일 목록을 전송합니다.
2) 구성을 생각했다면 맞는 action을 찾아 배치합니다.
- 구성 하기전 Trigger 및 Action이 실행된 후 생성된 데이터에 대해 활용하는 부분을 안내 드리습니다.
이 설명은 실제 Action 구성시 캡쳐와 함께 상세하게 다시 안내 되오니, 참고해주시면 됩니다.- Monitor로 인해 workflow가 추출되면 Monitor 및 Alert에 대한 데이터가 함께 전달 됩니다.
들어온 데이터에서 그대로 json 형태로 사용하고자 하는경우, {{ }} 를 사용하면 이전 블럭에서 생성된 데이터를
가져다 쓸수 있습니다. - Trigger 선택 후 우측의 상세 화면에서 Source를 클릭하면 trigger 되었을때 monitor에서 전달되는 대략적인 json 구조를 확인할 수 있습니다. 해당 구조에서 사용할 tag 및 value가 있는 경우, 마우스오버하면 아래와 같이
variable path를 복사할 수 있는 아이콘이 표시됩니다. 해당 icon을 클릭해 복사 후
해당 데이터를 사용할 곳에 {{복사된 path}} 이렇게 사용합니다. (필요한 곳에서 {{ 를 입력시 path를 선택 할 수 도 있습니다.) - 데이터를 그대로 사용하지 않고 데이터를 변형, 수정 해야하는 경우, Javascript Action을 사용해 보정처리하거나, 간단한 보정의 경우, ${보정할 로직 추가} 로 해서 데이터 javascript로 수정 변경해 바로 적용할 수 있습니다.
- Monitor로 인해 workflow가 추출되면 Monitor 및 Alert에 대한 데이터가 함께 전달 됩니다.
- 4-1)에서 설명한 구성을 Action으로 구성했을 때 아래와 같이 구성되었습니다.
상세한 설명은 Action 별로 진행하도록 하겠습니다.- Trigger에서 전달된 Monitor Alert 정보에서 알람이 발생된 대상의 tag 정보를 추출합니다.
다음 Action에서 metric 정보를 추출할 query가 필요하므로 추출한 tag정보를 이용해 query를 만듭니다.
데이터를 가져와 query를 만들어야 하므로 JS Function Action을 사용합니다.
다음 Action에서 monitor에서 가져오는 값으로 바로 query를 작성하고자하면
해당 Action은 굳이 사용하지 않아도 됩니다. 다음Action에서 상세히 설명드리겠습니다.
* javascript로 로직 구성이 어려운 경우, Script 작성창 위 Write code with AI 기능을 사용하면
AI의 도움을 받아 로직 구성을 할 수 있습니다. - JS Function에서 만든 query로 Datadog Get timeseries point Action을 통해 directory 모니터링 정보를 가져옵니다. directory 모니터링은 Datadog agent에서 conf.d/directory.d 폴더내 conf.yaml 로 설정 가능합니다.
directory 모니터링을 하게되면 설정한 폴더내 파일갯수 및 파일 size , 생성 및 수정 이후의 기간등을 확인할 수 있습니다. 해당 데이터를 가져오면, size 별로, 생성 및 수정된 후 기간별로 어떤 파일을 삭제할지 판단하는 기준을 정해 삭제 대상 파일을 지정하는데 도움이 됩니다.
이전 Action인 JS Function(Get Query)에서 만든 쿼리를 가져오려면 위와 같이 {{ Steps.Get_Query.data.query }} 을 입력하고 JS Function 을 사용하지 않고 바로 Trigger에서 Get timeseries point를 사용하려면 Query 란에
top(avg:system.disk.directory.file.bytes{host: {{ Source.monitor.event.host }}, dirfilename:{{ Source.monitor.event.tag_value.device_name }}*} by {dirfilename,host}.rollup(max, 3600), 5, 'max', 'desc')
을 입력합니다.(해당 쿼리는 파일 사이즈 큰 순서대로 5개의 파일정보를 가져옵니다.- Query는 Datadog console에서 Metric Explorer에서 작성 후 복사해 오거나 dashboard 등에서 작성된 query를 복사해 오면 됩니다.
Query에서 </>표시를 클릭하면 문자열화된 query를 복사할 수 있으며,
이후 동일한 자리의 icon을 클릭하면 다시 블럭화된 query로 변경됩니다. - from 절에 조건을 입력시 tag:value 사이에 Space(빈칸)이 없어야합니다.
- 생성된지 오래된 순서로 파일정보를 가져오려면 Query는 아래와 같이 작성합니다 .
top(avg:system.disk.directory.file.created_sec_ago{host: {{ Source.monitor.event.host }}, dirfilename:{{ Source.monitor.event.tag_value.device_name }}*} by {dirfilename,host}.rollup(max, 3600), 5, 'max', 'desc') - 해당 Action은 Datadog의 API 중 Query timeseries points와 동일한 동작을 하는 Action입니다.
- Query는 Datadog console에서 Metric Explorer에서 작성 후 복사해 오거나 dashboard 등에서 작성된 query를 복사해 오면 됩니다.
- 쿼리를 가져왔으면 데이터가 왔는지 확인 후 데이터가 있는 경우와 없는 경우에 맞춰 분기처리를 하기위해
If Condition Action을 사용합니다.- 이전 Step인 Get timeseries point에서 실제로 사용할 정보는 series 항목 에 있습니다.
해당 항목에 데이터 size가 있는지 확인 합니다.
series는 배열로 오며, length를 확인하면 전달된 데이터가 있는지 확인 가능합니다 .
- 이전 Step인 Get timeseries point에서 실제로 사용할 정보는 series 항목 에 있습니다.
- 데이터가 있는 경우, JS Function을 이용해 Get timeseries point에서series 정보를 가져와 Slack으로 보낼파일 목록을 작성합니다.
해당 코드는 Sample 이며, Slack으로 전달할 내용을 로직을 이용해 미리 구성할수도 있습니다. - 삭제 할 파일 목록이 작성되었으면, Slack을 통해 해당 작업을 진행에 대한 승인 요청 합니다.
Slack의 Make a decision Action을 이용합니다.
- Workspace는 미리 Datadog console > Integration > Slack 에서 integration이 되어있어야 목록에 표시됩니다. Channel 도 Workspace 연결뒤 채널이 추가되어있어야 선택이 가능합니다.
- message에서는 {{ Steps.Get_delete_file_list.data}} 로 한번에 출력도 가능합니다.
- Slack message 작성시 글자 효과는 하단에 직접 선택해 사용가능합니다.
- Buttion 의 icon과 Slack message내에 icon을 추가 및 수정하고자 하는 경우 slakc의 :아이콘명: 방식으로입력하시면 실제 message전달시 slack내의 icon으로 변경되 전달됩니다.
- 위 message로 전송시 아래와 같이 message가 전달됩니다. (Reject icon을 :x: 를 이용해 변경했습니다.)
- If Condition에서 데이터가 없는 경우, 승인요청이 승인된 경우, 승인요청이 반려된 경우, 각각 운영자, 승인관리자에게 전달할 message를 작성해 경우에 맞게 배치합니다.
Slack에 Send message Action을 이용합니다.
- Trigger에서 전달된 Monitor Alert 정보에서 알람이 발생된 대상의 tag 정보를 추출합니다.
이렇게 workflow를 생성하여, Monitor에 workflow를 add 해두시면 monitor 알람발생시 해당 workflow가 동작하게됩니다.
많이 사용할 만한 Action들을 사용하여 Sample workflow 구성하는 것을 안내 드렸습니다.
이외에도, AWS, Azure Resource를 제어(생성, 삭제, 시작, 중지, 재시작 등) 및 데이터 가져오기등 여러가지 Action이 준비되어있고, 대체로 선택, 입력 등만으로 구성이 가능하며, 간단한 로직등을 사용하면 더욱더 활용범위가 넓어집니다.
특히나 Datadog에서 로직등 구성에는 AI 도구를 지원함으로써 AI로 로직구성을 진행할 수 있어 더욱 편리하게 사용이 가능합니다.
여러가지 이용사례가 있을 수 있으나, 혹시 workflow 작성에 어려움을 겪으신다면
Support portal로 문의주시면 도움드릴 수 있도록 하겠습니다.