[Azure Functions] Detected invalid time interval input
배경
- Azure Functions Time Trigger, Golang 으로 안됨
- Java 로 하려는데
client.queryResourceWithResponse(...)
에서 계속 타임아웃 - HttpTrigger 로 하니까 테스트 코드에서 에러 발견
- 어떻게 해결?
코드
...생략
OffsetDateTime now = OffsetDateTime.now();
QueryTimeInterval timeInterval = new QueryTimeInterval(now.minusMinutes(1), now);
MetricsQueryOptions options = new MetricsQueryOptions()
.setMetricNamespace("Microsoft.DBforMySQL/flexibleServers")
.setTimeInterval(timeInterval)
.setGranularity(Duration.ofMinutes(1))
.setAggregations(Arrays.asList(AggregationType.AVERAGE));
String format = String.format("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.DBforMySQL/flexibleServers/%s", subscriptionID, resourceGroupName, resourceName);
context.getLogger().info("Request sent");
Response<MetricsQueryResult> metricsQueryResultResponse = client.queryResourceWithResponse(
format,
metricName,
options,
Context.NONE);
...생략
/**
* Unit test for Function class.
*/
public class FunctionTest {
/**
* Unit test for HttpTriggerJava method.
*/
@Test
public void testHttpTriggerJava() throws Exception {
// Setup
@SuppressWarnings("unchecked")
final HttpRequestMessage<Optional<String>> req = mock(HttpRequestMessage.class);
final Map<String, String> queryParams = new HashMap<>();
queryParams.put("name", "Azure");
doReturn(queryParams).when(req).getQueryParameters();
final Optional<String> queryBody = Optional.empty();
doReturn(queryBody).when(req).getBody();
doAnswer(new Answer<HttpResponseMessage.Builder>() {
@Override
public HttpResponseMessage.Builder answer(InvocationOnMock invocation) {
HttpStatus status = (HttpStatus) invocation.getArguments()[0];
return new HttpResponseMessageMock.HttpResponseMessageBuilderMock().status(status);
}
}).when(req).createResponseBuilder(any(HttpStatus.class));
final ExecutionContext context = mock(ExecutionContext.class);
doReturn(Logger.getGlobal()).when(context).getLogger();
// Invoke
final HttpResponseMessage ret = new Function().run(req, context);
// Verify
assertEquals(HttpStatus.OK, ret.getStatus());
}
}
final HttpResponseMessage ret = new Function().run(req, context); 부분에서 에러 발생
com.azure.monitor.query.implementation.metrics.models.ErrorResponseException: Status code 400, "{"code":"BadRequest","message":"Detected invalid time interval input: 2024-08-26T09:06:21.940798 09:00/2024-08-26T09:07:21.940798 09:00, supported Iso 8601 time interval format: (Datetime/Datetime, Datetime/Duration, Duration/Datetime, Duration)"}"
.NET 에서 버그 이슈 발견 https://github.com/Azure/azure-sdk-for-net/issues/40047
해결
ㅇㅇQueryTimeInterval 를 파라미터로 넣으면 안되는데 버그 같음(?)
Duration 사용