안녕하세요
watcher 기능 관련하여 문의사항이 있습니다.
{
"trigger": {
"schedule": {
"interval": "10s"
}
},
"input": {
"search": {
"request": {
"search_type": "query_then_fetch",
"indices": [
"metricbeat-*"
],
"rest_total_hits_as_int": true,
"body": {
"size": 100,
"query": {
"bool": {
"must": ,
"filter": [
{
"match_all": {}
},
{
"match_phrase": {
"event.module": "sql"
}
},
{
"bool": {
"should": [
{
"match_phrase": {
"sql.query": "select name from sys.databases as d where name not in('tempdb','model', 'msdb','master') and name not in (select distinct database_name from msdb.dbo.backupset as b WHERE backup_start_date >= DATEADD(hh, -24, GETDATE()) AND backup_start_date < GETDATE() AND Type = 'D' AND d.name = b.database_name)"
}
},
{
"match_phrase": {
"sql.query": "select name from sys.databases as d where name not in('tempdb','model', 'msdb','master','c_imvely','c_imvely_2112') and name not in (select distinct database_name from msdb.dbo.backupset as b WHERE backup_start_date >= DATEADD(hh, -24, GETDATE()) AND backup_start_date < GETDATE() AND Type = 'D' AND d.name = b.database_name)"
}
}
],
"minimum_should_match": 1
}
},
{
"range": {
"@timestamp": {
"gte": "{{ctx.trigger.scheduled_time}}||-15m",
"lte": "{{ctx.trigger.scheduled_time}}",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
],
"should": ,
"must_not":
}
},
"aggs": {
"bucketAgg": {
"terms": {
"field": "host.name",
"size": "40",
"order": {
"_key": "desc"
}
},
"aggs": {
"backupAgg": {
"cardinality": {
"field": "sql.metrics.string.name"
}
},
"bucketAgg1": {
"terms": {
"field": "sql.metrics.string.name",
"size": 100
}
}
}
}
}
}
}
}
},
"condition": {
"script": {
"source": "ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets; for (int i = 0; i < arr.length; i++) { if (arr[i]['backupAgg'].value != params.threshold) { return true; } } return false;",
"lang": "painless",
"params": {
"threshold": 0
}
}
},
"actions": {
"slack_1": {
"slack": {
"message": {
"text": "{{ctx.metadata.name}}",
"attachments": [
{
"text": """서버 : {{ctx.payload.results.0.key}} / 백업 누락 도메인: {{ctx.payload.results.0.value}}
서버 : {{ctx.payload.results.1.key}} / 백업 누락 도메인: {{ctx.payload.results.1.value}}
서버 : {{ctx.payload.results.2.key}} / 백업 누락 도메인: {{ctx.payload.results.2.value}}
"""
}
]
}
}
}
},
"transform": {
"script": {
"source": """HashMap result = new HashMap();
ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets;
ArrayList filteredHits = new ArrayList();
for (int i = 0; i < arr.length; i++) { HashMap filteredHit = new HashMap();
filteredHit.key = arr[i].key;
filteredHit.value = arr[i]['bucketAgg1']['buckets'][0].key + ', ' + ;
if (arr[i]['backupAgg'].value != params.threshold) {filteredHits.add(filteredHit);
} } result.results = filteredHits;
return result;""",
"lang": "painless",
"params": {
"threshold": 0
}
}
}
}
현재 위에 watcher 설정으로 아래와 같은 결과를 슬랙으로 연동하고 있습니다.
*알림 테스트
서버 : sell-db-55 / 백업 누락 도메인: c_lumissy,
서버 : sell-db-51 / 백업 누락 도메인: SMGlobal,
서버 : sell-db-16 / 백업 누락 도메인: c_havehad,
여기서 궁금한 것은
서버 당 백업 누락 도메인이 여러 개 나오고 있는 상황입니다.
실제로는 아래와 같이 백업 누락 도메인이 3개 값이 watcher-Execution history 에서 나옵니다.
"doc_count": 9,
"bucketAgg1": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"doc_count": 3,
"key": "c_havehad"
},
{
"doc_count": 3,
"key": "c_hellomedy"
},
{
"doc_count": 3,
"key": "c_intero"
}
]
},
"backupAgg": {
"value": 3
},
"key": "sell-db-16"
결국 최종적으로 하고 싶은 것은 아래와 같이 전부다 나오는 것 입니다.
서버 : sell-db-16 / 백업 누락 도메인: c_havehad, c_hellomedy, c_intero
제 생각에는 actions 부분 text에 값을 가져오는 것을 추가하거나,
transform 부분에 filteredHit.value = arr[i]['bucketAgg1']['buckets'][0].key + ', '; 이 부분에서 buckets 값을 더 추가해야 하지 않을까 생각되는데 방법을 잘 모르겠습니다.
value값을 추가하는 방법을 아시는 분 계시다면, 답변 부탁드립니다.
감사합니다.