分享

OpenStack Ceilometer数据存储与API源码解析

徐超 发表于 2015-1-14 20:11:18 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 15291
问题导读
1、如何理解MongoDB对Collections的存取?
2、怎样合理的利用和分析采集到的数据?
2、如何进行二次开发?






MongoDB的Collections
Ceilometer在MongoDB中共有这么几个Collections
  1. - user
  2.   - { _id: user id
  3.       source: [ array of source ids reporting for the user ]
  4.       }
  5. - project
  6.   - { _id: project id
  7.       source: [ array of source ids reporting for the project ]
  8.       }
  9. - meter
  10.   - the raw incoming data
  11. - resource
  12.   - the metadata for resources
  13.   - { _id: uuid of resource,
  14.       metadata: metadata dictionaries
  15.       user_id: uuid
  16.       project_id: uuid
  17.       meter: [ array of {counter_name: string, counter_type: string,
  18.                          counter_unit: string} ]
  19.     }
复制代码

其中meter是采集到的数据,其他的都是固定值

Collector对数据库的写数据
Collector在接收到采集的数据后,会调用record_metering_data()对数据进行写入,相应mongodb的代码在ceilometer.storage.impl_mongodb中
  1. def record_metering_data(self, data):
  2.     self.db.user.update(
  3.         {'_id': data['user_id']},
  4.         {'$addToSet': {'source': data['source'],},},
  5.         upsert=True,
  6.     )
  7.     self.db.project.update(
  8.         {'_id': data['project_id']},
  9.         {'$addToSet': {'source': data['source'],},},
  10.         upsert=True,
  11.     )
  12.     self.db.resource.update(
  13.         {'_id': data['resource_id']},
  14.         {'$set': {'project_id': data['project_id'],
  15.                   'user_id': data['user_id'],
  16.                   'metadata': data['resource_metadata'],
  17.                   'source': data['source'],},
  18.          '$addToSet': {'meter': {'counter_name': data['counter_name'],
  19.                                  'counter_type': data['counter_type'],
  20.                                  'counter_unit': data['counter_unit'],},},
  21.          },
  22.         upsert=True,
  23.     )
  24.     record = copy.copy(data)
  25.     self.db.meter.insert(record)
  26.     return
复制代码



从上面代码可知,每次存储时都会更新user,project和resource,然后将数据完全写入到meter中,写入后的数据格式如下:
  1. {
  2.   "counter_name": "disk.write.requests",
  3.   "user_id": "4ff44f4665564b2abcb8e1f1619f2b85",
  4.   "message_signature": "8473976666aecd078a281afed936839b737ceaf4bb63654759d63514bdc9ee03",
  5.   "timestamp": ISODate("2013-05-21T22:33:14.0Z"),
  6.   "resource_id": "b7fc623d-1d4a-4ac7-b96b-78c9d921fa74",
  7.   "resource_metadata": {
  8.     "ramdisk_id": "",
  9.     "display_name": "test",
  10.     "name": "instance-00000001",
  11.     "disk_gb": "",
  12.     "availability_zone": "",
  13.     "kernel_id": "",
  14.     "ephemeral_gb": "",
  15.     "host": "e781ff9ce97dcc328d8826cfb19a20c001b866cb20859653c2f481b1",
  16.     "memory_mb": "",
  17.     "instance_type": "42",
  18.     "vcpus": "",
  19.     "root_gb": "",
  20.     "image_ref": "da04e6dd-4cc7-4594-87d8-60927c07c396",
  21.     "architecture": "",
  22.     "os_type": "",
  23.     "reservation_id": "",
  24.     "image_ref_url": "http:\/\/192.168.0.6:8774\/676730085ab84296a9b4a7d68ee76078\/images\/da04e6dd-4cc7-4594-87d8-60927c07c396"
  25.   },
  26.   "source": "openstack",
  27.   "counter_unit": "request",
  28.   "counter_volume": NumberInt(1366),
  29.   "project_id": "be13e080970d44b280e4843e084bb2b1",
  30.   "message_id": "6cf1d76c-c266-11e2-a987-5eafb2e29593",
  31.   "counter_type": "cumulative"
  32. }
复制代码



这是一个disk.write.requests的数据,其中resource_metadata如果无变化的话,没个都会带这些数据,具体原因不详

另外,重要的东西在
counter_unit 计量单位
counter_volume 计量数值
counter_type 计量类型

计量内容
在文档中讲了计量值和其单位

首先是计量类型:
  • Cumulative 随时间的累计值(如cpu总时长)
  • Gauge 离散项(floating IPs, image uploads)和变化的值 (disk I/O)
  • Delta 随时间的变化量(带宽等)

计量单位比较多了,每个都不太一样,这个可以查询文档,如磁盘读写请求的单位为”request”

API对数据库的读操作
数据存储只是Ceilometer的一小部分,如果合理的利用和分析采集到的数据才比较重要,另外这部分也是暴露出来给开发者的部分

API服务以wsgi service方式运行在后端,Ceilometer有v1和v2两个版本的API,v1会被弃用,这里只讲v2部分
  1. GET /v2/meters/cpu?q.op=ge&q.op=lt&q.op=eq&q.value=2013-05-19+23%3A00%3A00&q.value=2013-05-20+00%3A00%3A00&q.value=b7fc623d-1d4a-4ac7-b96b-78c9d921fa74&q.field=timestamp&q.field=timestamp&q.field=resource
复制代码


这是一个我截取下来的请求,首先我们看到一个资源地址
  1. GET /v2/meters/cpu
复制代码


根据V2的Controller,我们可以看到是MetersController()对它进行处理的
  1. class V2Controller(object):
  2.     resources = ResourcesController()
  3.     meters = MetersController()
  4.     alarms = AlarmsController()
复制代码




没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条