서버의 CPU, Memory, Disk 등과 같은 System Metric 정보 및 로그 수집을 통한 상태 확인 모니터링을 하기위해 InfluxData의 오픈소스 컴포넌트들인 TICK Stack 을 사용하여 검토해보았습니다.
TICK Stack은 각각 Telegraf, InfluxDB, Chronograf, Kapacitor 를 의미합니다.
이 중 수집에 사용한 Telegraf 는 설치가 매우 간편하고 다양한 종류의 수집/저장 플러그인을 간단한 설정으로 사용 가능한 플러그인 기반 서버 에이전트 입니다.
Go 언어로 작성되어 외부 종속성이 없는 단일 바이너리로 컴파일되며 메모리 사용 공간이 많이 필요하지 않고 데이터 수집 및 출력 모두 플러그인 기반이므로 쉽게 확장 가능합니다.
수집된 데이터를 저장하는 용도로 InfluxDB 를 사용하였고, 실시간 데이터 처리 및 알림 전송으로 Kapacitor 를 사용하였습니다.
모니터링 시스템 구성도 #
대략적인 모니터링 시스템 구성은 아래와 같이 구성한다고 가정하고 이 중 아래 박스 부분의 InfluxDB 에 수집된 데이터 확인까지만 검토하였습니다.
아래의 구성에서는 추가되는 서버마다 Telegraf 를 설치해야해서 번거롭지만, 수집 서버를 통해서 다른 서버에 접근할 수 없어서 보안상 안전하고 수집 서버에 부하가 집중되는 문제를 피할 수 있습니다.
수집 서버에 Telegraf 를 설치하는 구성은 수집 대상 서버가 추가되어도 간단히 설정만 추가하면 되지만, 수집 서버가 보안 위험에 노출되면 다른 서버들로 접속이 가능한 위험 및 수집 서버의 부하 집중 문제가 있습니다.
환경 구성 #
실제 검토 환경 구성은 총 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/)
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 에서 생성 할 수 있습니다.