/*
 * Copyright 2012-2019 the original author or authors.
 *
 * 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
 *
 *      https://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.
 */

package org.springframework.boot.actuate.trace.http;

import java.net.URI;
import java.time.Instant;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.util.StringUtils;

A trace event for handling of an HTTP request and response exchange. Can be used for analyzing contextual information such as HTTP headers.
Author:Dave Syer, Andy Wilkinson
Since:2.0.0
/** * A trace event for handling of an HTTP request and response exchange. Can be used for * analyzing contextual information such as HTTP headers. * * @author Dave Syer * @author Andy Wilkinson * @since 2.0.0 */
public final class HttpTrace { private final Instant timestamp; private volatile Principal principal; private volatile Session session; private final Request request; private volatile Response response; private volatile Long timeTaken;
Creates a fully-configured HttpTrace instance. Primarily for use by HttpTraceRepository implementations when recreating a trace from a persistent store.
Params:
  • request – the request
  • response – the response
  • timestamp – the timestamp of the request-response exchange
  • principal – the principal, if any
  • session – the session, if any
  • timeTaken – the time taken, in milliseconds, to complete the request-response exchange, if known
Since:2.1.0
/** * Creates a fully-configured {@code HttpTrace} instance. Primarily for use by * {@link HttpTraceRepository} implementations when recreating a trace from a * persistent store. * @param request the request * @param response the response * @param timestamp the timestamp of the request-response exchange * @param principal the principal, if any * @param session the session, if any * @param timeTaken the time taken, in milliseconds, to complete the request-response * exchange, if known * @since 2.1.0 */
public HttpTrace(Request request, Response response, Instant timestamp, Principal principal, Session session, Long timeTaken) { this.request = request; this.response = response; this.timestamp = timestamp; this.principal = principal; this.session = session; this.timeTaken = timeTaken; } HttpTrace(TraceableRequest request) { this.request = new Request(request); this.timestamp = Instant.now(); } public Instant getTimestamp() { return this.timestamp; } void setPrincipal(java.security.Principal principal) { if (principal != null) { this.principal = new Principal(principal.getName()); } } public Principal getPrincipal() { return this.principal; } public Session getSession() { return this.session; } void setSessionId(String sessionId) { if (StringUtils.hasText(sessionId)) { this.session = new Session(sessionId); } } public Request getRequest() { return this.request; } public Response getResponse() { return this.response; } void setResponse(Response response) { this.response = response; } public Long getTimeTaken() { return this.timeTaken; } void setTimeTaken(long timeTaken) { this.timeTaken = timeTaken; }
Trace of an HTTP request.
/** * Trace of an HTTP request. */
public static final class Request { private final String method; private final URI uri; private final Map<String, List<String>> headers; private final String remoteAddress; private Request(TraceableRequest request) { this(request.getMethod(), request.getUri(), request.getHeaders(), request.getRemoteAddress()); }
Creates a fully-configured Request instance. Primarily for use by HttpTraceRepository implementations when recreating a request from a persistent store.
Params:
  • method – the HTTP method of the request
  • uri – the URI of the request
  • headers – the request headers
  • remoteAddress – remote address from which the request was sent, if known
Since:2.1.0
/** * Creates a fully-configured {@code Request} instance. Primarily for use by * {@link HttpTraceRepository} implementations when recreating a request from a * persistent store. * @param method the HTTP method of the request * @param uri the URI of the request * @param headers the request headers * @param remoteAddress remote address from which the request was sent, if known * @since 2.1.0 */
public Request(String method, URI uri, Map<String, List<String>> headers, String remoteAddress) { this.method = method; this.uri = uri; this.headers = new LinkedHashMap<>(headers); this.remoteAddress = remoteAddress; } public String getMethod() { return this.method; } public URI getUri() { return this.uri; } public Map<String, List<String>> getHeaders() { return this.headers; } public String getRemoteAddress() { return this.remoteAddress; } }
Trace of an HTTP response.
/** * Trace of an HTTP response. */
public static final class Response { private final int status; private final Map<String, List<String>> headers; Response(TraceableResponse response) { this(response.getStatus(), response.getHeaders()); }
Creates a fully-configured Response instance. Primarily for use by HttpTraceRepository implementations when recreating a response from a persistent store.
Params:
  • status – the status of the response
  • headers – the response headers
Since:2.1.0
/** * Creates a fully-configured {@code Response} instance. Primarily for use by * {@link HttpTraceRepository} implementations when recreating a response from a * persistent store. * @param status the status of the response * @param headers the response headers * @since 2.1.0 */
public Response(int status, Map<String, List<String>> headers) { this.status = status; this.headers = new LinkedHashMap<>(headers); } public int getStatus() { return this.status; } public Map<String, List<String>> getHeaders() { return this.headers; } }
Session associated with an HTTP request-response exchange.
/** * Session associated with an HTTP request-response exchange. */
public static final class Session { private final String id;
Creates a Session.
Params:
  • id – the session id
Since:2.1.0
/** * Creates a {@code Session}. * @param id the session id * @since 2.1.0 */
public Session(String id) { this.id = id; } public String getId() { return this.id; } }
Principal associated with an HTTP request-response exchange.
/** * Principal associated with an HTTP request-response exchange. */
public static final class Principal { private final String name;
Creates a Principal.
Params:
  • name – the name of the principal
Since:2.1.0
/** * Creates a {@code Principal}. * @param name the name of the principal * @since 2.1.0 */
public Principal(String name) { this.name = name; } public String getName() { return this.name; } } }