自定义监控为您提供了自由定义监控项及报警规则的功能,您可以针对自己关心的业务指标进行监控。通过上报监控数据的接口,将自己采集的时序数据上报到云监控,并可通过配置报警规则来接收报警通知。

云监控为您提供OpenAPI、Java SDK和阿里云命令行工具(CLI)三种方式上报监控数据。

使用限制

  • 北京、上海、杭州地域QPS限制为200,张家口、深圳地域QPS限制为100,其余地域QPS限制为50。
  • 单次最多上报100条数据,Body最大为256KB。
  • metricName字段只支持字母、数字、下划线。需要以字母开头,非字母开头会替换为大写“A”,非法字符替换为“_”。
  • dimensions字段不支持“=”、“&”、“,”,非法字符会被替换为“_”。
  • metricName dimensions的Key-value最大均为64字节,超过64字节会被截断。
  • 上报原始数据为付费功能,免费版可以上报聚合数据(即上报数据时,请求参数中type字段需传入1)。
  • 其他限制请关注计费方式

OpenAPI方式上报数据

通过接口上报原始数据后,云监控会按以下统计方式计算1分钟、5分钟的统计结果:

  • Average:平均值
  • Maximum:最大值
  • Minimum:最小值
  • Sum:求和
  • SampleCount:计数
  • SumPerSecond:求和/对应周期的秒数,也可以使用滑动平均计算
  • CountPerSecond:计数/对应周期的秒数,也可以使用滑动平均计算
  • LastValue:本上报周期最后一个采样值
  • P10:percentile 0.1,大于10%本周期所有采样数据
  • P20:percentile 0.2,大于20%本周期所有采样数据
  • P30:percentile 0.3,大于30%本周期所有采样数据
  • P40:percentile 0.4,大于40%本周期所有采样数据
  • P50:percentile 0.5,大于50%本周期所有采样数据,中位数
  • P60:percentile 0.6,大于60%本周期所有采样数据
  • P70:percentile 0.7,大于70%本周期所有采样数据
  • P75:percentile 0.75,大于75%本周期所有采样数据
  • P80:percentile 0.8,大于80%本周期所有采样数据
  • P90:percentile 0.9,大于90%本周期所有采样数据
  • P95:percentile 0.95,大于95%本周期所有采样数据
  • P98:percentile 0.98,大于98%本周期所有采样数据
  • P99:percentile 0.99,大于99%本周期所有采样数据
  • 服务地址

    公网服务地址:https://metrichub-cms-cn-hangzhou.aliyuncs.com

    内网服务地址如下:

    地域 RegionId 服务地址
    华东 1(杭州) cn-hangzhou http://metrichub-cn-hangzhou.aliyun.com
    华北 3(张家口) cn-zhangjiakou http://metrichub-cn-zhangjiakou.aliyun.com
    华东 2(上海) cn-shanghai http://metrichub-cn-shanghai.aliyun.com
    华北 2(北京) cn-beijing http://metrichub-cn-beijing.aliyun.com
    华北 1(青岛) cn-qingdao http://metrichub-cn-qingdao.aliyun.com
    华南 1(深圳) cn-shenzhen http://metrichub-cn-shenzhen.aliyun.com
    中国香港(香港) cn-hongkong http://metrichub-cn-hongkong.aliyun.com
    华北 5 (呼和浩特) cn-huhehaote http://metrichub-cn-huhehaote.aliyun.com
    中东东部 1(迪拜) me-east-1 http://metrichub-me-east-1.aliyun.com
    美国西部 1(硅谷 ) us-west-1 http://metrichub-us-west-1.aliyun.com
    美国东部 1(弗吉尼亚) us-east-1 http://metrichub-us-east-1.aliyun.com
    亚太东北 1 (日本 ) ap-northeast-1 http://metrichub-ap-northeast-1.aliyun.com
    欧洲中部 1(法兰克福) eu-central-1 http://metrichub-eu-central-1.aliyun.com
    亚太东南 2(悉尼) ap-southeast-2 http://metrichub-ap-southeast-2.aliyun.com
    亚太东南 1(新加坡) ap-southeast-1 http://metrichub-ap-southeast-1.aliyun.com
    亚太东南 3(吉隆坡) ap-southeast-3 http://metrichub-ap-southeast-3.aliyun.com
    亚太南部 1 (孟买) ap-south-1 http://metrichub-ap-south-1.aliyuncs.com
  • 请求语法
    POST /metric/custom/upload HTTP/1.1 
    Authorization:<AuthorizationString>
    Content-Length:<Content Length>
    Content-MD5:<Content MD5>
    Content-Type:application/json
    Date:<GMT Date>
    Host: metrichub-cms-cn-hangzhou.aliyuncs.com
    x-cms-signature:hmac-sha1
    x-cms-api-version:1.0
    x-cms-ip:30.27.84.196
    User-Agent:cms-java-sdk-v-1.0
    [{"groupId":0,"metricName":"diskUtilization","dimensions":{"instanceId":"xxxxxx1","disk":"/"},"time":"20190701T12345.888+0800","type":0,"period":60,"values":{"value":60}}]
  • 签名算法

    目前,上报监控数据只支持一种数字签名算法,即默认签名算法为hmac-sha1。

    1. 准备可用的阿里云访问密钥

      给 API 请求生成签名,需使用一对访问密钥(AccessKeyId/AccessKeySecret)。您可以使用已经存在的访问密钥对,也可以创建新的访问密钥对,但需要保证使用的密钥对处在启用状态。

    2. 生成请求的签名字符串

      API签名字符串由HTTP请求中的 MethodHeaderBody信息一同生成。

      SignString = VERB + "\n"
                   + CONTENT-MD5 + "\n"
                   + CONTENT-TYPE + "\n"
                   + DATE + "\n"
                   + CanonicalizedHeaders + "\n"
                   + CanonicalizedResource

      上面公式中的\n表示换行转义字符,+表示字符串连接操作,其它各个部分定义如下:

      名称 定义 示例
      VERB HTTP请求的方法名称 PUT、GET、POST等
      CONTENT-MD5 HTTP请求中Body部分的 MD5 值(必须为大写字母串) 875264590688CA6171F6228AF5BBB3D2
      CONTENT-TYPE 请求中Body部分的类型 application/json
      DATE HTTP请求中的标准时间戳头(遵循RFC 1123格式,使用GMT标准时间) Mon, 3 Jan 2010 08:33:47 GMT
      CanonicalizedHeaders 由HTTP请求中以x-cms和x-acs为前缀的自定义头构造的字符串 x-cms-api-version:0.1.0\nx-cms-signature
      CanonicalizedResource 由HTTP请求资源构造的字符串(具体构造方法见下面详述) /event/custom/upload
      上表中CanonicalizedHeaders的构造方式如下:
      1. 将所有以x-cmsx-acs为前缀的HTTP请求头的名字转换成小写字母。
      2. 将上一步得到的所有CMS自定义请求头按照字典序进行升序排序。
      3. 删除请求头和内容之间分隔符两端出现的任何空格。
      4. 将所有的头和内容用\n分隔符组合成最后的CanonicalizedHeaders。

      上表中CanonicalizedResource的构造方式如下:

      1. 将CanonicalizedResource设置为空字符串(””)。
      2. 放入要访问的URI,如/event/custom/upload
      3. 如请求包含查询字符串(QUERY_STRING),则在CanonicalizedResource字符串尾部添加 和查询字符串。

        其中QUERY_STRING是URL中请求参数按字典序排序后的字符串,其中参数名和值之间用=相隔组成字符串,并对参数名-值对按照字典序升序排序,然后以&符号连接构成字符串。其公式化描述如下:

        QUERY_STRING = "KEY1=VALUE1" + "&" + "KEY2=VALUE2"
    3. 生成请求的数字签名
      默认签名算法为hmac-sha1,整个签名公式如下:
      Signature = base16(hmac-sha1(UTF8-Encoding-Of(SignString),AccessKeySecret))
    4. 签名举例
      SignString="POST" + \n
      +"0B9BE351E56C90FED853B32524253E8B" + \n
      +"application/json" + \n
      +"Tue, 11 Dec 2018 21:05:51 +0800" + \n
      +"x-cms-api-version:1.0" + \n
      +"x-cms-ip:127.0.0.1" + \n
      +"x-cms-signature:hmac-sha1" + \n
      +"/metric/custom/upload"
      
      accesskey="testkey"
      accessSecret="testsecret" 签名密钥
      
      签名结果:1DC19ED63F755ACDE203614C8A1157EB1097E922                            
  • 请求参数
    名称 类型 必选 描述
    groupId long 应用分组的id。
    metricName string 监控项名称,支持字母、数字、连接符“_-./\”,其他为非法字符,最大长度为64字节,超过64字节时截取前64字节。
    dimensions object 维度map,key-value都为字符串, 支持字母、数字、连接符“_-./\”,键值对数量最大为10,key长度最大64字节,value长度最大64字节,超过64字节时截取前64字节。
    time string 指标发生时间,支持“yyyyMMdd’T’HHmmss.SSSZ”和long型时间戳2种方式,例如 “20171012T132456.888+0800”或“1508136760000”。
    type int

    上报数值的类型,0为原始值,1为聚合数据。

    当上报聚合数据时,建议60s、300s 周期的数据均上报,否则会无法正常查询跨度大于7天的监控数据。

    period string

    聚合周期,单位为秒。

    如果 type=1则需要传此字段,取值为60、300。

    values object 指标值集合,当type=0时,key只能为”value”,上报的是原始值,云监控会按周期将原始值聚合为多个值,比如最大、计数、求和等。

Java SDK方式上报数据(推荐)

  • Java SDK的安装
    通过maven进行安装,需要添加的依赖如下:
    <dependency>
                <groupId>com.aliyun.openservices</groupId>
                <artifactId>aliyun-cms</artifactId>
                <version>0.2.4</version>
    </dependency>
  • 响应元素

    HTTP 状态码返回 200。

  • 示例
    • 示例代码(Java)
      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.IAcsClient;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.exceptions.ServerException;
      import com.aliyuncs.profile.DefaultProfile;
      import com.google.gson.Gson;
      import java.util.*;
      import com.aliyuncs.cms.model.v20190101.*;
      
      public class PutCustomMetric {
      
          public static void main(String[] args) {
              DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
              IAcsClient client = new DefaultAcsClient(profile);
      
              PutCustomMetricRequest request = new PutCustomMetricRequest();
      
              List<PutCustomMetricRequest.MetricList> metricListList = new ArrayList<PutCustomMetricRequest.MetricList>();
      
              PutCustomMetricRequest.MetricList metricList1 = new PutCustomMetricRequest.MetricList();
              metricList1.setGroupId("0");
              metricList1.setMetricName("diskUtilization");
              metricList1.setDimensions("{\"hostName\":\"xxxxx\",\"disk\":\"/\"}");
              metricList1.setTime("20190612T132456.888 0800Z");
              metricList1.setType("0");
              metricList1.setPeriod("60");
              metricList1.setValues("{\"value\":20}");
              metricListList.add(metricList1);
              request.setMetricLists(metricListList);
      
              try {
                  PutCustomMetricResponse response = client.getAcsResponse(request);
                  System.out.println(new Gson().toJson(response));
              } catch (ServerException e) {
                  e.printStackTrace();
              } catch (ClientException e) {
                  System.out.println("ErrCode:" + e.getErrCode());
                  System.out.println("ErrMsg:" + e.getErrMsg());
                  System.out.println("RequestId:" + e.getRequestId());
              }
      
          }
      }                            
    • 示例代码(Golang)
      package main
      
      import (
          "fmt"
            "github.com/aliyun/alibaba-cloud-sdk-go/services/cms"
      
      )
      
      func main() {
          client, err := cms.NewClientWithAccessKey("cn-hangzhou", "<accessKeyId>", "<accessSecret>")
      
          request := cms.CreatePutCustomMetricRequest()
          request.Scheme = "https"
      
        request.MetricList = &[]cms.PutCustomMetricMetricList{
          {
            GroupId: "0",
            MetricName: "diskUtilization",
            Dimensions: "{"hostName":"xxxxx","disk":"/"}",
            Time: "20190612T132456.888 0800Z",
            Type: "0",
            Period: "60",
            Values: "{"value":20}",
          },
        }
      
          response, err := client.PutCustomMetric(request)
          if err != nil {
              fmt.Print(err.Error())
          }
          fmt.Printf("response is %#v\n", response)
      }                            
    • 返回示例
      {
          "Message": "success",
          "RequestId": "E25EE651-9C97-4EFD-AF22-A753B674E8D4",
          "Code": "200"
      }
    • 其他编程语言示例代码
  • 自动完成多周期聚合上报

    SDK支持在本地做聚合后再上报数据的功能,聚合周期为60秒、300秒。

    数据类型 描述 聚合的值 内存消耗(不含名称、维度,单时间序列,单聚合周期)
    value 一般值类型 除了LastValue外的所有属性 约4K
    gauge 采样值 LastValue 4字节
    meter 求和及速率 Sum、SumPerSecond 50字节
    counter 计数 SampleCount 10字节
    timer 计算时间 SampleCount、CountPerSecond、Average、Maximum、Minimum、PXX(P10-P99) 约4K
    histogram 分布 SampleCount、Average、Maximum、Minimum、PXX(P10-P99) 约4K
    //初始化
            CMSClientInit.groupId = 0L;
            CMSClient cmsClient = new CMSClient(accKey, secret, endpoint);//创建client
            CMSMetricRegistryBuilder builder = new CMSMetricRegistryBuilder();
            builder.setCmsClient(cmsClient);
            final MetricRegistry registry = builder.build();//创建registry 包含2个聚合周期
            //或者 final MetricRegistry registry = builder.build(RecordLevel._60S);//只创建1分钟聚合周期的
    //使用value
    ValueWrapper value = registry.value(MetricName.build("value"));
    value.update(6.5);
    //使用meter
    MeterWrapper meter = registry.meter(MetricName.build("meter"));
    meter.update(7.2);
    //使用counter
    CounterWrapper counter = registry.counter(MetricName.build("counter"));
    counter.inc(20);
    counter.dec(5);
    //使用timer
    TimerWrapper timer = registry.timer(MetricName.build("timer"));
    timer.update(30, TimeUnit.MILLISECONDS);
    //使用histogram
    HistogramWrapper histogram = registry.histogram(MetricName.build("histogram"));
    histogram.update(20);
    //使用gauge
    final List list = new ArrayList();
    registry.gauge(MetricName.build("gauge"), new Gauge() {
                            @Override
                            public Number getValue() {
                                return list.size();
                            }
                        });

命令行(CLI)方式上报数据

  • 准备工作
    RAM用户使用AK上报事件数据时,需要被授权云监控管理权限。具体步骤如下:
    说明

    进行操作前,请确保您已经注册了阿里云账号。如还未注册,请先完成账号注册

    1. 云账号登录RAM控制台
    2. 创建RAM用户。
      1. 在左侧导航栏的人员管理菜单下,单击用户
      2. 单击新建用户
        说明 单击添加用户,可一次性创建多个RAM用户。
      3. 输入登录名称显示名称
      4. 访问方式区域下,选择控制台密码登录编程访问
        说明 为了保障账号安全,建议仅为RAM用户选择一种登录方式,避免RAM用户离开组织后仍可以通过访问密钥访问阿里云资源。
      5. 单击确认
    3. 为RAM用户创建访问密钥。
      1. 在左侧导航栏的人员管理菜单下,单击用户
      2. 用户登录名称/显示名称列表下,单击目标RAM用户名称。
      3. 用户AccessKey 区域下,单击创建新的AccessKey
        说明 首次创建时需填写手机验证码。
      4. 单击确认
        说明
        • AccessKeySecret只在创建时显示,不提供查询,请妥善保管。
        • 若AccessKey泄露或丢失,则需要创建新的AccessKey,最多可以创建2个AccessKey。
    4. 创建RAM用户后直接为RAM用户授权。
      1. 勾选目标RAM用户,单击添加权限,被授权主体会自动填入。
      2. 在左侧权限策略名称列表下,单击需要授予RAM用户的权限策略。
        说明 在右侧区域框,选择某条策略并单击×,可撤销该策略。
      3. 单击确定
      4. 单击完成
  • 安装阿里云命令行(CLI)工具

    系统要求:Linux、UNIX或Mac OS。

    • 方式一:下载安装包

      您可以在阿里云CLIGitHub上下载最新版的CLI工具,解压后即可使用。支持Mac、Linux和Windows平台(x64版本)终端。 解压后,您可以将aliyun文件移至/usr/local/bin目录下,或添加到$PATH环境变量中。
    • 方式二:编译源码

      请先安装并配置好Golang环境,并按照如下步骤下载源码并编译。
      ```
      $ mkdir -p $GOPATH/src/github.com/aliyun
      $ cd $GOPATH/src/github.com/aliyun
      $ git clone http://github.com/aliyun/aliyun-cli.git
      $ git clone http://github.com/aliyun/aliyun-openapi-meta.git
      $ cd aliyun-cli
      $ make install
      ```
  • 配置CLI

    在使用阿里云CLI前,您需要运行aliyun configure命令配置调用阿里云资源的AccessKey、地域、语言等。 您可以在阿里云控制台的AccessKey页面创建和查看您的AccessKey,或者联系您的系统管理员获取AccessKey。

    $ aliyun configure
    Configuring profile 'default' ...
    Aliyun Access Key ID [None]: <Your AccessKey ID>
    Aliyun Access Key Secret [None]: <Your AccessKey Secret>
    Default Region Id [None]: cn-hangzhou
    Default output format [json]: json
    Default Language [zh]: zh

    多用户配置:阿里云CLI支持多用户配置。您可以使用$ aliyun configure --profile user1命令指定使用哪个账号调用云产品的API。 执行$ aliyun configure list命令可以查看当前的用户配置, 如下表所示。其中在Profile后面有星号(*)标志的为当前使用的默认用户配置。

    Profile Credential Valid Region Language
    default * AK:***f9b Valid cn-beijing zh
    aaa AK:****** Invalid - -
    test AK:***456 Valid - en
    ecs EcsRamRole:EcsTest Valid cn-beijing en

    阿里云CLI可通过在configure命令后增加--mode <authenticationMethod>参数的方式来使用不同的认证方式,目前支持的认证方式如下:

    验证方式 说明
    AK 使用AccessKey ID/Secret访问。
    StsToken 使用STS Token访问。
    RamRoleArn 使用RAM子账号的AssumeRole方式访问。
    EcsRamRole 在ECS实例上通过EcsRamRole实现免密验证。
  • 上报监控数据

    使用PutCustomMetric接口上报监控数据,示例如下:

    aliyun cms PutCustomMetric  --MetricList.1.MetricName cpu_total --MetricList.1.Dimensions '{"sampleName1":"value1","sampleName2":"value2"}' --MetricList.1.Time 1555390981421 --MetricList.1.Type 0 --MetricList.1.Period 60 --MetricList.1.Values '{"value":10.5}' --MetricList.1.GroupId "0"

    上报成功后,返回状态码200。

    {
      "Message": "success",
      "RequestId": "F69F5623-DDD6-42AE-AE59-87A2B841620B",
      "Code": "200"
    }
  • 错误编码
    错误编码 含义
    200 正常
    206

    返回信息为“reach max time series num”,表示您的可以使用的时间序列配额已用完,需要购买更多配额或删除不再使用的时间序列。

    返回信息为“not allowed original value, please upgrade service”,表示您使用的是免费版,无法使用上报原始数据的功能。

    返回信息为“type is invalid” ,type参数错误,请检查是否传入了0或1以外的数值。

    400 客户端请求中的语法错误
    403 校验失败、限速、没有授权
    500 服务器内部错误