로그스태시에서 모니터링을 하는 방법에는 두가지가 있음
1. 로그스태시가 제공하는 API를 활용하여 특정 시점의 통계 정보를 얻는 방법
2. 모니터링 기능을 활성화하여 지속적인 통계 정보를 수집하고, 키바나를 통해 대시보드 형태로 연속적인 모니터링을 수행하는 방법
하나씩 해보자.
1. API를 활용하는 방법
로그스태시 정보 가져오기
curl -XGET "localhost:9600?pretty"
결과는 아래와 같다.
{
"host" : "ichan-yeong-ui-MacBookPro.local",
"version" : "8.8.1",
"http_address" : "127.0.0.1:9600",
"id" : "e878ac8b-e9ce-4ad3-b266-90a14946f49f",
"name" : "ichan-yeong-ui-MacBookPro.local",
"ephemeral_id" : "24bd06c9-75cf-4bd6-b8ce-570451211236",
"status" : "green",
"snapshot" : false,
"pipeline" : {
"workers" : 8,
"batch_size" : 125,
"batch_delay" : 50
},
"build_date" : "2023-06-02T17:43:25+00:00",
"build_sha" : "f1a41e558cd915ac9d2f91dc3fdd2865cec3343d",
"build_snapshot" : false
}
좀더 세부적인 API는 아래 표와 같다.
정보 | 사용법 | 설명 |
노드 | curl -XGET 'localhost:9600/_node?pretty' | 크게 파이프라인, OS, JVM 정보 제공 |
플러그인 | curl -XGET 'localhost:9600/_node/plugins?pretty' | 로그스태시에서 사용하는 플러그인 정보 제공 |
노드 통계 | curl -XGET 'localhost:9600/_node/stats?pretty' | 파이프라인, 이벤트, 프로세스 등의 로그스태시 통계 정보 제공 |
핫 스레드 | curl -XGET 'localhost:9600/_node/hot_threads?pretty' | CPU 사용량이 많은 스레드를 높은 순으로 보여준다. |
또한 좀더 세부적으로 노드 통계 정보를 알 수 있는 API가 있다.
타입 | API | 설명 |
jvm | curl -XGET 'localhost:9600/_node/stats/jvm?pretty' | 스레드, 메모리 사용량, GC 등 자바 가상 머신의 사용 통계 |
process | curl -XGET 'localhost:9600/_node/stats/process?pretty' | 사욪 중인 파일 디스크립터 수, 즉 열어둔 파일수와 메모리, CPU 사용량 등 프로세스의 사용통계 |
events | curl -XGET 'localhost:9600/_node/stats/events?pretty' | 파이프라인별이 아닌, 실행중인 로그스태시에 인입된, 필터링된, 출력된 총 이벤트의 수와 이를 처리하기 위해 소요된 시간 등의 통계 |
pipelines | curl -XGET 'localhost:9600/_node/stats/pipelines?pretty' | 파이프라인과 그 하위에 구성된 플러그인별 이벤트 통계 |
reloads | curl -XGET 'localhost:9600/_node/stats/reloads?pretty' | 로그스태시에서 자동/수동으로 설정을 리로드 했을 때, 성공/실패 수 통계 |
os | curl -XGET 'localhost:9600/_node/stats/os?pretty' | 로그스태시가 도커와 같은 컨테이너에서 실행될 때 cgroup에 대한 통계 |
특히 파이프라인 구성요소 둥 어떤 구간에서 병목이 있는지를 알아볼때 유용하게 사용될 수 있는 pipelines 녿 통계 정보 API를 실행시켜보면 결과는 다음과 같다.
{
"host" : "ichan-yeong-ui-MacBookPro.local",
"version" : "8.8.1",
"http_address" : "127.0.0.1:9600",
"id" : "e878ac8b-e9ce-4ad3-b266-90a14946f49f",
"name" : "ichan-yeong-ui-MacBookPro.local",
"ephemeral_id" : "24bd06c9-75cf-4bd6-b8ce-570451211236",
"status" : "green",
"snapshot" : false,
"pipeline" : {
"workers" : 8,
"batch_size" : 125,
"batch_delay" : 50
},
"pipelines" : {
"mypipe1" : {
"events" : {
"queue_push_duration_in_millis" : 0,
"in" : 2,
"duration_in_millis" : 129,
"out" : 2,
"filtered" : 2
},
"flow" : {
"filter_throughput" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.001372
},
"queue_backpressure" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.0
},
"input_throughput" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.001372
},
"output_throughput" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.001372
},
"worker_concurrency" : {
"current" : 7.999E-5,
"last_1_minute" : 6.395E-5,
"last_5_minutes" : 5.615E-5,
"last_15_minutes" : 5.535E-5,
"lifetime" : 8.85E-5
}
},
"plugins" : {
"inputs" : [ {
"id" : "01c50a4afd5e038df6766a08437e9653fccc6523d867f34370823037bfd458e6",
"name" : "file",
"events" : {
"queue_push_duration_in_millis" : 0,
"out" : 2
},
"flow" : {
"throughput" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.001372
}
}
} ],
"codecs" : [ {
"id" : "rubydebug_bc5ed32d-c129-4d1c-8426-048dd064956b",
"name" : "rubydebug",
"decode" : {
"duration_in_millis" : 0,
"out" : 0,
"writes_in" : 0
},
"encode" : {
"duration_in_millis" : 30,
"writes_in" : 2
}
}, {
"id" : "plain_bc9a50bf-9486-4646-b83f-da3c3947e6f6",
"name" : "plain",
"decode" : {
"duration_in_millis" : 0,
"out" : 0,
"writes_in" : 0
},
"encode" : {
"duration_in_millis" : 0,
"writes_in" : 0
}
} ],
"filters" : [ ],
"outputs" : [ {
"id" : "1f8e51bedf05645c517ac16cb5f2132cdc570e41345b1eec98f1c9ff676f88ef",
"name" : "stdout",
"events" : {
"in" : 2,
"duration_in_millis" : 115,
"out" : 2
},
"flow" : {
"worker_utilization" : {
"current" : 0.0,
"last_1_minute" : 5.995E-4,
"last_5_minutes" : 6.193E-4,
"last_15_minutes" : 5.95E-4,
"lifetime" : 9.862E-4
},
"worker_millis_per_event" : {
"last_1_minute" : "Infinity",
"last_5_minutes" : "Infinity",
"last_15_minutes" : "Infinity",
"lifetime" : 57.5
}
}
} ]
},
"reloads" : {
"successes" : 0,
"last_success_timestamp" : null,
"last_failure_timestamp" : null,
"failures" : 0,
"last_error" : null
},
"queue" : {
"type" : "memory",
"events_count" : 0,
"queue_size_in_bytes" : 0,
"max_queue_size_in_bytes" : 0
},
"hash" : "7e3944f0707634c2a05413a634c918d347f9e5821a7df2231e4f58a6ca71c48f",
"ephemeral_id" : "61746289-88f4-4689-933f-edf2f5b7c2f3"
},
"mypipe2" : {
"events" : {
"queue_push_duration_in_millis" : 0,
"in" : 0,
"duration_in_millis" : 52,
"out" : 0,
"filtered" : 0
},
"flow" : {
"filter_throughput" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.0
},
"queue_backpressure" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.0
},
"input_throughput" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.0
},
"output_throughput" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.0
},
"worker_concurrency" : {
"current" : 7.998E-5,
"last_1_minute" : 3.197E-5,
"last_5_minutes" : 3.303E-5,
"last_15_minutes" : 3.21E-5,
"lifetime" : 3.567E-5
}
},
"plugins" : {
"inputs" : [ {
"id" : "ea5ffa673cde7a85475a28294051b249a63689fcd81727ce4e99fd16b9c8b2a2",
"name" : "file",
"events" : {
"queue_push_duration_in_millis" : 0,
"out" : 0
},
"flow" : {
"throughput" : {
"current" : 0.0,
"last_1_minute" : 0.0,
"last_5_minutes" : 0.0,
"last_15_minutes" : 0.0,
"lifetime" : 0.0
}
}
} ],
"codecs" : [ {
"id" : "plain_f26dfc41-8ec1-460f-a678-e6d673e72a39",
"name" : "plain",
"decode" : {
"duration_in_millis" : 0,
"out" : 0,
"writes_in" : 0
},
"encode" : {
"duration_in_millis" : 0,
"writes_in" : 0
}
}, {
"id" : "plain_aaaddb74-8e5b-43a9-80e3-8b215d90b5b8",
"name" : "plain",
"decode" : {
"duration_in_millis" : 0,
"out" : 0,
"writes_in" : 0
},
"encode" : {
"duration_in_millis" : 0,
"writes_in" : 0
}
} ],
"filters" : [ ],
"outputs" : [ {
"id" : "4bd46428271da9fe66d7d6d7c3207db87bafaa7de29ec713a97ee99c6350050a",
"name" : "elasticsearch",
"events" : {
"in" : 0,
"duration_in_millis" : 36,
"out" : 0
},
"flow" : {
"worker_utilization" : {
"current" : 0.0,
"last_1_minute" : 1.998E-4,
"last_5_minutes" : 2.89E-4,
"last_15_minutes" : 2.906E-4,
"lifetime" : 3.087E-4
},
"worker_millis_per_event" : {
"last_1_minute" : "Infinity",
"last_5_minutes" : "Infinity",
"last_15_minutes" : "Infinity",
"lifetime" : "Infinity"
}
}
} ]
},
"reloads" : {
"successes" : 0,
"last_success_timestamp" : null,
"last_failure_timestamp" : null,
"failures" : 0,
"last_error" : null
},
"queue" : {
"type" : "memory",
"events_count" : 0,
"queue_size_in_bytes" : 0,
"max_queue_size_in_bytes" : 0
},
"hash" : "fd9f1bc5364ab5ac9c42bd52f910943f7e723ea1a41dc1605f2f3af68c72f380",
"ephemeral_id" : "5002c18c-9b91-4732-8a4f-53b951a3b0b8"
}
}
}
2. 모니터링 기능 활성화
모니터링 기능을 활성화하면 로그스태시 통계 데이터를 엘라스틱 서치에 전송하고, 키바나 GUI를 이용해 모니터링 정보를 연속적으로 파악할 수 있다.
로그스태시 config 폴더의 logstash.yml 파일을 아래와 같이 수정하면 된다.
xpack.monitoring.enabled를 true로 바꾸고
엘라스틱 서치의 주소를 현재 실해중인 엘라스틱서치의 주소로 변경해준다.
로그스태시를 다시 실행해보자.
로그스태시를 실행하면 아래와 같이 모니터링 관련 로그가 보인다.
[2023-07-03T00:08:38,442][WARN ][logstash.javapipeline ][.monitoring-logstash] 'pipeline.ordered' is enabled and is likely less efficient, consider disabling if preserving event order is not necessary
'ELK > logstash' 카테고리의 다른 글
ELK - Logstash 1 : 로그스태시 output (0) | 2023.06.28 |
---|---|
ELK - Logstash 1 : 로그스태시 filter (0) | 2023.06.22 |
ELK - Logstash 1 : 로그스태시란 (0) | 2023.06.21 |