文档首页 > > API参考> API> 监控> 添加监控数据

添加监控数据

分享
更新时间: 2019/09/29 GMT+08:00

功能介绍

该接口用于向服务端添加一条或多条监控数据。

URI

POST /v1/{project_id}/ams/report/metricdata

参数说明请参见表1

表1 参数说明

参数

是否必选

描述

project_id

租户从IAM申请到的projectid,一般为32位字符串。

请求消息

请求参数

请求参数如表2所示。

表2 请求参数

参数

是否必选

参数类型

取值范围

描述

metric

Object

请参见表3

指标数据。

values

Object

请参见表4

-

collect_time

String

UNIX时间戳,单位毫秒。

数据收集时间需要满足:

当前UTC时间减去collect_time小于等于24小时或者collect_time减去当前UTC时间小于等于30分钟。

若数据上报时间早于当天8点,则指标监控页面只显示当天8点后的数据。

表3 metric数据结构说明

参数名称

是否必选

参数类型

取值范围

描述

namespace

String

格式为service.item;service和item必须是字符串,必须以字母开头,只能包含0-9/a-z/A-Z/_,总长度最短为3,最大为32,service不能为“PAAS”。

指标命名空间。

dimensions

Array

单个维度为json对象,结构说明如下

dimension.name:长度最短为1,最大为32。

dimension.value:长度最短为1,最大为64。

指标维度列表。

表4 values数据结构说明

参数名称

是否必选

参数类型

取值范围

描述

unit

String

-

数据的单位。

metric_name

String

-

指标名称。

type

String

只能是"int"或"float"。

数据的类型。

value

Float

有效的数值类型

指标数据的值。

Header说明

请求消息头(Header)如表5所示。

表5 Header说明

名称

是否必选

说明

X-Auth-Token

从IAM服务获取的用户Token。

Content-Type

指定类型为application/json。

请求示例

[ 
    { 
        "metric": { 
            "namespace": "NOPAAS.ESC", 
            "dimensions": [ 
                { 
                    "name": "instance_id", 
                    "value": "instance-101" 
                } 
            ] 
        }, 
        "values": [ 
            { 
                "unit": "percent", 
                "metric_name": "cpu_util", 
                "type": "int", 
                "value": 35 
            } 
        ], 
        "collect_time": 1467787152000 
    } 
]

java样例代码

package com.huawei.monitor.metricsvc.cloudmiddleware;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import com.huawei.bsp.log.OssLog;
import com.huawei.bsp.log.OssLogFactory;
import com.huawei.monitor.metricsvc.auth.QuerySvcTokenUtil;
import com.cloud.sdk.auth.signer.Signer;
import com.cloud.sdk.auth.signer.SignerFactory;
import com.cloud.sdk.http.HttpMethodName;
import com.cloud.sdk.DefaultRequest;
import com.cloud.sdk.Request;
import com.cloud.sdk.auth.credentials.BasicCredentials;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.SSLContext;
import org.apache.commons.lang.StringUtils;
import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class ReportMetricdata
{
    // 日志类
    private static final OssLog LOG = OssLogFactory.getLog(ReportMetricdata.class);

    private static CloseableHttpClient client = null;

    private static final String HTTPS_PREFIX = "https://";

    private static String serviceName = "aom";

    //区域ID
    private static String region = "regionid";

    // AK的值
    private static String ak = "ZIRRKMTWP******1WKNKB";

    // SK的值
    private static String sk = "Us0mdMNHk******YrRCnW0ecfzl";

    // 添加监控数据接口uri
    private static final String AMS_REPORT_METRIC_DATA_URL = "/v1/{project_id}/ams/report/metricdata";

    // AOM服务的Endpoint,不同区域Endpoint不同,建议配置在环境变量中
    private static String aom_endpoint = "aom.regionid.myhuaweicloud.com";

    /**
     * AOM Report Metric Data Method
     *
     * @param projectId
     *            工程ID
     * @param sendData
     *            要发送的数据
     */
    public static void reportMetricDataToAMS(String projectId, String sendData)
    {
        try
        {
            if (StringUtils.isBlank(projectId))
            {
                LOG.warn("project_id is empty.");
                return;
            }
            if (StringUtils.isBlank(aom_endpoint))
            {
                LOG.warn("aom_endpoint is blank");
                return;
            }
            String endpointUrl = HTTPS_PREFIX + aom_endpoint + AMS_REPORT_METRIC_DATA_URL;
            endpointUrl = endpointUrl.replaceAll("\\{project_id\\}", projectId);// https://aom.regionid.myhuaweicloud.com/v1/{project_id}/ams/report/metricdata
            URL url = null;
            try
            {
                url = new URL(endpointUrl);
            }
            catch (MalformedURLException e)
            {
                e.printStackTrace();
            }
            // 请求Header,必填
            Map<String, String> header = new HashMap<String, String>();
            header.put("content-Type", "application/json");
            // header.put("X-Auth-Token", QuerySvcTokenUtil.getToken());
            InputStream content = new ByteArrayInputStream(sendData.getBytes());
            // POST请求
            HttpResponse rsp = access(url, header, content, (long) sendData.getBytes().length, HttpMethodName.POST);
            if (rsp.getEntity() != null && rsp.getEntity().getContent() != null)
            {
                // 返回值 {"errorCode":
                // "SVCSTG.AMS.2000","errorMessage":"success"}代表成功。
                LOG.warn("report metricdata success :{}", rsp);
            }
        }
        catch (Throwable e)
        {
            LOG.error("Exception in ReportMetricdataToAMS", e);
        }
    }

    private static HttpResponse access(URL url, Map<String, String> headers, InputStream content, Long contentLength, HttpMethodName httpMethod)
            throws Exception
    {
        Request request = new DefaultRequest("aom");
        request.setEndpoint(url.toURI());
        request.setHttpMethod(httpMethod);
        if (headers != null)
        {
            request.setHeaders(headers);
        }
        request.setContent(content);
        Signer signer = SignerFactory.getSigner(serviceName, region);
        //用户的AK/SK
        signer.sign(request, new BasicCredentials(ak, sk));
        HttpRequestBase httpRequestBase = createRequest(url, null, request.getContent(), contentLength, httpMethod);
        Map<String, String> requestHeaders = request.getHeaders();
        for (String key : requestHeaders.keySet())
        {
            if (key.equalsIgnoreCase(HttpHeaders.CONTENT_LENGTH.toString()))
            {
                continue;
            }
            httpRequestBase.addHeader(key, requestHeaders.get(key));
        }
        HttpResponse response = null;
        // SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null,
        // new TrustSelfSignedStrategy()).useTLS().build();
        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()
        {
            @Override
            public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
            {
                return true;
            }
        }).useTLS().build();
        SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, new AllowAllHostnameVerifier());
        client = HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build();
        response = client.execute(httpRequestBase);
        return response;
    }

    private static HttpRequestBase createRequest(URL url, Header header, InputStream content, Long contentLength, HttpMethodName httpMethod)
    {
        HttpRequestBase httpRequest;
        if (httpMethod == HttpMethodName.POST)
        {
            HttpPost postMethod = new HttpPost(url.toString());
            if (content != null)
            {
                InputStreamEntity entity = new InputStreamEntity(content, contentLength);
                postMethod.setEntity(entity);
            }
            httpRequest = postMethod;
        }
        else
        {
            throw new RuntimeException("Unknown HTTP method name: " + httpMethod);
        }
        httpRequest.addHeader(header);
        return httpRequest;
    }

    public static void main(String[] args)
    {
        // 原始数据
        String projectId = "projectid00045678912345678912345";// 租户从IAM申请到的projectid,一般为32位字符串
        String namespace = "NOPAAS.ESC";// 指标命名空间。格式为service.item;service和item必须是字符串,必须以字母开头,只能包含0-9/a-z/A-Z/_,总长度最短为3,最大为32,service不能为“PAAS”。
        String dimensionName = "instance_id";// 维度名称。长度最短为1,最大为32。
        String instanceid = "instance-101";// 维度名称对应的值。长度最短为1,最大为64。
        String unit = "percent";// 单位
        String metricName = "cpu_util";// 指标名称
        String type = "int";// 数据的类型。只能是"int"或"float"。
        double value = 35;// 指标数据的值。要求为有效的数值类型。
        long collectTime = 1467787152000L;// UNIX时间戳,单位毫秒。

        // 转换为所需格式
        JSONArray request = new JSONArray();
        JSONObject requestObj = new JSONObject();
        // metric部分
        JSONObject metricObj = new JSONObject();
        metricObj.put("namespace", namespace);
        ArrayList<Object> dimensions = new ArrayList<>();
        JSONObject dimension = new JSONObject();
        dimension.put("name", dimensionName);
        dimension.put("value", instanceid);
        dimensions.add(dimension);
        metricObj.put("dimensions", dimensions);
        // values部分
        ArrayList<Object> values = new ArrayList<>();
        JSONObject valueObj = new JSONObject();
        valueObj.put("unit", unit);
        valueObj.put("metric_name", metricName);
        valueObj.put("type", type);
        valueObj.put("value", value);
        values.add(valueObj);

        requestObj.put("metric", metricObj);
        requestObj.put("values", values);
        requestObj.put("collect_time", collectTime);
        request.add(requestObj);
        reportMetricDataToAMS(projectId, request.toString());
    }
}

响应消息

响应参数

响应参数如表6所示。

表6 响应参数

参数名称

类型

描述

errorCode

String

响应码。

errorMessage

String

响应信息描述。

响应示例

{ 
    "errorCode": "SVCSTG.AMS.2000", 
    "errorMessage": "success" 
}

状态码

  • 正常

    状态码如表7所示。

    表7 状态码

    状态码

    编码

    描述

    200

    OK

    请求响应成功。

  • 异常

    状态码如表8所示。更多状态码请见状态码

    表8 状态码

    状态码

    编码

    描述

    400

    BadRequest

    非法请求。

    建议直接修改该请求,不要重试该请求。

    401

    Unauthorized

    在客户端提供认证信息后,返回该状态码,表明服务端指出客户端所提供的认证信息不正确或非法。

    403

    Forbidden

    请求被拒绝访问。

    返回该状态码,表明请求能够到达服务端,且服务端能够理解用户请求,但是拒绝做更多的事情,因为该请求被设置为拒绝访问,建议直接修改该请求,不要重试该请求。

    500

    InternalServerError

    表明服务端能被请求访问到,但是不能理解用户的请求。

    503

    ServiceUnavailable

    被请求的服务无效。

    建议直接修改该请求,不要重试该请求。

错误码

表9 错误码

错误码

错误信息

处理措施

SVCSTG_AMS_4000001

Invalid request parameter.

请检查对应的参数是否符合要求。

SVCSTG_AMS_4000002

Invalid namespace.

请检查对应的参数是否符合要求。

SVCSTG_AMS_4000003

Dimensions are left blank.

请检查对应的参数是否符合要求。

SVCSTG_AMS_4000005

Invalid metric data type.

请检查对应的参数是否符合要求。

SVCSTG_AMS_4000006

The metric data value is left blank.

请检查对应的参数是否符合要求。

SVCSTG_AMS_4000007

Invalid name or value length in the dimension.

请检查对应的参数是否符合要求。

SVCSTG_AMS_4000008

The request exceeds 40 KB.

请检查对应的参数是否符合要求。

SVCSTG_AMS_4000009

A metric supports a maximum of 20 dimensions.

请检查对应的参数是否符合要求。

SVCSTG_AMS_4000010

Invalid collection time.

请检查对应的参数是否符合要求。

SVCSTG_AMS_5000000

Internal server error.

请联系管理员解决。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区