近期发现在dashboard中调用ceilometerclient的创建alarm的接口时,偶尔的会报以下错误
Gone: Gone (HTTP 410) (Request-ID: req-6d7898ba-92b2-48b8-98c5-0059fe759e54)
目前出现了两次这个问题,均在搭建完干净的openstack后进行代码移植并测试功能的过程中发现的
但有的时候新搭建的openstack并移植时不会出现这种问题
在找原因的过程中发现,是与ceilometer的接口有关,我测试了一下两种方法来创建alarm:
已调用ceilometerclient创建alarm为例
curl -g -i -X 'POST' 'http://172.18.31.16:8777/v2/alarms'
curl -g -i -X 'POST' 'http://172.18.31.16:8042/v2/alarms'
其整个调用alarm create的流程如下:
1. /usr/lib/python2.7/site-packages/ceilometerclient/v2/alarms.py
return self._create(self._path(), new)
2. /usr/lib/python2.7/site-packages/ceilometerclient/common/base.py
body = self.api.post(url, json=body).json()
3. /usr/lib/python2.7/site-packages/ceilometerclient/openstack/common/apiclient/client.py
return self.client_request("POST", url, **kwargs)
4. /usr/lib/python2.7/site-packages/ceilometerclient/openstack/common/apiclient/client.py line 345, in client_request
5. /usr/lib/python2.7/site-packages/ceilometerclient/openstack/common/apiclient/client.py line 261, in client_request
# 在client.py的261行,有这么一段代码
return self.request(method, self.concat_url(endpoint, url), **kwargs)
# 其中:
endpoint = "http://172.18.31.16:8777"
url = "/v2/alarms"
# 在261行前加一个判断就好了
if url[4:10] == 'alarms':
endpoint = endpoint.replace('8777', '8042')
以上是之前发现的问题,进一步的分析源码之后明白了事情发生
端口 | 服务描述 |
---|---|
8777 | OpenStack Telemetry Alarming Service of Ceilometer API |
8042 | OpenStack Telemetry Alarming Service of Aodh API |
以上是openstack中的两个端口,发现8777端口是ceilometer的服务,8042是aodh的端口
那么问题来了,为什么在用命令的时候走的是aodh的服务呢
ceilometer和aodh本是一家,aodh是ceilometer把关于alarm相关的操作都独立出来的一个服务
仔细查看ceilometerclient的源码,会发现有这么一段注释,ceilometerclient会对发过来关于alarm的请求进行转发
但是为何现在转发失败就不清楚了,手动改端口号为8042相当于手动进行了转发。
# Users may just provided ceilometer endpoint and token, and no
# auth_url, in this case, we need 'aodh_endpoint' also
# provided, otherwise we cannot get aodh endpoint from
# keystone, and assume aodh is unavailable.