OpenStack监控组件---Ceilometer alarm属性分析

Ceilometer作为OpenStack的监控组件,可通过部署Compute服务收集计算节点上的监控信息,并通过Alarm模块设置阈值报警。Alarm支持多种动作及状态,如ok_actions、alarm_actions等。

OpenStack监控组件---Ceilometer alarm属性代码分析

CeilometerOpenStack中的一个子项目,它像一个漏斗一样,能把OpenStack内部发生 的几乎所有的事件都收集起来,然后为计费和监控以及其它服务提供数据支撑。

Ceilometer监控通过在计算节点部署Compute服务,轮询其计算节点上的instance,获取各自的CPU、网络、磁盘等监控信息,发送到RabbitMQCollector服务负责接收信息进行持久化存储。Ceilometer项目创建时最初的目的是实现一个能为计费系统采集数据的框架。在G版的开发中,社区已经更新了他们的目标,新目标是希望Ceilometer成为OpenStack里数据采集(监控数据、计费数据)的唯一基础设施,采集到的数据提供给监控、计费、面板等项目使用。

Alarm模块的目录结构:

 

ceilometerclient的目录结构:

 

Alarm的属性:

 

参数

类型

解释

name

str

nameproject唯一的

description

str

描述

enabled

bool

alarm的一个开关,可以停止/启动该alarm,默认是True

ok_actions

list

alarm状态变为ok状态时,采取的动作,默认是[]

alarm_actions

list

alarm状态变为alarm状态时,采取的动作,默认是[]

insufficient_data_actions

list

alarm状态变为insufficient data状态时,采取的动作,默认是[]

repeat_actions

bool

alarm被触发时,是否重复执行对应的动作,默认是False

type

str

alarm类型,目前有thresholdcombination两种,必填

threshold_rule

AlarmThresholdRule

alarm类型为threshold时,制定的threshold规则

combination_rule

AlarmCombinationRule

alarm类型为combination时,制定的combination规则

time_constraints

list(AlarmTimeConstraint)

约束该alarm在哪些时间段执行,默认是[]

state

str

alarm的状态,默认是insufficient data

user_id

str

user id,默认是context user id

project_id

str

project id, 默认是context project id

timestamp

datetime

alarm的定义最后一次被更新的时间

state_timestamp

datetime

alarm的状态最后一次更改的时间

说明:

name: nameproject唯一的,在创建alarm的时候会检查

enabled: 这个功能比较人性化,可以暂停该alarm,是微创新之一

xxx_actions: 定义了在该alarm状态由其他的状态变为xxx状态时,执行的动作

repeat_actions: 这个参数指定了是否要重复执行action,比如第一次检查alarm已经超过阈值,执行了相应的action了,当下一次检查时如果该alarm还是超过阈值,那么这个参数决定了是否要重复执行相应的action,这也是微创新之一

threshold_rule: typethreshold时,定义的alarm被触发的规则,详细参数见下面AlarmThresholdRule对象属性

combination_rule: typecombination时,定义的alarm被触发的规则,详细参数见下面AlarmCombinationRule对象属性

time_constraints: 这也是一个很人性化的参数,可以指定该alarm被检查的时间的一个列表,比如说我只想让这个alarm在每天晚上的21点到23点被检查,以及每天中午的11点到13点被检查,其它时间不检查该alarm,这个参数就可以做这个限制,不过该参数设置稍微复杂一点,详细参数见下面AlarmTimeConstraint对象属性,默认是[],即不设限制,随着alarm进程的interval time进行检查。

state: alarm总共有3个状态:OK, INSUFICIENT DATA, ALARM,这三个状态分别对应到上面的xxx_actions

AlarmThresholdRule:

meter_name: 监控指标

query: 该参数一般用于找到监控指标下的某个资源,默认是[]

period: 这个参数其实有两个作用,一个是确定了获取该监控指标的监控数据的时间范围,和下面的evaluation_periods配合使用,另外一个作用就是它确定了两个点之间的时间间隔,默认是60s

threshold: 阈值

comparison_operator: 这个参数确定了怎么和阈值进行比较,有6个可选:lt, le, eq, ne, ge, gt,默认是eq

statistic: 这个参数确定了使用什么数据去和threshold比较,有5种可选:max, min, avg, sum, count,默认是avg

evaluation_periods: period参数相乘,可以确定获取监控数据的时间范围,默认是1

exclude_outliners: 这个参数有点意思,我们都知道“标准差”是指一组数据的波动大小,平均值相同,但是标准差小的波动小,这个参数就是指对得到的一组监控数据,是否要根据标准差去除那些波动比较大的数据,以降低误判率,默认是False

AlarmCombinationRule:

operator: 定义alarms之间的逻辑关系,有两个选项:or and,默认是and,注意这里的逻辑关系ALARM要比OK状态优先级高,比如有2alarm,一个状态是ALARM,一个状态是OK,他们之间的逻辑关系是or,那么这个combination alarm是啥状态呢?答案是ALARM.

alarms_id: alarm列表

AlarmTimeConstraint:

name: name

description: description

start: 该参数以cron的格式指定了alarm被检查的开始时间,在程序中,使用croniter这个库来实现cron,格式是:"min hour day month day_of_week",比如"2 4 mon,fri",意思是在每周一和周五的04:02开始被检查

duration: 被检查持续的时间,单位是秒

timezone: 可以为上面的检查时间指定时区,默认使用的是UTC时间

分析alarm的evaluate实现:

对于有threshold的alarm,evaluate是通过ThresholdEvaluator(ceilometer/alarm/evaluator/threshold.py)中的evaluate函数实现的:

 

其中:

query = self._bound_duration(
    alarm,
    alarm.rule['query']
)

参照alarm的属性,alarm.rule[‘query’]是resource_id == INSTANCE_ID

@classmethod
def _bound_duration(cls, alarm, constraints):
    """Bound the duration of the statistics query."""
    
now = timeutils.utcnow()
    # when exclusion of weak datapoints is enabled, we extend
    # the look-back period so as to allow a clearer sample count
    # trend to be established
    look_back = (cls.look_back if not alarm.rule.get('exclude_outliers')
                 else alarm.rule['evaluation_periods'])
    window = (alarm.rule['period'] *
              (alarm.rule['evaluation_periods'] + look_back))
    start = now - datetime.timedelta(seconds=window)
    LOG.debug(_('query stats from %(start)s to '
                '%(now)s') % {'start': start, 'now': now})
    after = dict(field='timestamp', op='ge', value=start.isoformat())
    before = dict(field='timestamp', op='le', value=now.isoformat())
    constraints.extend([before, after])
    return constraints

该函数计算evaluate操作的时间段,结束时间是当前时间now,开始时间start是now – period*evaluation_periods(这两个参数在alarm的属性中) + lookback(这个参数是reporting/ingestion的延迟时间,可以忽略的细节),然后在query的内容中添加时间段为[start,now]的条件,最后返回更改后的query。

 

statistics = self._sanitize(
    alarm,
    self._statistics(alarm, query)
)

 

def _statistics(self, alarm, query):
    """Retrieve statistics over the current window."""
    
LOG.debug(_('stats query %s') % query)
    try:
        return self._client.statistics.list(
            meter_name=alarm.rule['meter_name'], q=query,
            period=alarm.rule['period'])
    except Exception:
        LOG.exception(_('alarm stats retrieval failed'))
        return []

 

 

@staticmethod
def _sanitize(alarm, statistics):
    """Sanitize statistics."""
    
LOG.debug(_('sanitize stats %s') % statistics)
    if alarm.rule.get('exclude_outliers'):
        key = operator.attrgetter('count')
        mean = utils.mean(statistics, key)
        stddev = utils.stddev(statistics, key, mean)
        lower = mean - 2 * stddev
        upper = mean + 2 * stddev
        inliers, outliers = utils.anomalies(statistics, key, lower, upper)
        if outliers:
            LOG.debug(_('excluded weak datapoints with sample counts %s'),
                      [s.count for s in outliers])
            statistics = inliers
        else:
            LOG.debug('no excluded weak datapoints')

    # in practice statistics are always sorted by period start, not
    # strictly required by the API though
    statistics = statistics[-alarm.rule['evaluation_periods']:]
    LOG.debug(_('pruned statistics to %d') % len(statistics))
    return statistics

 

### OpenStack Ceilometer 使用指南 CeilometerOpenStack 的一部分,属于 Telemetry 服务,主要用于监控和计量云资源的使用情况。它能够收集各种指标数据并提供给其他服务使用,比如计费、告警等。 #### Ceilometer 的主要功能 Ceilometer 提供了以下核心功能[^1]: - **资源监控**: 收集虚拟机、存储卷、网络带宽等方面的使用数据。 - **事件记录**: 记录用户的操作行为以及资源状态的变化。 - **数据持久化**: 将采集到的数据存储到数据库中以便后续分析- **插件支持**: 可通过插件机制扩展其功能以适应不同的需求场景。 #### 安装与配置 Ceilometer 以下是关于如何安装和初步配置 Ceilometer 的指导: ##### 准备工作 在开始之前,请确认已经完成如下准备工作: - 已经部署好基本的 OpenStack 环境,并且各组件正常运行。 - 数据库已准备好(通常推荐 MySQL),并且创建好了相应的表结构来保存 Ceilometer 所需的信息。 ##### 步骤说明 1. **安装软件包** 在控制节点上执行命令安装必要的 Ceilometer 组件及其依赖项。 ```bash apt-get install ceilometer-api ceilometer-collector \ ceilometer-agent-central ceilometer-agent-notification \ python3-ceilometerclient ``` 2. **修改配置文件** 编辑 `/etc/ceilometer/ceilometer.conf` 文件设置 Keystone 身份验证等相关参数。 关键部分包括但不限于以下几个方面: - `[database]`: 设置连接字符串指向你的数据库实例。 ```ini connection = mysql+pymysql://ceilometer:CEILOMETER_DBPASS@controller/ceilometer ``` - `[keystone_authtoken]`: 填写认证服务的具体细节。 ```ini auth_uri = http://controller:5000/v3 ... password = CEILOMETER_PASS project_name = service user_domain_id = default project_domain_id = default region_name = RegionOne ``` 3. **初始化数据库模式** 运行脚本来同步数据库架构至最新版本。 ```bash su -s /bin/sh -c "ceilometer-dbsync" ceilometer ``` 4. **重启相关服务** 更新完成后记得重新启动所有涉及的服务进程使得更改生效。 ```bash systemctl restart ceilometer-api.service \ ceilometer-collector.service \ ceilometer-agent-central.service \ ceilometer-agent-notification.service ``` #### 结合 Aodh 实现告警功能 Aodh 是基于 Ceilometer 构建的一个独立项目,专注于处理报警逻辑[^2]。当某些条件满足时触发通知或者自动化动作是非常实用的功能之一。 要实现这一目标可以按照下面的方式来进行关联设定: - 创建阈值规则指定何时发送警告消息; - 配置 Webhook URL 接收远程回调请求从而进一步采取措施; ```yaml alarm_rule: threshold_rule: comparison_operator: gt threshold: 80.0 statistic: avg period: 60 evaluation_periods: 1 meter_name: cpu_util actions_enabled: true name: high_cpu_usage_alarm type: threshold repeat_actions: false state: alarm ok_actions: - https://example.com/webhooks/cpu-ok?token=abcde insufficient_data_actions: - https://example.com/webhooks/cpu-insufficent-data?token=fghij ``` 上述 YAML 片段定义了一个简单的 CPU 利用率超过百分之八十就会激活的通知机制例子[^2].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值