쉘에서 mongodb 클라이언트를 사용하려면, sudo yum install mongodb를 실행해 mongodb를 설치한다. 


그리고, mongo 커맨드에 mongodb 서버에 커맨드를 실행한다. 



$ mongo abc.google.io:27017/mydb --eval "db.api_feeds_list"

MongoDB shell version: 2.4.14

connecting to: abc.google.io:27017/mydb

mydb.api_feeds_list



db 상태를 볼 수 있다. 하지만, 바로 js 객체로만 나온다. 


$ mongo abc.google.io:27017/mydb --eval "db.stats()"

MongoDB shell version: 2.4.14

connecting to: abc.google.io:27017/mydb

[object Object]



DB 상태를 보기 위해 printjson과 같은 함수를 써서 상세하게 볼 수 있다. 


$ mongo abc.google.io:27017/mydb --eval "printjson(db.stats())"

MongoDB shell version: 2.4.14

connecting to: abc.google.io:27017/mydb

{

"db" : "mydb",

"collections" : 620,

"objects" : 326613,

"avgObjSize" : 1669.3089405504375,

"dataSize" : 545218001,

"storageSize" : 250097664,

"numExtents" : 0,

"indexes" : 620,

"indexSize" : 29995008,

"ok" : 1

}




마찬가지로 object Object로 리턴하면 printjson으로 확인할 수 있다. 


$ mongo abc.google.io:27017/mydb --eval "printjson(db.api_feeds_list.findOne())"

MongoDB shell version: 2.4.14

connecting to: abc.google.io:27017/mydb

{

"_id" : ObjectId("564c808630325673616b25ad"),

"date" : "20151117",

"max" : 18133,

"sum" : 49779120,

"stdev" : 17.49,

"max_user" : 75847769,

"uniq_user" : 8153500,

"mean" : 6.1

}



자바 스크립트를 안다면, 다음처럼 파일로 전달해 처리할 수 있다. 


$ cat > mytest.js

printjson(db.stats())


$ mongo abc.google.io:27017/mydb mytest.js

MongoDB shell version: 2.4.14

connecting to: abc.google.io:27017/mydb

{

"db" : "mydb",

"collections" : 620,

"objects" : 326635,

"avgObjSize" : 1669.559428720131,

"dataSize" : 545336544,

"storageSize" : 250134528,

"numExtents" : 0,

"indexes" : 620,

"indexSize" : 29995008,

"ok" : 1

}




Posted by '김용환'
,




grafana, telegraf, influxDB로 실시간 모니터링은 구축했지만, jvm 모니터링을 구축한 내용이다.



이전 내용은 http://knight76.tistory.com/entry/grafana를 참조한다.






telegraf를 이용해 자바를 모니터링하는 방법이 있다. 


- 웹 애플리케이션에 jolokia 활용하기 (https://github.com/influxdata/telegraf/tree/master/plugins/inputs/jolokia)

- stats-jvm-profile를 java agent를 사용하는 방법(https://github.com/etsy/statsd-jvm-profiler)


두 방법 모두 javaagent 기반이라 등록/해제 모두 재시작을 해야 한다는 점이 좀 걸렸다. 웹도 아니면 jolokia가 불편하기도 하기도 하다. 더 간단한 방법으로 보고 싶었다. 



jmx를 순수하게 사용하는 방식을 사용했다. 결론은 대만족이다. 

cmdline-jmxclient 0.10.3을 다운받아 jmx 호출을 통해 jvm 메모리 부분을 모니터링하도록 스크립트를 구성했다. 


그리고, influxDB http write api를 이용해서 저장했다. (단순한 질의와 파일을 이용한 bulk 작업이 가능하다)

influxDB 1.1 이전에는 json을 지원했지만, influxDB 1.1부터는 그냥 property와 sql형태만 지원하는 것 같다. 

(참조 : https://docs.influxdata.com/influxdb/v1.1/guides/writing_data/)



crontab에 아래 스크립트(g1, cms 메모리 정보)를 만들어 jvm이 떠 있는 장비로 jmx을 모니터링 정보를 influxDB에 저장하도록 했다. 




<핵심 스크립트>



# timestamp 구성하기 

t="$(date -u +%s)"

oo="000000000"

timestamp=$t$oo

echo $timestamp 


/usr/java/default/bin/java -jar cmdline-jmxclient-0.10.3.jar - abc.google.io:10100 "java.lang:type=MemoryPool,name=G1 Eden Space" "Usage" 2>> /tmp/javalog2

used="$(cat /tmp/javalog2 | grep used | cut -f2 -d" ")"

curl -i -XPOST 'http://influxdb.google.io:8086/write?db=telegraf' -d "javamem,server=abc.google.io,type=g1-eden value=$used $timestamp"




많이 보면 좋긴 하지만, 잘 동작한다고 가정하고 주요 지표만 보도록 했다. 

만약 다른 지표를 추가해 세밀히 볼 수 있을 것이다. 



g1일 때 

"java.lang:type=Memory" "HeapMemoryUsage"

"java.lang:type=MemoryPool,name=G1 Survivor Space"

"java.lang:type=MemoryPool,name=G1 Old Gen"

"java.lang:type=MemoryPool,name=G1 Eden Space"



cms일 때 

"java.lang:type=Memory" "HeapMemoryUsage"

"java.lang:type=MemoryPool,name=Par Eden Space" "Usage"

"java.lang:type=MemoryPool,name=Par Survivor Space" "Usage"

"java.lang:type=MemoryPool,name=CMS Old Gen" "Usage"




기존 grafana에 jvm 모니터링 추가한 내용이다. jvm 서버 재시작 없이 gc 내용을 볼 수 있게 만들었다. 




Posted by '김용환'
,




보통 여러 데몬을 한 번에 kill하려면, grep을 사용하면 쉽게 종료할 수 있다. 


$ ps -ef | grep python | grep -v grep |  awk '{print $2}' | xargs kill -9



grep을 쓰기가 좀 그러면, awk로 대안해서 사용할 수 있다. 


$ ps -ef | awk '/python/ && !/awk/ {print $2}' | xargs -r kill -9


Posted by '김용환'
,