You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Datadog API提取指定指标的标签信息?

关于Datadog API提取指标及标签的解决方案

1. 能否通过Datadog REST API提取指标信息?

当然可以!你目前用到的api.Metric.list()就是Datadog官方API的一部分,用来获取账号下的所有指标名称列表。如果还需要提取指标的时间序列数值数据(比如具体的监控数值点),可以用api.Metric.query()方法,举个简单的实操例子:

import time
from datadog import api

# 查询指定指标过去1小时的时间序列数据
results = api.Metric.query(
    start=int(time.time()) - 3600,
    end=int(time.time()),
    query="avg:system.cpu.user{*} by {host}"
)
# 打印返回的时间序列数据
print(results['series'])

这个方法能拿到指标的具体数值,适合做数据分析或自定义监控告警场景。

2. 如何获取指定指标的所有标签(和Metrics Explorer展示一致)?

要拿到和Metrics Explorer里完全一致的标签(包括主机、自定义业务标签等),核心是通过指标元数据API或者查询指标时间序列并提取维度标签,这里给你两种实用方法:

方法一:用指标元数据API(推荐,最直接)

Datadog提供的api.Metric.get_metadata()可以直接获取指定指标的标签维度信息,再结合指标查询就能拿到实际存在的标签值,完全匹配Metrics Explorer的展示内容。结合你现有代码可以这样扩展:

def get_metric_full_tags(metric_name: str):
    # 第一步:获取指标支持的标签维度(比如host、env、service等)
    metadata = api.Metric.get_metadata(metric_name)
    tag_dimensions = metadata.get('tag_keys', [])
    print(f"指标 {metric_name} 支持的标签维度:{tag_dimensions}")
    
    # 第二步:查询最近15分钟的指标数据,提取实际存在的标签键值对
    query_result = api.Metric.query(
        start=int(time.time()) - 900,
        end=int(time.time()),
        query=f"avg:{metric_name}{{*}}"
    )
    
    # 从返回的时间序列中提取所有标签组合
    all_tag_values = set()
    for series in query_result.get('series', []):
        # series['scope']就是标签组合,格式如"host:i-12345,env:prod"
        tags = series['scope'].split(',')
        for tag in tags:
            all_tag_values.add(tag)
    
    print(f"指标 {metric_name} 实际关联的标签值:{list(all_tag_values)}")
    return list(all_tag_values)

方法二:通过Hosts API关联指标与主机标签(适合已有标签筛选逻辑的场景)

如果你需要获取每个关联主机的完整标签集合,可以结合你现有的get_hosts_from_tag函数,先通过指标查询拿到关联主机,再逐个拉取主机标签:

def get_host_tags_for_target_metric(metric_name: str):
    # 先通过指标查询获取关联的主机列表
    query_result = api.Metric.query(
        start=int(time.time()) - 900,
        end=int(time.time()),
        query=f"avg:{metric_name}{{*}} by {{host}}"
    )
    host_list = [series['scope'].split(':')[1] for series in query_result.get('series', [])]
    
    # 遍历主机获取每个主机的全量标签
    host_tags_map = {}
    for host in host_list:
        host_details = api.Hosts.show(host_name=host)
        host_tags_map[host] = host_details['host']['tags']
    
    print(f"指标 {metric_name} 关联的主机及对应标签:{host_tags_map}")
    return host_tags_map

结合你现有代码的使用示例

比如你已经通过正则筛选出目标指标,可以直接遍历调用上面的函数:

filtered_metrics = _load_metrics(from_time=3600, filter_pattern="system\.cpu\..*")
if filtered_metrics:
    for metric in filtered_metrics:
        print(f"\n===== 指标 {metric} 的标签信息 =====")
        get_metric_full_tags(metric)

⚠️ 注意:调用所有API前,要确保datadogpy客户端已正确配置密钥:

from datadog import initialize

options = {
    'api_key': '<你的API密钥>',
    'app_key': '<你的应用密钥>'
}
initialize(**options)

内容的提问来源于stack exchange,提问作者p3quod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:42:19