Mitaka版OpenStack中调用ceilometerclient创建alarm的问题

松高歌
2023-12-01

近期发现在dashboard中调用ceilometerclient的创建alarm的接口时,偶尔的会报以下错误

Gone: Gone (HTTP 410) (Request-ID: req-6d7898ba-92b2-48b8-98c5-0059fe759e54)

目前出现了两次这个问题,均在搭建完干净的openstack后进行代码移植并测试功能的过程中发现的

但有的时候新搭建的openstack并移植时不会出现这种问题

在找原因的过程中发现,是与ceilometer的接口有关,我测试了一下两种方法来创建alarm:

  1. 使用各个组件的client调用接口
  2. 使用bash命令

已调用ceilometerclient创建alarm为例

  1. 使用client调用时,走的端口号是8777
curl -g -i -X 'POST' 'http://172.18.31.16:8777/v2/alarms'
  1. 使用bash命令时,走的端口号是8042
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')

以上是之前发现的问题,进一步的分析源码之后明白了事情发生

端口服务描述
8777OpenStack Telemetry Alarming Service of Ceilometer API
8042OpenStack 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.
 类似资料: