Mongo的统计数据没有显示在munin上

时间:2014-09-19 07:46:39

标签: python mongodb monitoring munin

我试图将一个MongoDB的插件添加到munin。我按照这个来安装插件:

sudo apt-get install git munin-node
git clone git://github.com/erh/mongo-munin.git /home/ubuntu/mongo-munin
sudo ln -sf /home/ubuntu/mongo-munin/mongo_btree /etc/munin/plugins/mongo_btree
sudo ln -sf /home/ubuntu/mongo-munin/mongo_conn /etc/munin/plugins/mongo_conn
sudo ln -sf /home/ubuntu/mongo-munin/mongo_lock /etc/munin/plugins/mongo_lock
sudo ln -sf /home/ubuntu/mongo-munin/mongo_mem /etc/munin/plugins/mongo_mem
sudo ln -sf /home/ubuntu/mongo-munin/mongo_ops /etc/munin/plugins/mongo_ops
sudo service munin-node restart

(来自https://ivan-site.com/2013/06/monitoring-mongodb-in-munin-on-ubuntu-1304

但是没有任何东西被发送到munin的服务器(仅限Mongo,来自服务器的所有其他日期都可以在Munin上使用)。

然后我发现运行插件时出错:

# sudo -u munin python /usr/share/munin/plugins/mongo_ops
Traceback (most recent call last):
  File "/usr/share/munin/plugins/mongo_ops", line 56, in <module>
    doData()
  File "/usr/share/munin/plugins/mongo_ops", line 33, in doData
    ss = getServerStatus()
  File "/usr/share/munin/plugins/mongo_ops", line 28, in getServerStatus
    raw = urllib2.urlopen(req).read()
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 400, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 418, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 111] Connection refused>

我已经检查了这个问题:Munin Mongodb Plugin Not Showing. . .?但问题不一样,我正在运行pyhton 2,如上面的输出所示:

File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen

因此,插件 有效:

# munin-node-configure | grep "mongo"
mongo_btree                | yes   |
mongo_conn                 | yes   |
mongo_lock                 | yes   |
mongo_mem                  | yes   |
mongo_ops                  | yes   |

是Mongo的许可吗?也许我需要为Munin设置一个用户?你知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

好的,首先关闭 - 这些插件是在很久以前编写的,并且在几年内没有更新,所以它们可能会或可能不会在这一点上工作。其次,他们使用MongoDB的HTTP console来收集数据。从那以后defaults to disabled它可能根本不会为你的实例运行(并且通常不建议用于生产系统 - 如果你运行它,你应该防火它)。

编辑:经过多一点检查后,插件需要的不仅仅是控制台,它们需要启用REST interface,默认情况下这肯定是关闭的,而且不是通常建议用于生产。

最后,插件被硬编码以连接到端口28017(MongoDB +1000的默认端口),因此如果您自定义了MongoDB运行的端口,则需要手动调整每个插件以连接到正确的端口

检查所有这些的最简单方法是将浏览器指向端口28017(http://hostame/28017)上的主机或任何适当的端口,并查看是否可以访问控制台。

<强>更新

我分叉了Eliot的插件,看看移植到pymongo有多难,消除了对REST API的依赖,我设法很容易地做到了(还没有auth支持)。您可以在这里找到该版本,每个链接的页面都有相同的安装和测试命令:

https://github.com/comerford/mongo-munin

事实证明,自插件编写以来对serverStatus() command的更改意味着其中一些不再与当前版本的MongoDB一样工作,所以我不得不回去修复它们对于2.4及更高版本(这与新的pymongo依赖关系列在自述文件中)。

答案 1 :(得分:0)

使用凭据时,这似乎已损坏或不起作用:

$ munin-run -d mongo_docs 
# Processing plugin configuration from /etc/munin/plugin-conf.d/munin-node
# Setting /rgid/ruid/ to /126/65534/
# Setting /egid/euid/ to /126 126/65534/
# Setting up environment
# Environment MONGO_DB_URI = mongodb://MY_USER:MY_PASSWORD@localhost:27017/admin
# About to run '/etc/munin/plugins/mongo_docs'
Traceback (most recent call last):
  File "/etc/munin/plugins/mongo_docs", line 53, in <module>
    doData()
  File "/etc/munin/plugins/mongo_docs", line 20, in doData
    ss = getServerStatus()
  File "/etc/munin/plugins/mongo_docs", line 14, in getServerStatus
    return c.admin.command('serverStatus', workingSet=True)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/database.py", line 733, in command
    codec_options, session=session, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/database.py", line 630, in _command
    client=self.__client)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 613, in command
    user_fields=user_fields)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/network.py", line 167, in command
    parse_write_concern_error=parse_write_concern_error)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 159, in _check_command_response
    raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: not authorized on admin to execute command { serverStatus: 1, workingSet: true, $db: "admin", $readPreference: { mode: "primaryPreferred" } }

但是在手动执行时效果很好:

$ mongo -u MY_USER admin --eval 'db.serverStatus().metrics.document'
MongoDB shell version v3.6.16
Enter password: 
connecting to: mongodb://127.0.0.1:27017/admin?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("b2d5afa5-8bc9-4ed7-9a6e-a52e8d660876") }
MongoDB server version: 3.6.15
{
    "deleted" : NumberLong(1137),
    "inserted" : NumberLong(342220),
    "returned" : NumberLong(3429651),
    "updated" : NumberLong(1364343)
}
$

可能是pymongo错误?

另外两个由于缺少键而失败:

$ munin-run mongo_btree
Traceback (most recent call last):
  File "/etc/munin/plugins/mongo_btree", line 59, in <module>
    doData()
  File "/etc/munin/plugins/mongo_btree", line 22, in doData
    for k,v in get().iteritems():
  File "/etc/munin/plugins/mongo_btree", line 19, in get
    return getServerStatus()["indexCounters"]
KeyError: 'indexCounters'

$  munin-run mongo_lock 
Traceback (most recent call last):
  File "/etc/munin/plugins/mongo_lock", line 52, in <module>
    doData()
  File "/etc/munin/plugins/mongo_lock", line 21, in doData
    print name + ".value " + str( 100 * (getServerStatus()["globalLock"]["lockTime"]/getServerStatus()["globalLock"]["totalTime"]) )
KeyError: 'lockTime'