/*
* Copyright (c) 2011-2014 The original author or authors
* ------------------------------------------------------
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* The Apache License v2.0 is available at
* http://www.opensource.org/licenses/apache2.0.php
*
* You may elect to redistribute this code under either of these licenses.
*/
package io.vertx.core.spi.metrics;
import io.vertx.core.http.HttpClientRequest;
import io.vertx.core.http.HttpClientResponse;
import io.vertx.core.http.WebSocket;
import io.vertx.core.net.SocketAddress;
/**
* The http client metrics SPI that Vert.x will use to call when http client events occur.<p/>
*
* The thread model for the http server metrics depends on the actual context thats started the server.<p/>
*
* <h3>Event loop context</h3>
*
* Unless specified otherwise, all the methods on this object including the methods inherited from the super interfaces are invoked
* with the thread of the http client and therefore are the same than the
* {@link io.vertx.core.spi.metrics.VertxMetrics} {@code createMetrics} method that created and returned
* this metrics object.
*
* <h3>Worker context</h3>
*
* Unless specified otherwise, all the methods on this object including the methods inherited from the super interfaces are invoked
* with a worker thread.
*
* @author <a href="mailto:nscavell@redhat.com">Nick Scavelli</a>
*/
public interface HttpClientMetrics<R, W, S, E, T> extends TCPMetrics<S> {
/**
* Provides metrics for a particular endpoint
*
* @param host the endpoint host possibly unresolved
* @param port the endpoint port
* @param maxPoolSize the server max pool size
* @return the endpoint metric
*/
E createEndpoint(String host, int port, int maxPoolSize);
/**
* Called when an endpoint is closed.
*
* @param host the server host
* @param port the server port
* @param endpointMetric the server metric returned by {@link #createEndpoint}
*/
void closeEndpoint(String host, int port, E endpointMetric);
/**
* Called when a connection is requested.
*
* @param endpointMetric the endpoint metric returned by {@link #createEndpoint}
*/
T enqueueRequest(E endpointMetric);
/**
* Called when a request for connection is satisfied.
*
* @param endpointMetric the endpoint metric returned by {@link #createEndpoint}
*/
void dequeueRequest(E endpointMetric, T taskMetric);
/**
* Called when a connection is made to a endpoint.
*
* @param endpointMetric the endpoint metric
* @param socketMetric the socket metric
*/
void endpointConnected(E endpointMetric, S socketMetric);
/**
* Called when a connection to an endpoint is closed.
*
* @param endpointMetric the endpoint metric
* @param socketMetric the socket metric
*/
void endpointDisconnected(E endpointMetric, S socketMetric);
/**
* Called when an http client request begins. Vert.x will invoke {@link #requestEnd} when the request
* has ended or {@link #requestReset} if the request/response has failed before.
*
*
*
*
* @param endpointMetric the endpoint metric
* @param socketMetric the socket metric
* @param localAddress the local address
* @param remoteAddress the remote address
* @param request the {@link HttpClientRequest}
* @return the request metric
*/
R requestBegin(E endpointMetric, S socketMetric, SocketAddress localAddress, SocketAddress remoteAddress, HttpClientRequest request);
/**
* Callend when an http client request ends.
*
* @param requestMetric the request metric
*/
void requestEnd(R requestMetric);
/**
* Called when an http client response begins. Vert.x will invoke {@link #responseEnd} when the response has ended
* or {@link #requestReset} if the request/response has failed before.
*
* @param requestMetric the request metric
* @param response the {@link io.vertx.core.http.HttpClientResponse}
*/
void responseBegin(R requestMetric, HttpClientResponse response);
/**
* Called when an http client response is pushed.
*
* @param endpointMetric the endpoint metric
* @param socketMetric the socket metric
* @param localAddress the local address
* @param remoteAddress the remote address
* @param request the http server request
* @return the request metric
*/
R responsePushed(E endpointMetric, S socketMetric, SocketAddress localAddress, SocketAddress remoteAddress, HttpClientRequest request);
/**
* Called when the http client request couldn't complete successfully, for instance the connection
* was closed before the response was received.
*
* @param requestMetric the request metric
*/
void requestReset(R requestMetric);
/**
* Called when an http client response has ended
*
* @param requestMetric the request metric
* @param response the {@link io.vertx.core.http.HttpClientResponse}
*/
void responseEnd(R requestMetric, HttpClientResponse response);
/**
* Called when a web socket connects.
*
* @param endpointMetric the endpoint metric
* @param socketMetric the socket metric
* @param webSocket the server web socket
* @return the web socket metric
*/
W connected(E endpointMetric, S socketMetric, WebSocket webSocket);
/**
* Called when the web socket has disconnected.
*
* @param webSocketMetric the web socket metric
*/
void disconnected(W webSocketMetric);
}