본문으로 건너뛰기
  1. Posts/

InfluxData의 오픈소스 컴포넌트를 사용한 모니터링 시스템

·6 분· loading · loading ·
Rlee
Techtopic InfluxData Telegraf Jolokia2 Input Plugin Http Input Plugin
InnoFactory
작성자
InnoFactory
스마트팩토리, 산업자동화, Digital Transformation, 디지털팩토리, PLM, ALM, Digital Manufacturing, Visualization, 3D CAD, Digital Twin, Big Data, IIoT 솔루션 전문업체
작성자
Roa Lee
Developer of Innofactory

서버의 CPU, Memory, Disk 등과 같은 System Metric 정보 및 로그 수집을 통한 상태 확인 모니터링을 하기위해 InfluxData의 오픈소스 컴포넌트들인 TICK Stack 을 사용하여 검토해보았습니다.

TICK Stack은 각각 Telegraf, InfluxDB, Chronograf, Kapacitor 를 의미합니다.

이 중 수집에 사용한 Telegraf 는 설치가 매우 간편하고 다양한 종류의 수집/저장 플러그인을 간단한 설정으로 사용 가능한 플러그인 기반 서버 에이전트 입니다.

Go 언어로 작성되어 외부 종속성이 없는 단일 바이너리로 컴파일되며 메모리 사용 공간이 많이 필요하지 않고 데이터 수집 및 출력 모두 플러그인 기반이므로 쉽게 확장 가능합니다.

수집된 데이터를 저장하는 용도로 InfluxDB 를 사용하였고, 실시간 데이터 처리 및 알림 전송으로 Kapacitor 를 사용하였습니다.

모니터링 시스템 구성도
#

대략적인 모니터링 시스템 구성은 아래와 같이 구성한다고 가정하고 이 중 아래 박스 부분의 InfluxDB 에 수집된 데이터 확인까지만 검토하였습니다.

아래의 구성에서는 추가되는 서버마다 Telegraf 를 설치해야해서 번거롭지만, 수집 서버를 통해서 다른 서버에 접근할 수 없어서 보안상 안전하고 수집 서버에 부하가 집중되는 문제를 피할 수 있습니다.

수집 서버에 Telegraf 를 설치하는 구성은 수집 대상 서버가 추가되어도 간단히 설정만 추가하면 되지만, 수집 서버가 보안 위험에 노출되면 다른 서버들로 접속이 가능한 위험 및 수집 서버의 부하 집중 문제가 있습니다.

monitoring_architecture

환경 구성
#

실제 검토 환경 구성은 총 3개의 서버로 아래와 같고, 수집 대상은 Thingworx 가 설치된 서버의 System Metric 정보와 Kepware 가 설치된 서버의 이벤트 로그 입니다.

플러그인은 System Metric 정보는 Jolokia2 Input Plugin을 사용하고, Kepware 이벤트 로그는 Http Input Plugin 을 사용하였습니다.

Telegraf - Jolokia2 Input Plugin
#

System Metric 정보를 수집하기 위한 서버에 Telegraf 를 설치하고 Jolokia2 플러그인을 적용합니다.

Telegraf 설치 및 실행 (CentOS)
#

( https://portal.influxdata.com/downloads/)

install_telegraf

cat <<EOF | sudo tee /etc/yum.repos.d/influxdata.repo
[influxdata]
name = InfluxData Repository - Stable
baseurl = https://repos.influxdata.com/stable/\$basearch/main
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdata-archive_compat.key
EOF

sudo yum install telegraf
telegraf --config telegraf.conf

Jolokia2 Plugin - Webarchive (War) agent 다운로드 및 배포
#

Jolokia 는 에이전트, 클라이언트 라이브러리 형태로 제공되는데 해당 검토에서는 war 를 사용하였습니다.

Thingworx 설치시 배포한곳과 동일한 위치에 배포해주었습니다.

cd $CATALINA_HOME/webapps
wget https://repo1.maven.org/maven2/org/jolokia/jolokia-war/1.7.2/jolokia-war-1.7.2.war
mv jolokia-war-1.7.2.war jolokia.war
sudo chmod 775 $CATALINA_HOME/webapps/jolokia.war

tomcat-users.xml 파일을 수정합니다.

Tomcat 사용자 추가 (역할: jolokia)

<role rolename="jolokia"/>
<user username="monitoring" password="1" roles="jolokia"/>

Telegraf 설정
#

telegraf.conf 파일에 지원되는 모든 플러그인에 대한 설정이 전부 있으며 사용하려는 플러그인 부분을 찾아서 주석 처리 제거 후 원하는 설정을 적용해주면 됩니다.

- 수집 주기 설정
#
# Configuration for telegraf agent
[agent]
  ## Default data collection interval for all inputs
  interval = "10s“
- InfluxDB 설정
#

수집한 정보를 저장할 output 정보를 설정합니다.

# # Configuration for sending metrics to InfluxDB
[[outputs.influxdb]]
#   ## The full HTTP or UDP URL for your InfluxDB instance.
#   ##
#   ## Multiple URLs can be specified for a single cluster, only ONE of the
#   ## urls will be written to each interval. 
urls = ["hostname:port"]

#   ## The target database for metrics; will be created as needed.
#   ## For UDP url endpoint database needs to be configured on server side.
database = "telegraf"

#   ## Timeout for HTTP messages.
timeout = "30s"
#
#   ## HTTP Basic Auth
username = "admin"
password = "admin"
- Jolokia2 agent 설정
#

수집하고자하는 System Metric 정보들을 설정합니다.

# # Read JMX metrics from a Jolokia REST agent endpoint
[[inputs.jolokia2_agent]]
#   # Add agents URLs to query
urls = ["http://localhost:8080/jolokia"]
username = "monitoring"
password = "1"
response_timeout = "30s"
name_prefix = "tomcat."


### JVM Generic
[[inputs.jolokia2_agent.metric]]
name  = "OperatingSystem"
mbean = "java.lang:type=OperatingSystem"
paths = ["ProcessCpuLoad","SystemLoadAverage","SystemCpuLoad"]

[[inputs.jolokia2_agent.metric]]
name  = "jvm_runtime"
mbean = "java.lang:type=Runtime"
paths = ["Uptime"]

[[inputs.jolokia2_agent.metric]]
name  = "jvm_memory"
mbean = "java.lang:type=Memory"
paths = ["HeapMemoryUsage", "NonHeapMemoryUsage", "ObjectPendingFinalizationCount"]

[[inputs.jolokia2_agent.metric]]
name     = "jvm_garbage_collector"
mbean    = "java.lang:name=*,type=GarbageCollector"
paths    = ["CollectionTime", "CollectionCount"]
tag_keys = ["name"]

[[inputs.jolokia2_agent.metric]]
name       = "jvm_memory_pool"
mbean      = "java.lang:name=*,type=MemoryPool"
paths      = ["Usage", "PeakUsage", "CollectionUsage"]
tag_keys   = ["name"]
tag_prefix = "pool_"

### TOMCAT

[[inputs.jolokia2_agent.metric]]
name     = "GlobalRequestProcessor"
mbean    = "Catalina:name=*,type=GlobalRequestProcessor"
paths    = ["requestCount","bytesReceived","bytesSent","processingTime","errorCount"]
tag_keys = ["name"]

[[inputs.jolokia2_agent.metric]]
name     = "JspMonitor"
mbean    = "Catalina:J2EEApplication=*,J2EEServer=*,WebModule=*,name=jsp,type=JspMonitor"
paths    = ["jspReloadCount","jspCount","jspUnloadCount"]
tag_keys = ["J2EEApplication","J2EEServer","WebModule"]

[[inputs.jolokia2_agent.metric]]
name     = "ThreadPool"
mbean    = "Catalina:name=*,type=ThreadPool"
paths    = ["maxThreads","currentThreadCount","currentThreadsBusy"]
tag_keys = ["name"]

[[inputs.jolokia2_agent.metric]]
name     = "Servlet"
mbean    = "Catalina:J2EEApplication=*,J2EEServer=*,WebModule=*,j2eeType=Servlet,name=*"
paths    = ["processingTime","errorCount","requestCount"]
tag_keys = ["name","J2EEApplication","J2EEServer","WebModule"]

[[inputs.jolokia2_agent.metric]]
name     = "Cache"
mbean    = "Catalina:context=*,host=*,name=Cache,type=WebResourceRoot"
paths    = ["hitCount","lookupCount"]
tag_keys = ["context","host"]

Jolokia2 agent 에 관한 상세 내용은 https://github.com/influxdata/telegraf/blob/release-1.29/plugins/inputs/jolokia2_agent/README.md 를 참고할 수 있으며 다른 플러그인도 확인할 수 있습니다.

Telegraf - Http Input Plugin
#

Kepware 이벤트 로그를 수집하기 위한 서버에 Telegraf 를 설치하고 Http 플러그인을 적용합니다.

Rest API 호출 확인
#

Http Input Plugin 사용에 앞서 Kepware 이벤트 로그를 Rest API 호출로 확인해보았습니다.

Rest API 호출 확인을 위해 먼저 KEPServerEX 에서 API 사용 설정을 합니다.

사용 설정 후 Postman 에서 Rest API 호출을하여 Kepware 의 이벤트 로그를 확인합니다.

Telegraf 설치 및 실행 (Windows)
#

( https://portal.influxdata.com/downloads/)

Windows PowerShell

wget https://dl.influxdata.com/telegraf/releases/telegraf-1.27.3_windows_amd64.zip -UseBasicParsing -OutFile telegraf-1.27.3_windows_amd64.zip
Expand-Archive .\telegraf-1.27.3_windows_amd64.zip -DestinationPath ‘설치하려는 경로’
telegraf --config telegraf.conf

Telegraf 설정
#

위의 Jolokia2 설정 부분과 동일하게 telegraf.conf 파일에서 사용하려는 플러그인 설정을 찾아서 주석 처리 제거 후 원하는 설정을 적용합니다.

InfluxDB 설정(output)도 위의 Jolokia2 설정과 동일

- Http Input Plugin 설정
#

앞서 Postman 을 사용한 Rest API 호출에서 받은 결과 데이터(json)의 포맷을 확인 후 timestamp 설정을 제대로 해주지 않으면 데이터가 저장되지 않았습니다.

# # Read formatted metrics from one or more HTTP endpoints
[[inputs.http]]
name_override = "kepserverlogs“
interval = "30s“
#   ## One or more URLs from which to read formatted metrics
urls = [  "http://127.0.0.1:57412/config/v1/event_log"]
##   ## HTTP methodmethod = "GET“
##   ## Optional HTTP headers
headers = {"Content-Type" = "application/json"}

#   ## Optional HTTP Basic Auth Credentials
username = "Administrator“
password = "“


#   ## Amount of time allowed to complete the HTTP request
timeout = "30s“

#   ## Data format to consume.
#   ## Each data format has its own unique set of configuration options, read
data_format = "json“

#JSON values to set as string fields
json_string_fields = ["event", "source", "message"]
#Latest station information reported at `lastCommunicationTime`
json_time_key = "timestamp“
#Time is reported in Golang "reference time" format
json_time_format = "2006-01-02T15:04:05.000"

Http Input Plugin 에 관한 상세 내용은 https://github.com/influxdata/telegraf/blob/release-1.29/plugins/inputs/http/README.md 를 참고할 수 있으며 다른 플러그인도 확인할 수 있습니다.

InfluxDB - 수집된 데이터 확인
#

수집서버에서 InfluxDB에 수집된 데이터를 확인해보면 설정파일에 설정한 이름으로 각각의 measurement 에 저장되어 있는것을 확인할 수 있습니다.

몇개의 measurement 를 확인해보니 각 metric 별로 수집하고자 설정했던 값들이 컬럼별로 저장되어 수집되고 있는것을 확인하였습니다.

  • Jolokia2

  • Http

Kapacitor
#

Kapacitor는 InfluxDB 1.x 기본 데이터 처리 엔진으로 TICKscript 를 통해 데이터에 실시간으로 작용하여 경고 생성, 이상 징후 감지 등 다양한 데이터 처리가 가능합니다.

Kapacitor 설치/설정/실행
#

wget https://dl.influxdata.com/kapacitor/releases/kapacitor-1.6.6-1.x86_64.rpm
sudo yum localinstall kapacitor-1.6.6-1.x86_64.rpm
- kapacitor.conf 파일 생성 및 설정
#

kapacitord config > kapacitor.conf

기본 위치 (/etc/kapacitor/kapacitor.conf)

[[influxdb]]
  # Connect to an InfluxDB cluster
  # Kapacitor can subscribe, query and write to this cluster.
  # Using InfluxDB is not required and can be disabled.
  enabled = true
  default = true
  name = "localhost"
  urls = ["http://localhost:8086"]
  username = "admin"
  password = "admin"
  timeout = 0
- TICKscript 생성 및 적용(생성, 선언,활성화)
#

ex) /etc/kapacitor/kapacitor_script/cpu_alert.tick 경로에 아래 내용의 파일 생성

dbrp "telegraf"."autogen"

stream
        |from()
                .measurement('tomcat.OperatingSystem')
        |alert()
                .message('HostName : {{ index.field "host"}}{{"\n"}}System cpu : {{ index.field "SystemCpuLoad" }}{{"\n"}}Process cpu : {{ index.Fields "ProcessCpuLoad"}}{{"\n"}}')
                .warn(lambda: ("SystemLoadAverage" >= 0.08) AND ("SystemLoadAverage" < 0.10))
                .crit(lambda: "SystemLoadAverage" >= 0.10)
                .log('/tmp/alerts.log’)
- 선언 및 활성화
#
kapacitor define cpu_alert -tick /etc/kapacitor/kapacitor_script/cpu_alert.tick
kapacitor enable cpu_alert

활성화 완료 후 알림을 받으려면 https://docs.influxdata.com/kapacitor/v1.0/nodes/alert_node/ 에서 다양한 방식의 Alert 기능이 있으므로 원하는 방식을 이용하여 적용해주면 됩니다.

Chronograf 를 설치하면 여기에서 UI를 통해 대부분의 설정이 가능하며 알림 설정 및 위의 TICKscript 도 Chronograf 에서 생성 할 수 있습니다.