跳转至

采集器「火山引擎-云监控」配置手册

阅读本文前,请先阅读:

使用本采集器前,必须安装「观测云集成 Core 核心包」及其配套的第三方依赖包

该采集器默认支持开启多线程(默认开启五个线程),如果需要更改线程池大小,可以设置环境变量 COLLECTOR_THREAD_POOL_SIZE

1. 配置结构

本采集器配置结构如下:

字段 类型 是否必须 说明
targets list 必须 云监控采集对象配置列表
相同命名空间的多个配置之间逻辑关系为「且」
targets[#].namespace str 必须 所需采集的云监控命名空间。如:'VCM_ECS'
总表见附录
targets[#].subnamespace str 必须 所需采集的云监控子命名空间。如:'acs_ecs_dashboard'
总表见附录
targets[#].metrics list 必须 所需采集的云监控指标名列表
总表见附录
targets[#].metrics[#] str 必须 指标名称

2. 配置示例

指定特定指标

采集 ECS 中名称为CpuTotalMemoryUsedSpace的 2 个指标

Python
1
2
3
4
5
6
7
8
9
collector_configs = {
    'targets': [
        {
            'namespace': 'VCM_ECS',
            'subnamespace':'Instance',
            'metrics'  : ['CpuSystem', 'CpuTotal', 'MemoryUsedSpace'],
        },
    ]
}

通配符匹配指标

指标名可以使用*通配符来匹配。

本例中以下指标会被采集:

  • 名称为MemoryUsedSpace的指标
  • 名称以Cpu开头的指标
  • 名称以Connection结尾的指标
  • 名称中包含Used的指标
Python
1
2
3
4
5
6
7
8
9
collector_configs = {
    'targets': [
        {
            'namespace': 'VCM_ECS',
            'subnamespace':'Instance',
            'metrics'  : ['MemoryUsedSpace', 'Cpu*', '*Connection', '*Used*'],
        },
    ],
}

剔除部分指标

在开头添加"NOT"标记表示去除后面的指标。

本例中,以下指标【不会】被采集:

  • 名称为MemoryUsedSpace的指标
  • 名称以Cpu开头的指标
  • 名称以Connection结尾的指标
  • 名称中包含Used的指标
Python
1
2
3
4
5
6
7
8
9
collector_configs = {
    'targets': [
        {
            'namespace': 'VCM_ECS',
            'subnamespace':'Instance',
            'metrics'  : ['NOT', 'MemoryUsedSpace', 'Cpu*', '*Connection', '*Used*'],
        },
    ],
}

多重过滤指定所需指标

相同的命名空间可以指定多次,从上到下依次按照指标名进行过滤。

本例中,相当于对指标名进行了如下过滤步骤:

  1. 选择所有名称中包含Cpu的指标
  2. 在上一步结果中,去除名称为CpuTotal的指标
Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
collector_configs = {
    'targets': [
        {
            'namespace': 'VCM_ECS',
            'subnamespace':'Instance',
            'metrics'  : ['*Cpu*'],
        },
        {
            'namespace': 'VCM_ECS',
            'subnamespace':'Instance',
            'metrics'  : ['NOT', 'CpuTotal'],
        },
    ],
}

配置过滤器(可选项)

本采集器脚本支持用户自定义过滤器,让用户通过对象属性筛选出目标资源。过滤器函数返回值为 True|False

  • True:目标资源需要被采集。
  • False:目标资源不需要被采集

当开启自定义对象采集时,将支持筛选更多的对象属性,详情请参考对应产品的自定义对象采集器文档(支持中。..)

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 示例:开启过滤器,根据对象的 InstanceId,RegionId 属性过滤,配置格式如下:

def filter_instance(instance, namespace='VCM_ECS'):
    '''
    采集 InstanceId 为 i-xxxxxa, i-xxxxxb 且 RegionId 为 cn-hangzhou 的指标
    '''
    instance_id = instance['tags'].get('InstanceId')
    status = instance['tags'].get('Status')
    if instance_id in ['i-xxxxxa', 'i-xxxxxb'] and status in ['RUNNING']:
        return True
    return False

from guance_integration__runner import Runner
import guance_volcengine_monitor__main as main

@DFF.API('Volcengine-monitor ', timeout=3600, fixed_crontab="*/5 * * * *")
def run():
    Runner(main.DataCollector(account, collector_configs, filters=[filter_instance])).run()

相同 namespace 下配置多个过滤器时同时满足所有过滤器才会上报

3. 数据上报格式

数据正常同步后,可以在观测云的「指标」中查看数据。

以如下采集器配置为例:

Python
1
2
3
4
5
6
7
8
9
collector_configs = {
    'targets': [
        {
            'namespace': 'VCM_ECS',
            'subnamespace':'Instance',
            'metrics'  : ['CpuTotal', 'MemoryUsedSpace'],
        },
    ],
}

上报的数据示例如下:

JSON
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "measurement": "volcengine_VCM_ECS",
  "tags": {
    "ResourceID": "i-xxxx"
  },
  "fields": {
    "CpuTotal"       : 1.23,
    "MemoryUsedSpace": 1.23
  }
}

所有的指标值都会以 float 类型上报

4. 与自定义对象采集器联动

当同一个 DataFlux Func 中运行了其他自定义对象采集器(如 ECS、mysql)时,本采集器会自动根据tags.ResourceID等字段尝试匹配自定义对象中的tags.name字段。

由于需要先获知自定义对象信息才能在云监控类采集器中进行联动,因此一般建议将云监控的采集器放置在列表末尾,如:

Python
1
2
3
4
5
# 创建采集器
collectors = [
  main.DataCollector(account, collector_configs),
  monitor_main.DataCollector(account, monitor_configs)
]

当成功匹配后,会将所匹配的自定义对象tags中除name以外的字段加入到监控数据的tags中,以此实现在使用实例名称筛选云监控的指标数据等效果。具体效果如下:

假设云监控采集到的原始数据如下:

JSON
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "measurement": "volcengine_VCM_ECS",
  "tags": {
    "ResourceID": "i-xxxx",
    "{其他字段}": "{略}"
  },
  "fields": {
    "{指标}": "{指标值}"
  }
}

同时,火山引擎 ECS 采集器采集到的自定义对象数据如下:

JSON
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "measurement": "volcengine_VCM_ECS",
  "tags": {
    "name"      : "i-xxxx",
    "InstanceId": "i-xxxx",
    "RegionId"  : "cn-shanghai",
    "{其他字段}": "{略}"
  },
  "fields": {
    "{其他字段}": "{略}"
  }
}

那么,最终上报的云监控数据如下:

JSON
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
"measurement": "volcengine_VCM_ECS",
  "tags": {
    "instanceId": "i-xxxx",
    "RegionId"  : "cn-beijing",
    "{其他字段}": "{略}"
  },
  "fields": {
    "{指标}": "{指标值}"
  }
}

5. 云监控调用次数限制说明

1、火山引擎对 GetMetricData API 调用存在限流:一个主账号及该账号下的 IAM 账号,1 秒内调用 GetMetricData 接口的次数不超过 20 次,否则将触发限流。(目前只是限流,没有收取费用)。

2、如何规避多个自动触发任务同时执行造成 API 调用限流:因为采集器默认支持多线程采集,且存在多个自动触发任务并列执行的情况,所以很容易触发 API 限流,那么如何缓解 API 限流,下面给出两点建议:

  • 环境变量 COLLECTOR_THREAD_POOL_SIZE 设置小的数值;
  • 延迟执行自动触发任务,错开同一时刻多任务同时调用 API。在启动函数装饰器DFF.API(xxx)中添加delayed_crontab参数,delayed_crontab就是延迟执行参数,单位:秒。如下示例,效果:每分钟的第 5 秒执行一次任务
    Python
    1
    2
    3
    4
    5
    6
    7
    @DFF.API('Volcengine-ECS Collection', timeout=3600, fixed_crontab='* * * * *', delayed_crontab=5)
    def run():
        collectors = [
            main.DataCollector(account, collector_configs),
            monitor_main.DataCollector(account, monitor_configs),
        ]
        Runner(collectors,guance_id='observer').run()
    

注:上述建议,请结合任务执行耗时进行调节,找到适合的参数

X. 附录

请参考火山引擎官方文档: