TraceHeaderFilter.java

package no.nav.data.common.web;

import no.nav.data.common.utils.Constants;
import no.nav.data.common.utils.MdcUtils;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.web.reactive.function.client.ClientResponse;
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
import org.springframework.web.reactive.function.client.ExchangeFunction;
import reactor.core.publisher.Mono;

import java.util.Optional;

public class TraceHeaderFilter implements ExchangeFilterFunction {

    private final boolean includeAllHeaders;

    public TraceHeaderFilter(boolean includeAllHeaders) {
        this.includeAllHeaders = includeAllHeaders;
    }

    @Override
    public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
        var builder = ClientRequest.from(request);
        var correlationId = MdcUtils.getOrGenerateCorrelationId();
        builder.header(Constants.HEADER_CORRELATION_ID, correlationId);

        if (includeAllHeaders) {
            String callId = Optional.ofNullable(MdcUtils.getCallId()).orElse(correlationId);
            builder.header(Constants.HEADER_CALL_ID, callId);
            builder.header(Constants.HEADER_CONSUMER_ID, Constants.APP_ID);
        }
        return next.exchange(builder.build());
    }
}