elasticsearch-rest-7.0 instrumentation: missing throws exception causing NPE (original) (raw)

Describe the bug

When using ElasticsearchRest7Telemetry from opentelemetry-elasticsearch-rest-7.0 to wrap the RestClient, the RestClientWrapper suppresses the real Exception if the underlying RestClient throws one. RestClientWrapper returns null in this case, which could cause java.lang.NullPointerException in RestHighLevelClient.internalPerformRequest since null is not expected for RestHighLevelClient.

Maybe the problem is due to missing throw at RestClientWrapper.java#L76` and RestClientWrapper.java#L104, the caught Exception should be rethrown.

Steps to reproduce

Just run the following demo program, no need to install the Elasticsearch service.

import java.io.IOException;

import org.apache.http.HttpHost; import org.elasticsearch.client.Request; import org.elasticsearch.client.Response; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder;

import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.elasticsearch.rest.v7_0.ElasticsearchRest7Telemetry;

public class Application { public static void main(String[] args) throws IOException { RestClientBuilder restClientBuilder = RestClient.builder(HttpHost.create("http://127.0.0.1:9200")); // <-- suppose it's an unreachable host. try (RestClient lowLevelClient = restClientBuilder.build()) { RestClient enhancedRestClient = ElasticsearchRest7Telemetry.builder(GlobalOpenTelemetry.get()).build() .wrap(lowLevelClient); Response rsp = enhancedRestClient.performRequest(new Request("GET", "test/")); // <-- java.net.ConnectException is expected to be thrown here but nothing happens System.out.println(rsp); // <-- null is printed Response realRsp = lowLevelClient.performRequest(new Request("GET", "test/")); // <-- java.net.ConnectException is thrown System.out.println(realRsp);

        RestHighLevelClient highLevelClient = new RestHighLevelClient(enhancedRestClient, RestClient::close,
                Collections.emptyList()) {
        };
        System.out.println(highLevelClient.get(new GetRequest("test").id("1"), RequestOptions.DEFAULT)); // <-- java.lang.NullPointerException is thrown due to performRequest returning null
    }
}

}

Expected behavior

When it goes to enhancedRestClient.performRequest, since http://127.0.0.1:9200 is not reachable, a java.net.ConnectException should be thrown as lowLevelClient.performRequest

Actual behavior

No exception is thrown, instead, it returns null.

Javaagent or library instrumentation version

1.33.4-alpha

Environment

JDK: OpenJDK 1.8.0_412
OS: Ubuntu 22.04.4 LTS

Additional context

No response