aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/org/onap/portal/history/logging/ReactiveRequestLoggingFilter.java
blob: 059e573143920c1f86cd57d422f2427e108dcc95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 *
 * Copyright (c) 2023. Deutsche Telekom AG
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 *
 */

package org.onap.portal.history.logging;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Component
@RequiredArgsConstructor
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public class ReactiveRequestLoggingFilter implements WebFilter {

  private final LoggerProperties loggerProperties;

  @Override
  public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    if (loggingDisabled(exchange)) {
      return chain.filter(exchange);
    }

    var logMessageMetadata =
        WebExchangeUtils.getRequestMetadata(exchange, loggerProperties.traceIdHeaderName());

    LoggingHelper.info(log, logMessageMetadata, "RECEIVED");

    var invocationStart = LocalDateTime.now();
    return chain
        .filter(exchange)
        .doOnTerminate(
            () -> {
              logMessageMetadata.put(
                  LogContextVariable.STATUS,
                  exchange.getResponse().getStatusCode().isError()
                      ? StatusCode.ERROR.name()
                      : StatusCode.COMPLETE.name());
              logMessageMetadata.put(
                  LogContextVariable.HTTP_STATUS,
                  String.valueOf(exchange.getResponse().getStatusCode().value()));
              logMessageMetadata.put(
                  LogContextVariable.EXECUTION_TIME,
                  String.valueOf(
                      Duration.between(invocationStart, LocalDateTime.now()).toMillis()));
            })
        .doOnSuccess(res -> LoggingHelper.info(log, logMessageMetadata, "FINISHED"))
        .doOnError(
            ex -> LoggingHelper.warn(log, logMessageMetadata, "FAILED: {}", ex.getMessage()));
  }

  private boolean loggingDisabled(ServerWebExchange exchange) {
    boolean loggingDisabled = loggerProperties.enabled() == null || !loggerProperties.enabled();

    boolean urlShouldBeSkipped =
        WebExchangeUtils.matchUrlsPatternsToPath(loggerProperties.excludePaths(), exchange.getRequest().getPath().value());

    return loggingDisabled || urlShouldBeSkipped;
  }
}