云监控api&sdk使用demo

背景

有一些用户,企业内部自建IT信息系统,包括监控和运维系统,希望云监控的数据能够和自建系统打通, 所以会有需要通过云监控的api拉取数据。

下面给出一个两个典型场景的数据查询demo,分别使用两个api,queryMetricList和queryMetricLast, 一个用于查询一段时间的数据,一个用于查询给定时间段内的最新数据。

Demo


package main

import (
    "encoding/json"
    "testing"

    "github.com/aliyun/alibaba-cloud-sdk-go/services/cms"
)

//TestQueryMetricLast
//批量获取用户下所有实例的某个指标的数据。如果想获取多个指标,可以多个线程获取多个指标,也可以单线程循环获取多个指标。
//每用户默认允许30qps,太高的并发将会被限制。
//queryLast接口适用于,用户想要定时全量拉取所有最新数据的情况。时间窗口自动往前滑动,每个周期都取最新一条数据。
//通常监控数据会有一定的延迟,各产品的监控数据的延迟情况不太一样,所以如果给定的时间跨度太短,比如,只查询最近一分钟的时间跨度。
//有可能会因为数据延迟而导致查询不到最新的数据。
//定时查询的频率,通常应该跟period的值一样,比如,如果period=60,可以每60秒触发一次,每次查询过去5分钟内的最新数据。
//某些指标提供小于一分钟的精度,但是秒级精度的数据最多只保留7天。超过7天会有回收掉,就查不到了。
//由于是查询所有实例的最新数据,每轮查询返回的记录条数,通常是用户名下所有的实例数
//如果需要查询所有实例的数据,不需要指定Dimensions
func TestQueryMetricLast(t *testing.T) {
 ​      //关于如何获取ak,参考:https://yq.aliyun.com/articles/608581
    cmsClient, _ := cms.NewClientWithAccessKey(
        "<指定region,如果不确定,可以填入cn-hangzhou>",                    // 地域ID
        "<your access key id>",               // Access Key ID
        "<your Access Key Secret>") // Access Key Secret

    //获取给定时间范围内的给定实例的最后一条也就是最新一条监控数据。
    request := cms.CreateQueryMetricLastRequest()
    //project和metric信息未来会提供api,
    //当前可以先从这里获取。 http://metricmeta.oss-cn-hangzhou.aliyuncs.com/listMetricMeta_zh.html
    request.Project = "acs_ecs_dashboard"
    request.Metric = "cpu_total"
    //period根据每个metric有不同的定义,但是几乎所有的metric都会有60的period,表示要获取60s精度的监控数据。
    request.Period = "60"
    //查询数据的开始时间
    request.StartTime = "2018-11-29 11:00:00"
    //查询数据的结束时间
    request.EndTime = "2018-11-29 12:00:00"
    //本次查询的分页长度,每次查询最多返回1000条数据,可以更小。
    request.Length = "100"
    //分页的cursor,如果返回结果数据里有cursor != "",表示数据还有下一页。需要通过cursor来查询下一页。
    request.Cursor = ""

    t.Log("start query")

    for {
        response, _ := cmsClient.QueryMetricLast(request)
        //response code
        if response.Code != "200" || !response.IsSuccess() {
            t.Fatalf("code:%s,success:%v,msg:%s, httpstatus:%d, response:%v\n", response.Code, response.IsSuccess(), response.Message, response.GetHttpStatus(), response)
        }

        var datapoints []map[string]interface{}
        err := json.Unmarshal([]byte(response.Datapoints), &datapoints)
        if err != nil {
            t.Fatal(err)
        }

        t.Logf("batch count %d\n", len(datapoints))
        for _, v := range datapoints {
            t.Log(v)
        }

        //如果返回的结果中cursor=="",表示没有下一页了。跳出循环,结束本轮查询
        if response.Cursor == "" {
            t.Log("循环结束")
            break
        }

        //如果下一页,将cursor作为查询下一页的条件,赋值给request
        request.Cursor = response.Cursor
        t.Logf("cursor:%s\n", response.Cursor)
    }

    t.Log("finished")
}

//TestBatchQueryMultiInstance
//使用queryList接口可以查询给定时间范围内,给定实例的监控数据。
//该查询允许指定多个多个实例以批量查询。
//如果需要获取多个实例的一段时间的监控数据,可以在查询时指定多个实例(每次最多10个,超过10个会导致后端查询压力较大,有可能会被触发黑名单限流)
//每批最多10个实例,超过会有风险。

func TestBatchQueryMultiInstance(t *testing.T) {
 ​      //关于如何获取ak,参考:https://yq.aliyun.com/articles/608581
    cmsClient, _ := cms.NewClientWithAccessKey(
        "<指定region,如果不确定,可以填入cn-hangzhou>",                    // 地域ID
        "<your access key id>",               // Access Key ID
        "<your Access Key Secret>") // Access Key Secret

    //获取给定时间范围内的给定实例的最后一条也就是最新一条监控数据。
    request := cms.CreateQueryMetricListRequest()
    //project和metric信息未来会提供api,
    //当前可以先从这里获取。 http://metricmeta.oss-cn-hangzhou.aliyuncs.com/listMetricMeta_zh.html
    request.Project = "acs_ecs_dashboard"
    request.Metric = "cpu_total"
    //period根据每个metric有不同的定义,但是几乎所有的metric都会有60的period,表示要获取60s精度的监控数据。
    request.Period = "60"
    //查询数据的开始时间
    request.StartTime = "2018-11-25 11:00:00"
    //查询数据的结束时间
    request.EndTime = "2018-11-29 12:00:00"
    //本次查询的分页长度,每次查询最多返回1000条数据,可以更小。
    request.Length = "10"
    request.Dimensions = "[{'instanceId':'AY140613113321409088'},{'instanceId':'AY14061311320829774f'},{'instanceId':'AY14061311330190512d'}]"
    //分页的cursor,如果返回结果数据里有cursor != "",表示数据还有下一页。需要通过cursor来查询下一页。
    request.Cursor = ""

    t.Log("start query")

    for {
        response, _ := cmsClient.QueryMetricList(request)
        //response code
        if response.Code != "200" || !response.IsSuccess() {
            t.Fatalf("code:%s,success:%v,msg:%s, httpstatus:%d, response:%v\n", response.Code, response.IsSuccess(), response.Message, response.GetHttpStatus(), response)
        }

        var datapoints []map[string]interface{}
        err := json.Unmarshal([]byte(response.Datapoints), &datapoints)
        if err != nil {
            t.Fatal(err)
        }

        t.Logf("batch count %d\n", len(datapoints))
        for _, v := range datapoints {
            t.Log(v)
        }

        //如果返回的结果中cursor=="",表示没有下一页了。跳出循环,结束本轮查询
        if response.Cursor == "" {
            t.Log("循环结束")
            break
        }

        //如果有下一页,将cursor作为查询下一页的条件,赋值给request
        request.Cursor = response.Cursor
        t.Logf("--------分页cursor:%s\n", response.Cursor)
    }

    t.Log("finished")
}

本文档会陆续更新,增加其他场景

上一篇:SQL中的变量


下一篇:Tag-使用监控的新姿势