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

云监控为您提供 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)方式上报数据(推荐)

准备阿里云账号

拥有阿里云账号,并生成具有云监控权限的子账号AK(使用子账号安全性更好)。

  • 创建子账号

  • 为子账号生成AccessKey ID、Access Key Secret

  • 为子账号授权云监控权限

安装阿里云命令行(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 服务器内部错误
子账号授权说明

使用子账号的AK上报事件数据时,需要对相应子账号授权云监控管理权限。如果子账号未授权云监控管理权限,上报数据时会提示“cannot upload data, please use ram to auth”。

  1. 登录RAM控制台
  2. 单击左侧导航栏中的用户 ,进入用户页面。
  3. 选择需要上报数据的子账号,在操作中单击添加权限

  4. 添加权限页面中,选择管理云监控的权限,并单击确定保存授权即可。