Telegraf와 연동하여 Scouter에서 NGINX를 모니터링 해보자

운영중인 서비스를 모니터링 할때, 어떤 문제의 원인을 발견하고 이를 해결하기 위해서는 인프라의 성능 메트릭 정보 뿐 아니라 어플리케이션의 메트릭도 함께 모니터링하는 것이 중요하다.
Scouter나 Scouter Paper를 통하면 어플리케이션의 요청 처리 상태와 인프라 소프트웨어의 성능 메트릭을 하나의 대시보드로 구성하여 모니터링하는 것이 가능한데, 이 글을 통해 Scouter의 Telegraf 확장 기능으로 nginx의 성능 정보를 모니터링하는 것을 구성 해보도록 한다.


그림. Scouter 구성


0. scouter collector (v2.6) 실행

  • 아래 Step들을 진행하기 전에 먼저 Scouter server v2.6+를 다운로드 받고 기동시킨다.
  • Collector 옵션에서 net_http_server 옵션을 true로 하고 기동하여야 한다. 이 설정이 없거나 true가 아닌 경우는 true로 설정하고 collector server를 재시작한다.

1. scouter client (v2.6) 실행

  • Scouter Client v2.6을 실행하여 collector에 접속한다.
  • Collector 메뉴 중 Collector > Configures > Telegraf Config > Telegraf Configure
그림. Telegraf Config 메뉴
  • 설정 화면이 열리면 scouter v2.6에서 샘플로 제공되는 Telegraf measurement 설정을 확인할 수 있다. (cpu, redis, nginx 등)
  • 트리메뉴의 General에서 Enabled에 체크한다. 
  • 여기서 nginx 설정을 지우고 재구성 해본다.
    • 설정을 지우기 전에 Telegraf Config > Edit Telegraf config directly 메뉴를 선택하고, 여기에 보이는 xml의 내용을 복사하여 백업해 놓도록 한다.
    • 아래 그림에서 Measurement의 nginx를 선택한 후 Remove Measurement 버튼으로 삭제할 수 있다.
    • 변경된 내용의 저장은 우상단의 "플로피디스크" 아이콘을 클릭하여 수행할 수 있다.

2. Telegraf 설치 및 설정

brew update
brew install telegraf
  • Telegraf 기본 config 파일을 생성한다.
telegraf --input-filter nginx --output-filter http config > telegraf.conf
  • telegraf.conf 파일에서 아래와 같이 일부 내용을 수정한다.
    • interval은 실시간 데이터를 모니터링해야하는 scouter 특성에 맞도록 4초 정도로 조절한다.
    • output은 http로 설정하고 scouter의 telegraf server url로 설정한다.
    • global tag에 scouter_obj_type_prefix에 시스템명을 할당하여 준다.
      • 이 tag는 scouter-telegraf 설정에서 objType등의 이름을 정하기 위해 사용되어 진다.
      • 각 모니터링 대상 vm마다 telegraf를 설치하였다면 global tag로 설정하는 것이 좋지만 만약 telegraf 한대에서 여러대의 nginx의 성능 메트릭을 수집한다면 다른 방법을 사용하여야 한다. 이건 이후에 다시 설명한다.
[agent]
  ...
  interval = "4s"
  ...
  flush_interval = "4s"
  ...

[global_tags]
  scouter_obj_type_prefix = "SAMPLE_SYSTEM"
  ...

  [[outputs.http]]
    url = "http://127.0.0.1:6180/telegraf/metric"
    timeout = "5s"
    method = "POST"
    data_format = "influx"
  • telegraf.conf에서 nginx-status 페이지 경로를 지정하여 이를 수집하도록 설정한다.
    • nginx에 미리 status 설정을 하여야 한다. 
[[inputs.nginx]]
  # An array of Nginx stub_status URI to gather stats.
  urls = ["http://localhost/server_status"]

  • 이제 Telegraf를 실행하여 nginx-status 페이지 접속등에 에러가 발생하지 않는지를 확인한다.
telegraf -config ./telegraf.conf

3. Scouter-Telegraf 매핑 설정

이 내용을 진행하기 전에 전반적인 이해를 위해 scouter 공식 문서의 내용을 한번 읽어보는 것이 좋다.

3.1. Measurment 추가 및 General 설정

  • scouter의 telegraf 설정에서 measurement를 추가한다.
    • 여기서는 "nginx"라는 이름으로 추가한다.
  • General setting 에서는 크게 건드릴 것은 없다.
    • 설정 후 데이터 확인을 위해 "Debug Enabled"만 체크하여 활성화한다.

3.2 Object 설정

  • Object setting에서 Object Family, Object Type, Object Name 설정을 한다.
    • Famiily명은 "nginx"로 한다.
    • Object Type은 "nginx"로 한다.
    • ObjType prepend tags는 기본값인 "scouter_obj_type_prefix"를 그대로 나둔다.
      • 앞서 Telegraf 설정에서 이 값을 "SAMPLE_SYSTEM"으로 정하였으므로 Object Type은 "SAMPLE_SYSTEM_nginx"로 결정된다.
    • Object Name도 "nginx"로 한다.
    • ObjName append tags에는 "port"를 추가한다.
      • 이러면 object name은 "X$nginx_80" 으로 결정된다. (80을 사용하는 nginx의 경우.)

3.3 Counter 매핑 설정

Counter 매핑 설정을 하기 전에 Scouter로 어떤 요청가 들어오는지 확인해 보자. 앞서 Debug Enabled 설정을 하였으므로 Scouter collector의 nohup 로그 혹은 logs 디렉토리의 로그파일에서 이를 확인 할 수 있다.

20190120 16:59:50 [TG006] [line protocol received] nginx,host=GunMac.skbroadband,port=8079,scouter_obj_type_prefix=SAMPLE_SYSTEM,server=13.11.123.123 reading=0i,writing=3i,waiting=9i,active=12i,accepts=613987i,handled=613987i,requests=51139658i 1547971190000000000
#줄바꿈 해보면
#nginx,
#host=GunMac.skbroadband,port=8079
#,scouter_obj_type_prefix=SAMPLE_SYSTEM
#,server=13.11.123.123
# reading=0i,writing=3i,waiting=9i
#,active=12i
#,accepts=613987i
#,handled=613987i
#,requests=51139658i
여기서 몇가지 정보를 확인할 수 있는데 여기선 "active" 정보와 "requests" 값을 사용하여 초당 요청량 두가지만 모니터링 하도록 설정해본다.
  • Counter Mapping을 설정한다.
    • "active"의 counter명은 "nginx-active-conn"으로 한다.
    • "requests"는 초당 요청량을 알고 싶은 것이므로 DELTA counter로 설정한다.
      • counter명은 "nginx-req"로 한다.
    • unit은 "ea", totalizable은 "Y"로 설정한다.

이제 설정한 내용을 저장한다.
이렇게 설정 내용이 저장되고 Scouter로 Telegraf에서 수집된 데이터가 들어오면, Scouter는 이 설정 정보를 바탕으로 내용을 파싱하여 설정한 Family, Object Type등을 등록하고 요청된 성능 메트릭 정보와 함께 Scouter의 내부 저장소에 저장하게 된다.

정상적으로 저장이 되었다면 Scouter Client에서 해당되는 차트들을 추가하여 모니터링이 가능해진다.
  • 아래 그림에서 보듯이 "X$nginx_8079"라는 이름의 Object가 추가되었다.
  • Family는 "X$nginx"이고 Object Type은 "SAMPLE_SYSTEM_nginx" 임을 알 수 있다.
  • Collector의 컨텍스트 메뉴에는 설정한 Object Type인 SAMPLE_SYSTEM_nginx의 두가지 차트를 열 수 있는 메뉴가 생성되었다.
  • 아래 그림은 두개의 차트를 연 화면이다.
    • Totalizable을 Y로 설정하였으므로 Total 차트를 추가로 볼 수 있다.
      • 동일 Object Type의 object가 여러대라면 값을 합쳐서 보여주는 차트이다.
  • 혹은 Scouter Paper에서 확인 할 수도 있다.


3.4. counters.site.xml 확인

counters_site.xml은 scouter에서 제공하는 성능 counter 및 Family를 사용자 정의한 파일이다.
간혹 이 파일이 깨지는 경우가 있으므로 데이터 수집에 문제가 있다면 이 파일을 열어 위에서 설정한데로 Family나 Counter 이름이 제대로 정의되었는지 확인해 보자.
  • 메뉴 > Configures > Edit counters.site.xml

4. 여러대의 nginx 상태를 하나의 telegraf로 모니터링 하기

만약 모니터링 대상의 nginx에 모두 telegraf를 설치하여 관리하지 않고 한대의 Telegraf 수집기를 통해서 모니터링 하는 경우는 추가적인 설정이 필요하다.

이런 경우 모니터링 대상 nginx 들이 단일 시스템의 nginx가 아닐 수 있고 또한 telegraf에서 기본으로 전달하는 host tag도 해당 시스템 nginx의 hostname이 아닌 telegraf가 설치된 장비의 hostname을 나타낸다.  따라서 추가적인 설정이 필요하다.

4.1. 하나의 telegraf에서 여러대의 nginx 모니터링을 위한 telegraf 설정

  • 먼저 이전에 설정하였던 global tag에서 "scouter_obj_type_prefix"를 지운다. 다른 곳에 설정되어야 한다.
  • 각 모니터링 대상의 nginx에 대한 설정을 한다. 여기에 시스템명을 나타내기 위한 "scouter_obj_type_prefix" tag도 각각 설정한다.
[[inputs.nginx]]
  urls = ["http://order-api-1/nginx-status","http://order-api-1/nginx-status"]
  response_timeout = "5s"
  [inputs.nginx.tags]
    scouter_obj_type_prefix = "ORDER-API"

[[inputs.nginx]]
  urls = ["http://product-api-1/nginx-status","http://product-api-2/nginx-status"]
  response_timeout = "5s"
  [inputs.nginx.tags]
    scouter_obj_type_prefix = "PRODUCT-API"
  • 이 글의 3.3장에 기술된 telegraf lineprotocol의 내용을 보면 "host"외에 "server"라는 tag가 있다. 이 tag가 각 nginx의 hostname을 가리킨다. (host tag는 telegraf가 설치된 장비의 hostname이다.)
    • 이를 scouter mapping 설정에 반영하여 준다.

이제 모든 설정이 완료되었다. 저장하여 데이터를 확인해보자.

5. nginx외에 redis, mysql 등에 대한 설정도 추가해보자.

 여기까지 nginx 모니터링을 위한 telegraf 및 scouter 연동 설정을 해 보았다.
 이를 잘 활용하면 Scouter를 통해서 어플리케이션과 다양한 인프라 소프트웨어의 성능 메트릭을 통합하여 모니터링 할 수 있게 된다.

 Telegraf는 이 외에도 아주 다양한 소프트웨어에 대한 성능 메트릭 수집을 지원하므로 운영하는 시스템에 포함된 여러 소프트웨어를 모니터링 해보도록 하자.
 - Telegraf Input 목록 : https://github.com/influxdata/telegraf/tree/master/plugins/inputs

 설정이 어렵다면 Scouter에 포함된 redis 및 mysql에 대한 설정 샘플을 참고한다.









댓글

댓글 쓰기

이 블로그의 인기 게시물

Scouter APM 소소한 시리즈 #1 - 설치하기

Scouter APM 소소한 시리즈 #4 - XLog 활용 - 상세기능

Java의 동시성 개선을 위한 Project Loom은 reactive streams를 대체할 것인가?