본문 바로가기
ELK/logstash

모니터링

by 킹차니 2023. 7. 3.

로그스태시에서 모니터링을 하는 방법에는 두가지가 있음

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