Skip to main content

[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 사용