@Override public void onError(Exception e) { logOneWayFunctionFailure(RequestContext.mapCurrent(Function.identity(), null), e); } };
@Override @Nullable public TraceContext get() { final RequestContext ctx = getRequestContextOrWarnOnce(); if (ctx == null) { return null; } if (ctx.eventLoop().inEventLoop()) { return ctx.attr(TRACE_CONTEXT_KEY).get(); } else { final TraceContext threadLocalContext = THREAD_LOCAL_CONTEXT.get(); if (threadLocalContext != null) { return threadLocalContext; } // First span on a non-request thread will use the request's TraceContext as a parent. return ctx.attr(TRACE_CONTEXT_KEY).get(); } }
public static void setup(RequestContext ctx, MeterIdPrefixFunction meterIdPrefixFunction) { if (ctx.hasAttr(ATTR_REQUEST_METRICS_SET)) { return; } ctx.attr(ATTR_REQUEST_METRICS_SET).set(true); ctx.log().addListener(log -> onRequest(log, meterIdPrefixFunction), RequestLogAvailability.REQUEST_HEADERS, RequestLogAvailability.REQUEST_CONTENT); }
private void exportAttributes(Map<String, String> out, RequestContext ctx) { if (attrs == null) { return; } for (ExportEntry<AttributeKey<?>> e : attrs) { final AttributeKey<?> attrKey = e.key; final String mdcKey = e.mdcKey; if (ctx.hasAttr(attrKey)) { final Object value = ctx.attr(attrKey).get(); if (value != null) { out.put(mdcKey, e.stringify(value)); } } } }
@Override public HttpResponse convertResponse(ServiceRequestContext ctx, Object resObj) throws Exception { try { final HttpRequest request = RequestContext.current().request(); final HttpData httpData = resObj.getClass() == Object.class ? EMPTY_RESULT : HttpData.of(Jackson.writeValueAsBytes(resObj)); return HttpResponse.of(HttpMethod.POST == request.method() ? HttpStatus.CREATED : HttpStatus.OK, MediaType.JSON_UTF_8, httpData); } catch (JsonProcessingException e) { return HttpApiUtil.newResponse(HttpStatus.INTERNAL_SERVER_ERROR, e); } } }
private static String checkRequestContext(String ignored) { RequestContext.current(); return ignored; } }
/** * Use this to ensure the trace context propagates to children. * * <p>Ex. * <pre>{@code * // Ensure the trace context propagates to children * ctx.onChild(RequestContextCurrentTraceContext::copy); * }</pre> */ public static void copy(RequestContext src, RequestContext dst) { dst.attr(TRACE_CONTEXT_KEY).set(src.attr(TRACE_CONTEXT_KEY).get()); }
@Override protected void configure(ServerBuilder sb) throws Exception { sb.gracefulShutdownTimeout(1000L, 2000L); sb.defaultRequestTimeoutMillis(0); // Disable RequestTimeoutException. sb.service("/sleep", THttpService.of( (AsyncIface) (milliseconds, resultHandler) -> RequestContext.current().eventLoop().schedule( () -> resultHandler.onComplete(milliseconds), milliseconds, MILLISECONDS))); } };
@Override protected void append(ILoggingEvent eventObject) { final RequestContext ctx = RequestContext.mapCurrent(Function.identity(), () -> null); if (ctx != null) { final State state = state(ctx); final RequestLog log = ctx.log(); final Set<RequestLogAvailability> availabilities = log.availabilities(); // Note: This equality check is extremely fast. // See RequestLogAvailabilitySet for more information. if (!availabilities.equals(state.availabilities)) { state.availabilities = availabilities; export(state, ctx, log); } final Map<String, String> originalMdcMap = eventObject.getMDCPropertyMap(); final Map<String, String> mdcMap; // Create a copy of 'state' to avoid the race between: // - the delegate appenders who iterate over the MDC map and // - this class who update 'state'. if (!originalMdcMap.isEmpty()) { mdcMap = new UnionMap<>(state.clone(), originalMdcMap); } else { mdcMap = state.clone(); } eventObject = new LoggingEventWrapper(eventObject, mdcMap); } aai.appendLoopOnAppenders(eventObject); }
/** * Returns the host name of the {@link Request}. * * @deprecated Do not use this method. Get the remote or local address from {@link #context()} or get * the authority from {@link #authority()}. * * @return the host name. {@code null} if the {@link Request} has failed even before a connection is * established. * @throws RequestLogAvailabilityException if this property is not available yet */ @Nullable @Deprecated default String host() { final RequestContext ctx = context(); final InetSocketAddress addr; if (ctx instanceof ClientRequestContext) { addr = ctx.remoteAddress(); } else { addr = ctx.localAddress(); } return addr != null ? addr.getHostString() : null; }
final Request origReq = ctx.request(); if (origReq instanceof HttpRequest) { final String authority = getAuthority(ctx, ((HttpRequest) origReq).headers()); final int port = ((InetSocketAddress) sCtx.remoteAddress()).getPort(); final String hostname = sCtx.virtualHost().defaultHostname(); if (port == ctx.sessionProtocol().defaultPort()) { authority = hostname; } else {
switch (type) { case LOCAL_IP_ADDRESS: final InetSocketAddress local = log.context().localAddress(); return local == null || local.isUnresolved() ? null : local.getAddress().getHostAddress(); if ("c".equals(variable)) { final InetSocketAddress remote = log.context().remoteAddress(); return remote == null || remote.isUnresolved() ? null : remote.getAddress().getHostAddress(); final SocketAddress ra = log.context().remoteAddress(); return ra instanceof InetSocketAddress ? ((InetSocketAddress) ra).getHostString() : null; log.context().sessionProtocol()).uriText()); return requestLine.toString();
/** * Returns the {@link Executor} that is handling the current {@link Request}. */ default Executor executor() { // The implementation is the same as eventLoop but we expose as an Executor as well given // how much easier it is to write tests for an Executor (i.e., // when(ctx.executor()).thenReturn(MoreExecutors.directExecutor())); return eventLoop(); }
@Override public <E extends Request> E request() { return delegate().request(); }
CompletableFuture.allOf(f1, f2).whenCompleteAsync((aVoid, throwable) -> { resultHandler.onComplete(f1.join() + ", and " + f2.join()); }, RequestContext.current().contextAwareExecutor()); })));
@Nullable @Override public <A extends SocketAddress> A remoteAddress() { return delegate().remoteAddress(); }
@Nullable @Override public <A extends SocketAddress> A localAddress() { return delegate().localAddress(); }
private static void onRequest(RequestLog log, MeterIdPrefixFunction meterIdPrefixFunction) { final RequestContext ctx = log.context(); final MeterRegistry registry = ctx.meterRegistry(); final MeterIdPrefix activeRequestsId = meterIdPrefixFunction.activeRequestPrefix(registry, log) .append("activeRequests"); final ActiveRequestMetrics activeRequestMetrics = MicrometerUtil.register( registry, activeRequestsId, ActiveRequestMetrics.class, (reg, prefix) -> reg.gauge(prefix.name(), prefix.tags(), new ActiveRequestMetrics(), ActiveRequestMetrics::doubleValue)); activeRequestMetrics.increment(); ctx.log().addListener(requestLog -> onResponse(requestLog, meterIdPrefixFunction, activeRequestMetrics), RequestLogAvailability.COMPLETE); }
@Override public RequestLog log() { return delegate().log(); }