Azure / azure-libraries-for-java

Azure Management Libraries for Java
https://docs.microsoft.com/en-us/java/azure/
MIT License
94 stars 97 forks source link

[BUG] IncomingMessages/OutgoingMessage per topic on eventhub returns nullpointerexception #1409

Closed chenfli closed 2 years ago

chenfli commented 2 years ago

Describe the bug I try to query Event Hub topic to get the number of incoming messages and I get null pointer execption. While query for the following metrics per topic returns values

SuccessfulRequests ServerErrors UserErrors QuotaExceededErrors ThrottledRequests IncomingRequests

Why is it ?

Exception or Stack Trace

|INFO|2021-11-15 16:31:18  [http-nio-8080-exec-8] c.a.e.d.s.m.AzureMetrics:49| Got Metric IncomingMessages
|ERROR|2021-11-15 16:31:18  [http-nio-8080-exec-8] o.a.c.c.C.[.[.[.[dispatcherServlet]:175| Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0] with root cause
java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
                at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
                at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
                at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
                at java.base/java.util.Objects.checkIndex(Objects.java:372)
                at java.base/java.util.ArrayList.get(ArrayList.java:459)
                at com.att.eda.dataplanemetrics.service.metrics.EventHubNameSpaceMetricsService.buildMetricCollectionJson(EventHubNameSpaceMetricsService.java:31)
                at com.att.eda.dataplanemetrics.service.metrics.EventHubNameSpaceMetricsService.getMetricsFromEventhub(EventHubNameSpaceMetricsService.java:24)
                at com.att.eda.dataplanemetrics.api.AzureEventHubMetricsController.getMetrics(AzureEventHubMetricsController.java:35)
                at jdk.internal.reflect.GeneratedMethodAccessor52.invoke(Unknown Source)
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.base/java.lang.reflect.Method.invoke(Method.java:566)
                at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
                at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
                at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
                at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
                at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
                at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
                at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
                at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
                at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
                at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
                at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
                at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
                at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
                at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
                at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
                at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
                at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
                at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
                at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
                at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
                at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
                at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
                at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
                at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
                at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:747)
                at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
                at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
                at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
                at java.base/java.lang.Thread.run(Thread.java:834)

To Reproduce Steps to reproduce the behavior: Query eventhub per topic withOdataFilter("EntityName eq '" + topic_name)

Code Snippet

    public MetricCollection getMetricsViaManager(String metricName, String topicName, String startDateTime, String endDateTime, String interval, String aggregation) {
        var nsScope = String.format(EVENT_HUB_NAMESPACE, azureConfiguration.getAzureCredentials().getSubscriptionId(),
                azureConfiguration.getEventhub().getResourceGroup(),
                azureConfiguration.getEventhub().getNamespace()
        );
        OffsetDateTime startDateTimeOffset = OffsetDateTime.parse(startDateTime);
        OffsetDateTime endDateTimeOffset = OffsetDateTime.parse(endDateTime);

        log.info("Get from NS " + nsScope);
        for (MetricDefinition metricDefinition : azureResourceManager.metricDefinitions().listByResource(nsScope)) {
            log.info("Fetchig Metric: " + metricDefinition.name().value());
            if(metricDefinition.name().value().equalsIgnoreCase(metricName)) {
                MetricDefinition.MetricsQueryDefinitionStages.WithMetricsQueryExecute wmqe = metricDefinition.defineQuery()
                        .startingFrom(startDateTimeOffset)
                        .endsBefore(endDateTimeOffset);
                if (topicName  != null) {
                    wmqe = wmqe.withOdataFilter("EntityName eq '" + topicName + "'");
                }
                if (interval != null) {
                    wmqe = wmqe.withInterval(Duration.parse(interval));
                }
                if (aggregation != null) {
                    wmqe = wmqe.withAggregation(aggregation);
                }
                MetricCollection metricCollection = wmqe.execute();
                log.info("Got Metric "+ metricDefinition.name().value());
                return metricCollection;
            }
        }
        return null;
    }

Expected behavior Run the query with MetricName IncomingMessages/OutgoingMessage per topic (not per namespace)

Screenshots If applicable, add screenshots to help explain your problem.

Setup (please complete the following information):

Additional context Add any other context about the problem here.

Information Checklist Kindly make sure that you have added all the following information above and checkoff the required fields otherwise we will treat the issuer as an incomplete report

weidongxu-microsoft commented 2 years ago

I didn't see any code on com.microsoft.azure on your stacktrace.

And which SDK are you using?

chenfli commented 2 years ago

Hi, Attached the pom part which uses azure jars.

I just wanted to know if I can get on a per topic the following metrics: IncomingMessages OutgoingMessages

Cause right now I only get
SuccessfulRequests IncomingRequests QuotaExceededErrors UserErrors ServerErrors Size

        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-identity</artifactId>
            <version>1.4.1</version>
        </dependency>

        <dependency>
            <groupId>com.azure.resourcemanager</groupId>
            <artifactId>azure-resourcemanager-eventhubs</artifactId>
            <version>2.9.0</version>
        </dependency>

        <dependency>
            <groupId>com.azure.resourcemanager</groupId>
            <artifactId>azure-resourcemanager</artifactId>
            <version>2.9.0</version>
        </dependency>

        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-core-http-netty</artifactId>
            <version>1.11.2</version>
        </dependency>
weidongxu-microsoft commented 2 years ago

@chenfli Used your code, no problem getting "IncomingMessages" with topicName = <my event hub name> I've sent 100 messages, and last metric time series have total = 100

image