Mongodb监控主要利用的是其自带的rest服务,默认端口是27017+1000,后接serverStatus。
Mongodb需要开启rest服务才能进行监控。其中,2.2版本一下会自动启动rest服务,2.2-2.6之间需要通过如下命令启动rest服务: mongod –dbpath ************ --rest 而2.6以上需要改动mongod.conf文件,将OPTIONS加入 –rest –httpinterface
{ "host" : "aclome-PC", "version" : "2.0.6", "process" : "mongod", "uptime" : 4675828, "uptimeEstimate" : 4348964, "localTime" : { "$date" : 1467100514725 }, "globalLock" : { "totalTime" : 4675828116867, "lockTime" : 973633, "ratio" : 2.082268585724607e-007, "currentQueue" : { "total" : 0, "readers" : 0, "writers" : 0 }, "activeClients" : { "total" : 0, "readers" : 0, "writers" : 0 } }, "mem" : { "bits" : 64, "resident" : 5, "virtual" : 242, "supported" : true, "mapped" : 80, "mappedWithJournal" : 160 }, "connections" : { "current" : 0, "available" : 20000 }, "extra_info" : { "note" : "fields vary by platform", "page_faults" : 40688, "usagePageFileMB" : 21, "totalPageFileMB" : 7677, "availPageFileMB" : 2772, "ramMB" : 3839 }, "indexCounters" : { "note" : "not supported on this platform" }, "backgroundFlushing" : { "flushes" : 77900, "total_ms" : 638103, "average_ms" : 8.191309370988448, "last_ms" : 0, "last_finished" : { "$date" : 1467100477003 } }, "cursors" : { "totalOpen" : 0, "clientCursors_size" : 0, "timedOut" : 0 }, "network" : { "bytesIn" : 0, "bytesOut" : 0, "numRequests" : 0 }, "opcounters" : { "insert" : 0, "query" : 1, "update" : 0, "delete" : 0, "getmore" : 0, "command" : 0 }, "asserts" : { "regular" : 0, "warning" : 0, "msg" : 0, "user" : 0, "rollovers" : 0 }, "writeBacksQueued" : false, "dur" : { "commits" : 30, "journaledMB" : 0, "writeToDataFilesMB" : 0, "compression" : 0, "commitsInWriteLock" : 0, "earlyCommits" : 0, "timeMs" : { "dt" : 3088, "prepLogBuffer" : 0, "writeToJournal" : 0, "writeToDataFiles" : 0, "remapPrivateView" : 0 } } }
其中不同的版本指标名称或许会存在细微差距,整个指标可分为如下部分:1.实例信息;2.全局锁信息;3.内存信息;4.连接信息;5.额外信息;6.索引计数器信息;7.backgroundFlushing;8.last_finished;9.cursors;10.网络信息;11.操作计数器信息(opcounters);12.断言信息(asserts);14.writeBacksQueued;15.持久性信息(dur)
1.实例信息
"host" : "aclome-PC", //主机名
"version" : "2.0.6", //版本号
"process" : "mongod", //进程名
"uptime" : 4675828, //启动时间
"uptimeEstimate" : 4348964,
"localTime" : { "$date" : 1467100514725 } //本地时间
2.全局所信息
"globalLock" : { "totalTime" : 4675828116867, //创建全局锁现在的时间(毫秒)
"lockTime" : 973633, //创建全局锁后锁定的时间(毫秒)
"ratio" : 2.082268585724607e-007,
"currentQueue" : { "total" : 0, //当前等待锁总数
"readers" : 0, //当前等待读锁总数
"writers" : 0 }, //当前等待写锁总数
3. 内存信息
"mem" : { "bits" : 64, //操作系统位数 64 或32
"resident" : 5, //物理内存中数据大小(MB)
"virtual" : 242, //使用虚拟内存(页面文件)大小(MB)
"supported" : true, //是否支持系统扩展内存信息
"mapped" : 80, //映射文件大小
"mappedWithJournal" : 160 }, //为journal提供的内存大小,一般是mapped的2倍
4.连接信息
"connections" : { "current" : 0, //当前连接数
"available" : 20000 } //可用连接数
5.额外信息
"extra_info" : {
"note" : "fields vary by platform", //
"page_faults" : 40688, //硬错误页
"usagePageFileMB" : 21, //页面文件使用大小MB
"totalPageFileMB" : 7677, //页面文件大小
"availPageFileMB" : 2772, //可用页面文件大小
"ramMB" : 3839 } //物理内存大小
6.索引计数器
"indexCounters" : { "note" : "not supported on this platform" } //windows下
"indexCounters" :{ //linux下
"accesses" : 101216836, //访问次数
"hits" : 101216836, //命中次数
"misses" : 0, //miss次数
"resets" : 0, //indexCounders重置次数
"missRatio" : 0 //miss率
}
7.backgroundFlushing
"backgroundFlushing" : { //数据冲洗
"flushes" : 77900, //次数
"total_ms" : 638103, //总共耗时
"average_ms" : 8.191309370988448, //平均耗时
"last_ms" : 0, //最后一次耗时
"last_finished" : { "$date" : 1467100477003 } } //最后一次完成时间
8.last_finished
"last_finished" : { "$date" : 1467100477003 } } //最后执行时间
9.cursors
"cursors" : {
"totalOpen" : 0, //维护游标数目
"clientCursors_size" : 0, //总共游标数目
"timedOut" : 0 } //超时个数
10.网络信息
"network" : {
"bytesIn" : 0, //输入字节数
"bytesOut" : 0, //输出字节数
"numRequests" : 0 } //请求次数
11.操作计数器信息(opcounters)
"opcounters" : {
"insert" : 0, //插入次数
"query" : 1, //查询次数
"update" : 0, //更新次数
"delete" : 0, //删除次数
"getmore" : 0, //getmore次数
"command" : 0 } //其他命令次数
12.断言信息(asserts)
"asserts" : {
"regular" : 0, //正常断言数量
"warning" : 0, //告警断言数量
"msg" : 0, //消息断言数量
"user" : 0, //用户断言数量
"rollovers" : 0 } //转滚断言数量
14.writeBacksQueued
"writeBacksQueued" : false //true 有要被重新执行的操作 false代表无
15.持久性信息(dur)
"dur" : {
"commits" : 30, //上次提交间隔(journal group commit interval)之后,提交的写入操作
"journaledMB" : 0, //上次分组提交间隔之后,写入操作的大小
"writeToDataFilesMB" : 0, //上次分组提交间隔之后,从journal写入到数据文件的大小
"compression" : 0, //写入到journal的压缩率,journal的大小/未压缩的数据大小
"commitsInWriteLock" : 0, //提交发生的时候写锁个数,用来表示写入负载是否过重
"earlyCommits" : 0, //在提交间隔过来前,请求提交的次数,用来判断分组提交间隔时间是否合适
"timeMs" : { "dt" : 3088, //获取这些数据花的时间
"prepLogBuffer" : 0, //准备写入到journal文件的数据的时间
"writeToJournal" : 0, //写入Journal文件的时间
"writeToDataFiles" : 0, //写入数据文件的时间
"remapPrivateView" : 0 } } //重新映射的时间
Java代码如下:
package test;
import java.net.URI;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
/**
* 获取mongodb监控数据
*
* @author lihainan
*
*/
public class MongodbMonitoring {
public static void main(String[] args) {
String infoUrl = "http://10.4.55.180:28017/serverStatus";
String urlResult = getStringResultByUrl(infoUrl);
System.out.println(urlResult);//返回结果是个JSON串,可以根据自己的需求进行解析
}
public static String getStringResultByUrl(String url) {
String result = null;
HttpGet request = null;
HttpClient client = null;
try {
client = new DefaultHttpClient();
client.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);// 连接时间
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
3000);// 数据传输时间
request = new HttpGet(new URI(url));
request.setHeader("Connection", "close");
HttpResponse response = null;
response = client.execute(request);
response.setHeader("Connection", "close");
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode >= 400) {
return null;
}
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (request != null) {
// 释放连接
request.abort();
}
}
return result;
}
}