首页 > 代码库 > Ceilometr: 2 、Cnocchi技术介绍

Ceilometr: 2 、Cnocchi技术介绍

声明:以下内容是对Gnocchi官网:https://docs.openstack.org/developer/gnocchi/architecture.html
内容的大致翻译,肯定有理解不到位的地方,还请多多包涵。

Gnocchi

1系统架构

Gnocchi包含了集中服务:一个HTTP REST API(参见:https://docs.openstack.org/developer/gnocchi/rest.html),一个可选的用于聚合统计信息的是守护进程,并且是一个异步处理的守护进程(叫做gnocchi-metricd)。数据可以通过HTTP REST API或者网络守护进程statsd daemon被接收到。 Gnocchi-metricd可以在后端对接收到的数据执行操作(例如统计计算,计量清零)。
HTTP REST API和异步处理守护进程都是无状态的,并且是可扩展的。额外的workers可以根据负载情况被添加。
技术分享

2 Back-ends后端

Gnocchi使用三种不同的后端存储数据:一个用于存储新的即将到来的测量值(incoming driver),一个用于存储时间序列(storage driver),还有一个是用于检索数据(index driver)Incoming driver负责存储发送到监控项的新的measures。它默认是和storage driver是同一个driverStorage driver负责存储创建的监控项的measures。它接收时间戳timestamp和值,并且根据定义的归档策略来预先计算聚合值。
Indexer driver负责存储所有资源的索引,归档策略和监控项,以及它们的定义,类型和属性。Indexer driver也负连接资源和监控项。

2.1可用的存储后端

Gnocchi目前支持不同的存储后端:
File(默认)Ceph(首选),OpenStack Swift,S3, Redis
这些后端是基于名叫Carbonara的中间件,该中间件是用来处理时间序列的操作,因为上述存储技术无法处理时间序列。
Carbonara对于后面上述的支持是比较好的,并且是易于扩展的。CephSift原本就是比文件driver更具有扩展性的。
根据你系统的大小,使用file driver并且存储你在磁盘上的数据一般各哦吟咏了。如果你需要扩展为数台服务器,你可以通过NFS来贡献数据。S3,CephSwift drivers更容易扩展。Ceph提供了更好的一致性,因此推荐用Ceph

2.2可用的index后端

gnocchi目前支持4driversPostgreSQL(首选)
MySQL(至少版本是5.6.4)
这些drivers提供了大多数相同的性能和特性,PostgreSQL具有更高的性能并且有一些额外的特性(例如 资源持续时长计算)。

3如何设计Gnocchi的存储

Gnocchi使用一个基于Carnonara的定制化文件格式。在Gnocchi中,一个时间序列是点的集合,在时间序列中的每一个点都有measure或者采样值sample。存储格式会被各种技术压缩,因此计算时间序列的大小在最坏情况下被下面的公式计算:
点的个数 * 8byte = 时间序列大小
点的各数可以被下面的公式确定
点的个数 = 持续时间 / 粒度

3.1安装

pip install gnocchi
根据系统的架构所需要的drivers和特性,安装时需要携带额外的参数
pip install gnocchi[postgresql,ceph,keystone]
着将会安装postgresql来支持indexer driver,Ceph支持存储,Keystone支持验证和授权。
下面时可用的变量列表:
keystone:
mysql:支持indexer
postgresql:支持indexer
swift:支持storage
s3:支持storage
ceph:支持storage
ceph_recommended_lib:支持Ceph >= 0.80storage
ceph_alternative_lib:支持Ceph >= 10.1.0storage
file:提供file driver支持
redis:提供storage支持
doc:文档构建支持
test:单元和功能性测试支持

为了从source安装Gnocchi,运行python标准的安装程序
pip install -e.
根据drivers和你想使用的特性,你需要安装额外的变量
pip install -e.[postgresql,ceph,ceph_recommended_lib]

3.2Ceph要求

ceph需要一个已经创建的Ceph 用户和一个pool。它们可以被一下的例子来创建
ceph osd pool create metrics 8 8
ceph auth get-or-create client.gnocchi mon "allow r" osd "allow rwx pool=metrics"
需要弄清这个命令的含义
Gnocchi收录了python中的一些特性(omap, async,操作上下文),但是需要python-rados >= 10.1.0rados是用于控制集群的】。为了处理这种情况,Gnocchi使用cradox python库,使其和相同的API工作相同,但是只需要Ceph >=0.80.0
如果Cephpython-rados >=10.1.0,cradox python库会编程可选的,但仍然推荐这样做。

4配置

4.1配置文件

默认地,gnocchi在以下地方按照顺序寻找它的配置:

~/.gnocchi/gnocchi.conf

    ~/gnocchi.conf

    /etc/gnocchi/gnocchi.conf

    /etc/gnocchi.conf

    ~/gnocchi/gnocchi.conf.d

    ~/gnocchi.conf.d

    /etc/gnocchi/gnocchi.conf.d

    /etc/gnocchi.conf.d

如果源码中没有提供配置文件,它将在安装过程中创建。假如安装中没有配置文件,可以运行下面的命令来创建。
gnocchi-config-generator > /path/to/gnocchi.conf
可以通过编辑正确的文件来配置Gnocchi。配置文件是明确的,但是一些基本的选项你需要去改变和配置

选项名称
	

帮助

storage.driver
	

用于监控项的存储驱动storagedriver

indexer.url
	

你的indexerurl

storage.file_*
	

如果你使用了文件存储驱动,用于存储文件的配置选项

storage.swift_*
	

如果使用了swiftstoragedriver.需要配置访问Swift

storage.ceph_*
	

如果你使用cephstoragedriver.,需要配置访问ceph

storage.s3_*
	

如果你使用S3storagedriver,需要配置访问S3

storage.redis_*
	

如果你使用redis作为storagedriver,你需要配置访问redis

4.2配置验证

API server支持不同的验证方法:basic(默认)会使用标准的HTTP验证头部或者keystone来使用OpenStack Keystone。如果你通过pip成功安装了keystone ,你可以设置api.auth_modekeystone来开启Keystone 验证。

4.3初始化

一旦配置Gnocchi,你需要初始化indexestoragegnocchi-upgrade

4.4升级

为了从之前版本的Gnocchi升级,你需要确保你的indexerstorage是需要正确升级。按照以下步骤来:
1)停止老版本的Gnocchi API servergnocchi-statsd daemon
2)停止老版本的Gnocchi-metricd daemon
3)安装新版本的Gnocchi
4)运行 
gnocchi-upgrade
这会根据你的indexstorage大小花费数小时的时间
5)运行新的Gnocchi API server,gnocchi-metricdgnocchi-statsd daemon

5安装使用Devsatck

为了使得Gnocchidevstack中,添加下面的语句到local.conf:
enable_plugin gnocchi https://github.com/openstack/gnocchi master
为了使得Grafana支持devstack,你需要开启 gnocchi-grafana:
enable_service gnocchi-grafana
接下来需要开启devstack
./stack.sh

6运行Gnocchi

简单运行HTTP servermetric daemon:
gnocchi-api
gnocchi-metricd

6.1运行api作为wsgiapplication

Gnocchi API层 使用WSGI运行。这意味着它必须使用Apache httpdmod_wsgi运行,或者其他的HTTP daemon例如uwsgi。你需要根据CPU的数量配置处理的数量和线程,通常是1.5 * CPU数量。如果一个server不够,你可以扩大API server的数量来扩展Gnochi,甚至是在不同的机器上。
下面是uwsgi可以使用的的配置文件

[uwsgi]
http = localhost:8041
# Set the correct path depending on your installation
wsgi-file = /usr/lib/python2.7/dist-packages/gnocchi/rest/app.wsgi
master = true
die-on-term = true
threads = 32
# Adjust based on the number of CPU
processes = 32
enabled-threads = true
thunder-lock = true
plugins = python
buffer-size = 65535
lazy-apps = true


一旦写入到/etc/gnocchi/uwsgi.ini,它可以用下面的方式发布
uwsgi /etc/gnocchi/uwsgi.ini

7如何定义归档策略

Gnocchi中,归档策略定义是被表示为点的数量。如果你的归档策略定义了一个10各点的策略,粒度是1秒,时间序列归档将会维持10(有时会多一点),每一种表示是对超过1秒的聚集。这意味着时间序列将会最大保留最新到最老10秒的数据。但这并不意味着这是连续的10秒:可能数据中存在不规则的部分。

因此,归档策略和粒度完全依赖于你的使用情况。你可以定义其中归档策略。一个典型的低度使用的方式
3600 点,粒度1s ,等于1小时
1440点,1分钟,24小时
720点,一小时,30365点,一天,一年
这将表示每个聚集方法将花费6125个点 * 9 = 54 KB空间。如果你使用
8个标准的聚集方法,你的监控项占据的总空间为8 * 54KB = 432KB
小心定义你的归档策略,它将花费更多的CPU。因此,创建一个归档策略包含两个定义(
每天1秒的粒度粒度和针对每个月1分钟的粒度)将会花费两被的CPU比一个定义(例如:每天1秒的粒度)

8默认归档策略

默认3个归档策略会在调用 gnocchi-upgrade 的时候被创建:
low , medium , highingzi描述了存储空间和CPU使用的需求。它们使用 
default_arrgegation_methods 
这是默认被设置为 mean , min, max , sum , std, count
一个fourth archive policy叫做bool的也默认被提供了。这仅仅用于存储boolean 值(例如,01.它仅仅为每一秒存储1data point(使用 最后的聚集方法),是一年的保留时间。
最好的存储大小是被如下假设:除了01作为测量值measures被发送。如果其他的值被发送,最坏情况下的最大存储大小会被考虑在内。

Low:
超过30天的5分钟的粒度
使用的聚集函数:默认聚集函数
每个监控项metric最大空间大小:406KB
Medium:
超过7天的一分钟的粒度
超过365天的1小时粒度
使用的聚集函数:默认聚集函数
每个监控项metric最大空间大小为:887KB
high:
超过1小时的1秒粒度
超过1星期的一分钟粒度
超过1年的1小时粒度
使用聚集方法:默认聚集方法
每个监控项metric最大空间大小为:1057KB

超过1年的bool* 1秒的粒度,使用: las*  最好情况小大小为:
1539 KB * 每个监控项最坏情况下大小: 277 172KB277MB

9我们需要运行多少metricdworkers

默认地,gnocchi-metricd daemon会测量所有你的CPU功效来最大化CPU使用,当计算metric聚集。你可以使用gnocchi status命令查询HTTP API 获取监控项处理的聚集状态,它将会显示多少个监控项metric正在处理,正如处理存储的gnocchi-metricd。只要积压未办的时请不是持续增长,这意味着gnocchi-metricd能够处理正在被发送的个数的监控项。假如正在处理的measure的数量持续上升,你需要增加gnocchi-metricd daemons。你可以在任意数量的服务器上运行任意数量的metricd-daemon

10如何监视Gnocchi

HTTP API/V1/status endpoint返回各种信息,例如待处理的measures数量(measures backlog最大连接数量),你可以轻松监视(参见:我们需要运行多少metricd workers)。确保HTTP servergnocchi-metricd daemon是运行的并且没有在日志中写入任何报警的时请,着就标志着对于整个系统是处于一种良好的状态。

所有measuresbacklog状态可能不呢个正确反映除待处理的点的个数,当measures正在被批处理batch提交的时候。

11如何备用和恢复Gnocchi

为了能够从不幸的事件中恢复,你需要备份索引index和存储storage。着意味着创建一个数据库转储database dump(PostgreSQL or MySQL) 并且所奎找snapshots或者拷贝你的数据存储(Ceph .S3 , Swift,或者你的文件系统)。恢复的过程不会比初始部署的过程复杂:
恢复你的索引index和存储备份storage backups,如果需要就重新安装Gnocchi,并重启它。

12客户端

Gnocchi仅仅提供了一个Python的客户端和SDK,可以被pip安装
pip install gnocchiclient
包中提供了gnocchi的命令行工具,可以被用于发送请求到Gnocchi,你可以阅读完整的在线文档:
http://gnocchi.xyz/gnocchiclient/

13 RESU API用法

13.1验证

默认地。验证被配置为”basic”模式。你需要在你的HTTP请求携带一个有效的username中提供一个`Authorization’ header。”admin”密码被授予所有权限,而其他的用户名被识别为拥有标准权限。
你可以通过指定一个不同的pollcy_file而不是默认的来定制化你的权限。
如果你设置api.auth_modekeystone中,OpenStack Keystone中间件将能够支持验证。需要验证每一个发送到GnocchiAPI请求的Keystone并提供一个X-Auth-Token有效头部。

13.2Metrics

Gnocchi提供了一种对象类型,叫做metric。一个metric可以标明任何可以被测量的事物:一个服务器的CPU使用率,房间的温度或者发送个网络接口的字节数。
一个metric仅仅有很少的属性:一个UUID来标识它,一个name,归档策略archive policy将会被用于存储和聚集测量项measures

1)为了创建一个metric,下面的API需要被使用:

输入:
POST /v1/metric HTTP/1.1
Content-Type: application/json
Content-Length: 35

{
  "archive_policy_name": "high"
}

2)一旦创建了,你可以检索metric的信息

输入:
GET /v1/metric/c79894ef-aa69-4a60-a9b9-efd8c98a5628 HTTP/1.1
Content-Length: 0

3)为了检索所有创建的metrics列表,使用下面的请求

输入:
GET /v1/metric HTTP/1.1
Content-Length: 0

注意:考虑到Gnocchi中会存储大量的metrics,查询结果会被设置在配置文件中的max_limit值所限制。
返回的结果会按照metricsid值排序。为了检索下一页的内容,metricid需要给出来作为下一页结果的标记marker

4)默认顺序和limits,起始页面可以被查询中的参数修改

输入命令:
GET /v1/metric?limit=100&sort=name:asc HTTP/1.1
Content-Length: 0

5也可以发送measuresmetric:

POST /v1/metric/c79894ef-aa69-4a60-a9b9-efd8c98a5628/measures HTTP/1.1
Content-Type: application/json
Content-Length: 198

[
  {
    "timestamp": "2014-10-06T14:33:57",
    "value": 43.1
  },
  {
    "timestamp": "2014-10-06T14:34:12",
    "value": 12
  },
  {
    "timestamp": "2014-10-06T14:34:20",
    "value": 2
  }
]

如果没有错误,Gnocchi将不会返回响应体,仅仅返回状态码。可以提供任意数量的measures。
重要:可以发送任意数量的(timestamp,value),它需要通过归档测ve中的metric来限制,例如最大时间跨度timespan

6一旦measures测量值内发送,可以在端点endpoint中使用GET来检索它们。

输入:
GET /v1/metric/c79894ef-aa69-4a60-a9b9-efd8c98a5628/measures HTTP/1.1
Content-Length: 0

根据driver,在提交POST测量值之后,被处理和可查询之前,可能存在一些延迟。为了确保你查询返回了

7所有被提提交的measures,你需要强加上一些未被处理的方法来处理。

输入:
GET /v1/metric/c79894ef-aa69-4a60-a9b9-efd8c98a5628/measures?refresh=true HTTP/1.1
Content-Length: 0

注意:根据未被处理的数据量多少,refresh可能需要添加一些东西在你的查询中。
返回的点的列表会以(timestamp,granularity,value)的形式压缩为元组,并根据时间戳排序。
粒度 granularitytimespan,用于被进行聚集。
可以通过指定start and/or stop参数到带有timestamp的查询中,来过滤一段时间的measures

8时间戳格式可以用浮点数(UNIXepoch)或者一个ISO8601格式的时间戳。

输入:
GET /v1/metric/c79894ef-aa69-4a60-a9b9-efd8c98a5628/measures?start=2014-10-06T14:34 HTTP/1.1
Content-Length: 0

默认地,聚集的值将会以平均值聚集函数计算后返回,

9可以请求任意其他方法来通过指定聚集查询参数

输入:
GET /v1/metric/c79894ef-aa69-4a60-a9b9-efd8c98a5628/measures?aggregation=max HTTP/1.1
Content-Length: 0

聚集列表方法包括:mean,sum,last,max,min,std,median,first,countNpct(with 0 < N 100)

10可以提供granularity粒度参数来指定granularity来检索,而不是所有可能的granularity

输入:
GET /v1/metric/c79894ef-aa69-4a60-a9b9-efd8c98a5628/measures?granularity=1 HTTP/1.1
Content-Length: 0


另外,对于归档策略中的粒度granularities,

11measures可以被新的granularities进行重新采样。

输入:
GET /v1/metric/c79894ef-aa69-4a60-a9b9-efd8c98a5628/measures?resample=5&granularity=1 HTTP/1.1
Content-Length: 0

注意:根据聚集方法和measures的频率,重新采样的数据可能缺少了准确性,并且它和之前工作的聚集数据不同。

13.3Measuresbatching采样批量处理

可以对发送的measures批量处理,

1在一个简单的调用中发送不同metrics的几个measures

输入:
POST /v1/batch/metrics/measures HTTP/1.1
Content-Type: application/json
Content-Length: 391

{
  "c79894ef-aa69-4a60-a9b9-efd8c98a5628": [
    {
      "timestamp": "2014-10-06T14:34:12",
      "value": 12
    },
    {
      "timestamp": "2014-10-06T14:34:20",
      "value": 2
    }
  ],
  "f2c44e50-0822-423e-bd0b-ffc88cfe3725": [
    {
      "timestamp": "2014-10-06T16:12:12",
      "value": 3
    },
    {
      "timestamp": "2014-10-06T18:14:52",
      "value": 4
    }
  ]
}

2或者使用资源的metrics

输入
POST /v1/batch/resources/metrics/measures HTTP/1.1
Content-Type: application/json
Content-Length: 585

{
  "15e9c872-7ca9-11e4-a2da-2fb4032dfc09": {
    "cpu.util": [
      {
        "timestamp": "2014-10-06T14:34:12",
        "value": 12
      },
      {
        "timestamp": "2014-10-06T14:34:20",
        "value": 2
      }
    ]
  },
  "6f24edd9-5a2f-4592-b708-ffbed821c5d2": {
    "cpu.util": [
      {
        "timestamp": "2014-10-06T14:34:12",
        "value": 6
      },
      {
        "timestamp": "2014-10-06T14:34:20",
        "value": 25
      }
    ]
  },
  "ab68da77-fa82-4e67-aba9-270c5a98cbcb": {
    "temperature": [
      {
        "timestamp": "2014-10-06T14:34:12",
        "value": 17
      },
      {
        "timestamp": "2014-10-06T14:34:20",
        "value": 18
      }
    ]
  }
}


null
如果一些在批处理中指定的metrics的名称不存在,Gnocchi会尝试创建它们并作为一种归档策略做匹配。

13.4归档策略

当发送metricmeasuresGnocchi,这些值会被动态聚集。着意味着Gnocchi并不存储所有发送的measures,而是在一个时间段聚集它们。
Gnocchi提供了几种不同的内置聚集函数。
一个归档策略被指定的field中调集集合所定义。每一个条目组成了时间跨度并且京都层次需要被提供,决定了至少使用:2points,granularitytimespan字段。例如,一个条目会被定义为超过1小时的12个点(每个点5分钟),或者针对天的每小时一个点(24个点)。
默认地,新的带有measurestimestamps的可以在聚集的时间段中被处理。上一次聚集时间段的大小是根据归档策略中最大的granularity。为了允许处理比该时间段更旧的measuresback_window 参数可以被用于设置保存粗略的时间段。
back_window:2表示可以收集两个小时之前的数据
具体参见:https://docs.openstack.org/developer/gnocchi/rest.html

改变聚集方法通过指定聚集参方法列表,在aggregation_methods中修改
删除加上前缀 -max,添加用+, *表示所有
一旦归档策略被创建,会返回所有属性,归档策略的URL
GET /v1/archive_policy/short HTTP/1.1
Content-Length: 0
已经存在的归档策略可以被修改用来保留更多或者更少的数据。归档策略覆盖可以扩展,

1)measures不可以回溯到已经计算的作为回填来容纳新的时间跨度。

输入:
PATCH /v1/archive_policy/short HTTP/1.1
Content-Type: application/json
Content-Length: 150

{
  "definition": [
    {
      "granularity": "1s",
      "timespan": "1 hour"
    },
    {
      "points": 48,
      "timespan": "1 day"
    }
  ]
}
注意:Granularities 粒度不可以被修改,删除或者添加。
如果归档策略不被任何metric所使用,可以删除【慎重】
DELETE /v1/archive_policy/some-archive-policy HTTP/1.1
Content-Length: 0

13.5归档策略规则

Gnocchi提供了一种能力被叫做archive_policy_rule。
一个归档策略规则,可以给与用户来定义规则。
归档策略规则包含几个属性:一个名字。
归档策略规则可以作为默认中度归档策略来映射到任意volume metric使用通配符
volume.*。当一个sample metric被以volume.size条件,将会匹配到该模式和规则来应用和时值归档策略为中度的。

1)如果多个规则匹配,使用最长匹配的。

输入:
POST /v1/archive_policy_rule HTTP/1.1
Content-Type: application/json
Content-Length: 90

{
  "archive_policy_name": "low",
  "metric_pattern": "disk.io.*",
  "name": "test_rule"
}

2)查询规则

GET /v1/archive_policy_rule/test_rule HTTP/1.1
Content-Length: 0

3)列出归档策略规则,按照字母表顺序逆序返回

GET /v1/archive_policy_rule HTTP/1.1
Content-Length: 0

4)删除归档规则;

DELETE /v1/archive_policy_rule/test_rule_delete HTTP/1.1
Content-Length: 0

13.6Resources资源

Gnocchi提供了能力来storeindex资源,每个资源有一个类型。
资源的基本类型是generic,但是更多特别的自类型也存在来描述OpenStack资源。

1)创建一个一般资源

POST /v1/resource/generic HTTP/1.1
Content-Type: application/json
Content-Length: 159

{
  "id": "75C44741-CC60-4033-804E-2D3098C7D2E9",
  "project_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D",
  "user_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D"
}
id,user_id,project_id属性必须是UUID。时间戳描述了资源的生命周期是可选的。
stared_at默认被设置为当前时间戳。
可以通过Location headerURL来检索资源。

2)创建指定的资源

POST /v1/resource/instance HTTP/1.1
Content-Type: application/json
Content-Length: 351

{
  "display_name": "myvm",
  "ended_at": "2014-01-04 10:00:12",
  "flavor_id": "2",
  "host": "compute1",
  "id": "6868DA77-FA82-4E67-ABA9-270C5AE8CBCA",
  "image_ref": "http://image",
  "metrics": {},
  "project_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D",
  "started_at": "2014-01-02 23:23:34",
  "user_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D"
}
所有指定的类型有它们自己的可选的和强制的属性,但是它们包含了所有来自generic类型的属性。

3)可以创建监控项的通知创建资源

POST /v1/resource/generic HTTP/1.1
Content-Type: application/json
Content-Length: 221

{
  "id": "AB68DA77-FA82-4E67-ABA9-270C5A98CBCB",
  "metrics": {
    "temperature": {
      "archive_policy_name": "low"
    }
  },
  "project_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D",
  "user_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D"
}

4)可以通过在创建时间的LocationheaderURL来检索资源

GET /v1/resource/generic/75c44741-cc60-4033-804e-2d3098c7d2e9 HTTP/1.1
Content-Length: 0

5)可以通过再次上传资源的部分修改属性来修改资源

PATCH /v1/resource/instance/6868da77-fa82-4e67-aba9-270c5ae8cbca HTTP/1.1
Content-Type: application/json
Content-Length: 20

{
  "host": "compute2"
}

6)查询资源修改历史

GET /v1/resource/instance/6868da77-fa82-4e67-aba9-270c5ae8cbca/history HTTP/1.1
Content-Length: 0

7)删除资源

DELETE /v1/resource/generic/75c44741-cc60-4033-804e-2d3098c7d2e9 HTTP/1.1
Content-Length: 0

8)可以基于属性值来删除一批资源,并返回删除资源数量

DELETE /v1/resource/generic HTTP/1.1
Content-Type: application/json
Content-Length: 172

{
  "in": {
    "id": [
      "3cbcca4f-af46-5285-b7f7-951affcb4772",
      "8a1bfad0-8a51-52ce-938b-c82cd028e91e",
      "4f46cf43-784d-5e77-9d66-acb2c23ac5b4"
    ]
  }
}

9)基于时间删除资源

DELETE /v1/resource/generic HTTP/1.1
Content-Type: application/json
Content-Length: 62

{
  ">=": {
    "started_at": "2017-03-20T14:07:12.008654+00:00"
  }
}
重要:当一个资源被删除了,所有相关的监控项都回同时被删除。当一批资源被删除,会要求一个属性器来避免删除整个数据库。

11)可以通过generictype或者过滤除资源类型来列出所有资源

输入:
GET /v1/resource/generic HTTP/1.1
Content-Length: 0
当使用generic endpoint,没有属性指定资源类型。

12)为了检索到细节,使用指定资源类型的endpoint

GET /v1/resource/instance HTTP/1.1
Content-Length: 0

13)或使用details= true在查询参数中

输入:
GET /v1/resource/generic?details=true HTTP/1.1
Content-Length: 0

14)可以设定查询返回的数量

GET /v1/resource/generic?limit=2&sort=id:asc HTTP/1.1
Content-Length: 0
每个资源可以与任意数量的metrics关联,metrics属性是key/value键值对,

15key是关系的名字,value是监控项

例如:
POST /v1/resource/instance HTTP/1.1
Content-Type: application/json
Content-Length: 368

{
  "display_name": "myvm2",
  "flavor_id": "2",}

16)可以在创建资源的同时创建监控项metrics

POST /v1/resource/instance HTTP/1.1
Content-Type: application/json
Content-Length: 362

{
  "display_name": "myvm3",
  "flavor_id": "2",
  "host": "compute2",
  "id": "15e9c872-7ca9-11e4-a2da-2fb4032dfc09",
  "image_ref": "http://image",
  "metrics": {
    "cpu.util": {
      "archive_policy_name": "short"
    }
  },
  "project_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D",
  "server_group": "my_autoscaling_group",
  "user_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D"
}

17metric相关的资源可以通过/ve/metricendpoint或者使用 资源关系名称

GET /v1/resource/generic/6f24edd9-5a2f-4592-b708-ffbed821c5d2/metric/cpu.util/measures?start=2014-10-06T14:34 HTTP/1.1
Content-Length: 0

18)对于同一个endpoint,可追加监控项到一个资源

POST /v1/resource/generic/6f24edd9-5a2f-4592-b708-ffbed821c5d2/metric HTTP/1.1
Content-Type: application/json
Content-Length: 42

{
  "memory": {
    "archive_policy_name": "low"
  }
}

13.7资源类型

1Gnocchi可以通过自定化属性来管理资源类型

POST /v1/resource_type HTTP/1.1
Content-Type: application/json
Content-Length: 360

{
  "attributes": {
    "display_name": {
      "required": true,
      "type": "string"
    },
    "enabled": {
      "required": false,
      "type": "bool"
    },
    "myid": {
      "type": "uuid"
    },
    "prefix": {
      "max_length": 8,
      "min_length": 3,
      "required": false,
      "type": "string"
    },
    "size": {
      "max": 32.8,
      "min": 5,
      "type": "number"
    }
  },
  "name": "my_custom_type"
}

2)查看定义的资源类型

GET /v1/resource_type/my_custom_type HTTP/1.1
Content-Length: 0

3)列出所有资源类型

GET /v1/resource_type HTTP/1.1
Content-Length: 0

4)如果没有资源与资源类型所关联,可以删除

DELETE /v1/resource_type/my_custom_type HTTP/1.1
Content-Length: 0

4)属性可以被添加或删除

PATCH /v1/resource_type/my_custom_type HTTP/1.1
Content-Type: application/json-patch+json
Content-Length: 372

[
    {
        "op": "add",
        "path": "/attributes/awesome-stuff",
        "value": {"type": "bool", "required": false}
     },
     {
        "op": "add",
        "path": "/attributes/required-stuff",
        "value": {"type": "bool", "required": true, "options": {"fill": true}}
     },
     {
        "op": "remove",
        "path": "/attributes/prefix"
     }
]
创建资源类型意味着在indexer backend中创建新的标。这是一个繁琐的操作将会锁住一些表。

13.7搜索资源

1)可以通过query机制,使用POST方法和上传JSON格式的查询来搜索资源

POST /v1/search/resource/instance HTTP/1.1
Content-Type: application/json
Content-Length: 58

{
  "=": {
    "user_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D"
  }
}
或者
POST /v1/search/resource/instance HTTP/1.1
Content-Type: application/json
Content-Length: 30

{
  "like": {
    "host": "compute%"
  }
}

2)复杂操作符例如and,or也支持

POST /v1/search/resource/instance HTTP/1.1
Content-Type: application/json
Content-Length: 113

{
  "and": [
    {
      "=": {
        "user_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D"
      }
    },
    {
      ">=": {
        "started_at": "2010-01-01"
      }
    }
  ]
}

3)可以在检索的同时查看资源详细信息

POST /v1/search/resource/generic?details=true HTTP/1.1
Content-Type: application/json
Content-Length: 58

{
  "=": {
    "user_id": "BD3A1E52-1C62-44CB-BF04-660BD88CD74D"
  }
}

4)搜索资源修改历史

POST /v1/search/resource/instance?history=true HTTP/1.1
Content-Type: application/json
Content-Length: 53

{
  "=": {
    "id": "6868da77-fa82-4e67-aba9-270c5ae8cbca"
  }
}

5)发送history参数在Accept头部

POST /v1/search/resource/instance HTTP/1.1
Content-Type: application/json
Content-Length: 53
Accept: application/json; history=true

{
  "=": {
    "id": "6868da77-fa82-4e67-aba9-270c5ae8cbca"
  }
}

6)历史时间范围可以被设置

POST /v1/search/resource/instance HTTP/1.1
Content-Type: application/json
Content-Length: 227
Accept: application/json; history=true

{
  "and": [
    {
      "=": {
        "host": "compute1"
      }
    },
    {
      ">=": {
        "revision_start": "2017-03-20T14:07:10.770198+00:00"
      }
    },
    {
      "or": [
        {
          "<=": {
            "revision_end": "2017-03-20T14:07:11.081500+00:00"
          }
        },
        {
          "=": {
            "revision_end": null
          }
        }
      ]
    }
  ]
}
支持的操作符: =, == , < , > , <= , >= ,!= , like, v , ^ ,not

13.9查询metrics的值

1

POST /v1/search/metric?metric_id=c79894ef-aa69-4a60-a9b9-efd8c98a5628 HTTP/1.1
Content-Type: application/json
Content-Length: 46

{
  "and": [
    {
      ">=": [
        {
          "+": 23
        },
        50
      ]
    },
    {
      "!=": 55
    }
  ]
}

2)可以在查询中指定粒度

POST /v1/search/metric?metric_id=82a71169-1c7a-4996-a7b4-ea35b8e239c2&granularity=1second&granularity=1800s HTTP/1.1
Content-Type: application/json
Content-Length: 9

{
  "=": 12
}

3Gnocchi允许对已经聚集的数据聚集

GET /v1/aggregation/metric?metric=c79894ef-aa69-4a60-a9b9-efd8c98a5628&metric=1b9f81ea-2240-44b3-a92e-773ad6799dcd&start=2014-10-06T14:34&aggregation=mean HTTP/1.1
Content-Length: 0

4)可以对已经聚集的结果再次聚集,通过指定reaggregation参数

GET /v1/aggregation/metric?metric=c79894ef-aa69-4a60-a9b9-efd8c98a5628&metric=1b9f81ea-2240-44b3-a92e-773ad6799dcd&aggregation=mean&reaggregation=min HTTP/1.1
Content-Length: 0

5)可以对资源搜索结果按照属性分组

POST /v1/aggregation/resource/instance/metric/cpu.util?groupby=host&groupby=flavor_id HTTP/1.1
Content-Type: application/json
Content-Length: 47

{
  "=": {
    "server_group": "my_autoscaling_group"
  }
}

6)获取支持的聚集方法

GET /v1/capabilities HTTP/1.1
Content-Length: 0

7)获取Gnocchi安装状态

GET /v1/status HTTP/1.1
Content-Length: 0

Statsd Daemon Usage使用:
https://docs.openstack.org/developer/gnocchi/statsd.html










补充:
StatsD 是一个简单的网络守护进程,基于 Node.js 平台,通过 UDP 或者 TCP 方式侦听各种统计信息,包括计数器和定时器,并发送聚合信息到后端服务。
参见:https://docs.openstack.org/developer/gnocchi/statsd.html

Ceilometr: 2 、Cnocchi技术介绍