private void FillReplicaSetStatistics(IDictionary<string, object> status)
{
MongoDatabase database = _mongoServer["admin"];
CommandResult result = database.RunCommand("isMaster");
BsonDocument isMasterOutput = result.Response;
IDictionary<string, object> replSet = new Dictionary<string, object>();
status.Add("replSet", replSet);
replSet.Add("setName", isMasterOutput["setName"]);
replSet.Add("isMaster", isMasterOutput["ismaster"]);
replSet.Add("isSecondary", isMasterOutput["secondary"]);
if (isMasterOutput.Contains("arbiterOnly"))
{
replSet.Add("isArbiter", isMasterOutput["arbiterOnly"]);
}
database = _mongoServer["admin"];
result = database.RunCommand("replSetGetStatus");
BsonDocument replSetOutput = result.Response;
replSet.Add("myState", replSetOutput["myState"]);
IDictionary<string, object> members = new Dictionary<string, object>();
replSet.Add("members", members);
foreach (BsonDocument memberOutput in replSetOutput["members"] as BsonArray)
{
IDictionary<string, object> member = new Dictionary<string, object>();
members.Add(memberOutput["_id"].ToString(), member);
member.Add("name", memberOutput["name"]);
member.Add("state", memberOutput["state"]);
if (memberOutput.Contains("optimeDate"))
{
TimeSpan delta = DateTime.UtcNow - (DateTime)memberOutput["optimeDate"];
member.Add("optimeDate", (int)delta.TotalSeconds);
}
if (memberOutput.Contains("self"))
{
replSet.Add("myId", memberOutput["_id"].ToString());
}
else
{
if (memberOutput.Contains("lastHeartbeat"))
{
TimeSpan delta = DateTime.UtcNow - (DateTime)memberOutput["lastHeartbeat"];
member.Add("lastHeartbeat", (int)delta.TotalSeconds);
}
}
if (memberOutput.Contains("errmsg"))
{
member.Add("error", memberOutput["errmsg"]);
}
}
}