本文介绍如何通过云监控的API调取函数计算的监控数据。如果您需要调取函数计算的监控数据,您可以通过API接口的相关请求参数调取,例如Project、StartTime、EndTime、Dimensions、Period、Metric。

关于API接口说明,请参见API概览

Project

函数计算监控服务指标项的数据都使用相同的Project名称:acs_fc。

使用Java SDK设置代码示例如下:

QueryMetricRequest request = new QueryMetricRequest();
request.setProject("acs_fc");

StartTime和EndTime

云监控的时间参数取值范围使用左开右闭的形式,即(StartTime, EndTime],处于边界StartTime的数据不会被获取,而处于边界EndTime的数据会被查询到。

说明 云监控数据保留时间为31天,设置的StartTime和EndTime的时间间距不能大于31天,31天前的数据是查询不到的。

关于其他时间参数信息,请参见API概览

使用Java SDK设置代码示例如下:

request.setStartTime("2017-04-26 08:00:00");
request.setEndTime("2017-04-26 09:00:00");        

Dimensions

函数计算监控服务根据函数计算资源结构和使用场景,将监控指标分为地域维度、服务维度和函数维度。不同的维度使用的Dimensions参数不同。

  • 地域维度数据的Dimensions设置如下:
    {"region": "${your_region}"}    
  • 服务维度数据的Dimensions设置如下:
    {"region": "${your_region}", "serviceName": "${your_serviceName}"}            
  • 函数维度数据的Dimensions设置如下:
    {"region": "${your_region}", "serviceName": "${your_serviceName}", "functionName": "${your_functionName}"}
说明 Dimenisons是一个JSON字符串,函数计算监控指标的Dimensions只有一对Key-Value。使用Java SDK设置代码示例如下:
request.setDimensions("{\"region\":\"your_region\"}");

Period

函数计算监控指标的聚合粒度均为60s。

使用Java SDK设置代码示例如下:

request.setPeriod("60");

Metric

使用Java SDK设置代码示例如下:

request.setMetric("your_metric");

函数计算监控指标参考手册中详细介绍的各项指标项,对应的Metric名称如下表:

指标维度Metric指标项对应名称
地域RegionTotalInvocationsTotalInvocations
RegionBillableInvocationsBillableInvocations
RegionThrottlesThrottles
RegionClientErrorsClientErrors
RegionServerErrorsServerErrors
RegionBillableInvocationsRateBillableInvocations占比
RegionThrottlesRateThrottles占比
RegionClientErrorsRateClientErrors占比
RegionServerErrorsRateServerErrors占比
服务ServiceTotalInvocationsTotalInvocations
ServiceBillableInvocationsBillableInvocations
ServiceThrottlesThrottles
ServiceClientErrorsClientErrors
ServiceServerErrorsServerErrors
ServiceBillableInvocationsRateBillableInvocations占比
ServiceThrottlesRateThrottles占比
ServiceClientErrorsRateClientErrors占比
ServiceServerErrorsRateServerErrors占比
函数FunctionTotalInvocationsTotalInvocations
FunctionBillableInvocationsBillableInvocations
FunctionThrottlesThrottles
FunctionFunctionErrorsFunctionErrors
FunctionClientErrorsClientErrors
FunctionServerErrorsServerErrors
FunctionBillableInvocationsRateBillableInvocations占比
FunctionThrottlesRateThrottles占比
FunctionFunctionErrorsRateFunctionErrors占比
FunctionClientErrorsRateClientErrors占比
FunctionServerErrorsRateServerErrors占比
FunctionAvgDuration平均Duration
FunctionMaxMemoryUsage最大内存使用

使用示例

pom.xml示例如下:

...
    <dependencies>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-cms</artifactId>
            <version>5.0.1</version>
        </dependency>
    </dependencies>
...
            

代码示例如下:

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.cms.model.v20170301.QueryMetricListRequest;
import com.aliyuncs.cms.model.v20170301.QueryMetricListResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

public class MonitorService {
    public static void main(String[] args) {
        /*
        阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
        建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
        本示例以将AccessKey和AccessSecretKey保存在环境变量中实现身份验证为例。
        运行本示例前请先在本地环境中设置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        在FC Runtime运行环境下,配置执行权限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET环境变量会被自动设置。
        */
        String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        String accessSecretKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKey, accessSecretKey);
        IAcsClient client = new DefaultAcsClient(profile);


        QueryMetricListRequest request = new QueryMetricListRequest();
        request.setProject("acs_fc");
        request.setPeriod("60");
        request.setStartTime("2017-04-26 16:20:00");
        request.setEndTime("2017-04-26 16:30:00");
        request.setAcceptFormat(FormatType.JSON);

        try {
            // Region维度JSONObject dim = new JSONObject();
            request.setMetric("RegionTotalInvocations");  // 选择metric。
            dim.put("region", "<your_region>");  // 如: cn-shanghai
            request.setDimensions(dim.toJSONString());
            QueryMetricListResponse response = client.getAcsResponse(request);
            System.out.println(response.getCode());
            System.out.println(response.getMessage());
            System.out.println(response.getRequestId());
            System.out.println(response.getDatapoints());

            // Service维度dim = new JSONObject();
            request.setMetric("ServiceTotalInvocations");  // 选择metric。
            dim.put("region", "<your_region>");
            dim.put("serviceName", "<your_service_name>");
            request.setDimensions(dim.toJSONString());
            response = client.getAcsResponse(request);
            System.out.println(response.getCode());
            System.out.println(response.getMessage());
            System.out.println(response.getRequestId());
            System.out.println(response.getDatapoints());

            // Function维度dim = new JSONObject();
            request.setMetric("FunctionTotalInvocations");  // 选择metric。
            dim.put("region", "<your_region>");
            dim.put("serviceName", "<your_service_name>");
            dim.put("functionName", "<your_function_name>");
            request.setDimensions(dim.toJSONString());
            response = client.getAcsResponse(request);
            System.out.println(response.getCode());
            System.out.println(response.getMessage());
            System.out.println(response.getRequestId());
            System.out.println(response.getDatapoints());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}