英文:
Unable to collect data from metric query language MQL - GCP
问题
我想使用以下库执行 MQL(指标查询语言)。
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-monitoring</artifactId>
    <version>v3-rev540-1.25.0</version>
</dependency>
以下是我的代码片段。它将创建监控客户端,并尝试从 GCP 监控收集数据。
public void queryTimeSeriesData() throws IOException {
    // 创建监控
    Monitoring m = createAuthorizedMonitoringClient();
    QueryTimeSeriesRequest req  = new QueryTimeSeriesRequest();
    String query = "fetch consumed_api\n" + 
        "| metric 'serviceruntime.googleapis.com/api/request_count'\n" + 
        "| align rate(2m)\n" + 
        "| every 2m\n" + 
        "| group_by [metric.response_code],\n" + 
        "    [value_request_count_max: max(value.request_count)]";
    
    req.setQuery(query);
    HashMap<String, Object> queryTransformationSpec = new HashMap<String, Object>();
    HashMap<String, Object> timingState =  new HashMap<String, Object>();
    HashMap<String, Object> absoluteWindow = new HashMap<String, Object>();
    absoluteWindow.put("startTime", "2020-09-03T12:40:00.000Z");
    absoluteWindow.put("endTime", "2020-09-03T13:41:00.000Z");
    timingState.put("absoluteWindow", absoluteWindow);
    timingState.put("graphPeriod", "60s");
    timingState.put("queryPeriod", "60s");
    queryTransformationSpec.put("timingState", timingState);
    
    
    req.set("queryTransformationSpec", queryTransformationSpec);
    req.set("reportPeriodicStats", false);
    req.set("reportQueryPlan", false);
    
    QueryTimeSeriesResponse res = m.projects().timeSeries().query("projects/MY_PROJECT_NAME", req).execute();
    System.out.println(res);
}
上述代码运行良好,但未返回给定 startTime 和 endTime 的数据,它总是返回最新的可用数据点。我的代码有问题吗?
英文:
I want to execute MQL (metric query language) using below library.
<dependency>
	<groupId>com.google.apis</groupId>
	<artifactId>google-api-services-monitoring</artifactId>
	<version>v3-rev540-1.25.0</version>
</dependency>
Here is my code snippet. which will create monitoring client and will try to collect data from GCP monitoring.
public void queryTimeSeriesData() throws IOException {
		// create monitoring 
	    Monitoring m = createAuthorizedMonitoringClient();
	    QueryTimeSeriesRequest req  = new QueryTimeSeriesRequest();
	    String query = "fetch consumed_api\n" + 
	    		"| metric 'serviceruntime.googleapis.com/api/request_count'\n" + 
	    		"| align rate(2m)\n" + 
	    		"| every 2m\n" + 
	    		"| group_by [metric.response_code],\n" + 
	    		"    [value_request_count_max: max(value.request_count)]";
	    
	    req.setQuery(query);
	    HashMap<String, Object> queryTransformationSpec = new HashMap<String, Object>();
	    HashMap<String, Object> timingState =  new HashMap<String, Object>();
	    HashMap<String, Object> absoluteWindow = new HashMap<String, Object>();
	    absoluteWindow.put("startTime", "2020-09-03T12:40:00.000Z");
	    absoluteWindow.put("endTime", "2020-09-03T13:41:00.000Z");
	    timingState.put("absoluteWindow", absoluteWindow);
	    timingState.put("graphPeriod", "60s");
	    timingState.put("queryPeriod", "60s");
	    queryTransformationSpec.put("timingState", timingState);
	    
	    
	    req.set("queryTransformationSpec", queryTransformationSpec);
	    req.set("reportPeriodicStats", false);
	    req.set("reportQueryPlan", false);
	    
	    QueryTimeSeriesResponse res = m.projects().timeSeries().query("projects/MY_PROJECT_NAME", req).execute();
	    System.out.println(res);
	}
Above code is working fine but its not returning data of given startTime and endTime ,
It always returns latest datapoint available. is there any problem with my code ?
答案1
得分: 3
发现了使用给定时间范围执行MQL查询的方法。新的工作代码如下:
public void queryTimeSeriesData() throws IOException {
        // 创建监控实例
        Monitoring m = createAuthorizedMonitoringClient();
        QueryTimeSeriesRequest req  = new QueryTimeSeriesRequest();
	    String query = "fetch consumed_api\n" + 
	    		"| metric 'serviceruntime.googleapis.com/api/request_count'\n" + 
	    		"| align rate(5m)\n" + 
	    		"| every 5m\n" + 
	    		"| group_by [metric.response_code],\n" + 
	    		"    [value_request_count_max: max(value.request_count)]" + 
	    		"| within   d'2020/09/03-12:40:00', d'2020/09/03-12:50:00'\n";
        
        req.setQuery(query);
        QueryTimeSeriesResponse res = m.projects().timeSeries().query("projects/MY_PROJECT_NAME", req).execute();
        System.out.println(res);
    }
在查询中使用within运算符将查询的起始时间和结束时间包含在查询中。根据Google MQL查询的文档:
> within - 指定查询输出的时间范围。
英文:
Found way to execute MQL query with given time range. The
new working code is the following:
public void queryTimeSeriesData() throws IOException {
        // create monitoring 
        Monitoring m = createAuthorizedMonitoringClient();
        QueryTimeSeriesRequest req  = new QueryTimeSeriesRequest();
	    String query = "fetch consumed_api\n" + 
	    		"| metric 'serviceruntime.googleapis.com/api/request_count'\n" + 
	    		"| align rate(5m)\n" + 
	    		"| every 5m\n" + 
	    		"| group_by [metric.response_code],\n" + 
	    		"    [value_request_count_max: max(value.request_count)]" + 
	    		"| within   d'2020/09/03-12:40:00', d'2020/09/03-12:50:00'\n";
        
        req.setQuery(query);
        QueryTimeSeriesResponse res = m.projects().timeSeries().query("projects/MY_PROJECT_NAME", req).execute();
        System.out.println(res);
    }
Included query start time and end time in query itself by using within operator. As per google docs for MQL queries:
> within - Specifies the time range of the query output.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论