All Downloads are FREE. Search and download functionalities are using the official Maven repository.

no.nav.apiapp.rest.NavMetricsProvider Maven / Gradle / Ivy

package no.nav.apiapp.rest;

import io.micrometer.core.instrument.MeterRegistry;
import no.nav.metrics.MetodeTimer;
import no.nav.metrics.MetricsFactory;
import org.glassfish.jersey.server.model.Invocable;
import org.glassfish.jersey.server.spi.internal.ResourceMethodInvocationHandlerProvider;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;

public class NavMetricsProvider implements ResourceMethodInvocationHandlerProvider, ContainerResponseFilter {

    private static final String METRICS_DATA_PROPERTY = "metrics_data";

    private final MeterRegistry meterRegistry = MetricsFactory.getMeterRegistry();

    @Inject
    private Provider containerRequestContextProvider;

    @Override
    public InvocationHandler create(Invocable invocable) {
        return this::invokeWithMetrics;
    }

    private Object invokeWithMetrics(Object proxy, Method method, Object[] args) throws Throwable {
        containerRequestContextProvider.get().setProperty(METRICS_DATA_PROPERTY, new Data(method));
        return MetodeTimer.timeMetode(() -> method.invoke(proxy, args), timerNavn(method));
    }

    private String timerNavn(Method method) {
        return "rest.server." + method.getDeclaringClass().getSimpleName() + "." + method.getName();
    }

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
        Data data = (Data) requestContext.getProperty(METRICS_DATA_PROPERTY);
        if (data != null) {
            Method method = data.method;
            meterRegistry.timer(
                    "rest_server",
                    "class",
                    method.getDeclaringClass().getSimpleName(),
                    "method",
                    method.getName(),
                    "status",
                    Integer.toString(responseContext.getStatus())
            ).record(System.currentTimeMillis() - data.invocationTimestamp, TimeUnit.MILLISECONDS);
        }
    }

    private static class Data {
        private final long invocationTimestamp = System.currentTimeMillis();
        private final Method method;

        private Data(Method method) {
            this.method = method;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy