private void removeMonitoredEndpoint(Id originId) { MonitoredOrigin host = this.origins.get(originId); host.close(); LOG.info("Existing origin has been removed. Origin={}:{}", appId, host.origin.id()); metricRegistry.deregister(host.gaugeName); }
public Id id() { return origin().id(); };
@JsonProperty("id") public String id() { return origin.id().toString(); }
@JsonProperty("name") public String name() { return origin.id().toString(); }
private static String originName(Origin origin) { return name(origin.id().toString()); }
private void onEvent(Origin origin, Object event) { onEvent(origin.id(), event); }
private ConnectionsPool() { String prefix = format("origins.%s.%s.connectionspool", origin.applicationId(), origin.id()); SortedMap<String, Gauge> gauges = metrics.getGauges(); availableGauge = gauges.get(prefix + ".available-connections"); busyGauge = gauges.get(prefix + ".busy-connections"); pendingGauge = gauges.get(prefix + ".pending-connections"); }
private MonitoredOrigin changeMonitoredEndpoint(Origin origin) { MonitoredOrigin oldHost = this.origins.get(origin.id()); oldHost.close(); MonitoredOrigin newHost = new MonitoredOrigin(origin); newHost.startMonitoring(); LOG.info("Existing origin has been updated. Origin={}:{}", appId, newHost.origin); return newHost; }
private void onStateChange(OriginState oldState, OriginState newState, Object event) { if (oldState != newState) { LOG.info("Origin state change: origin=\"{}={}\", change=\"{}->{}\"", new Object[]{appId, origin.id(), oldState, newState}); if (newState == DISABLED) { stopMonitoring(); } else if (oldState == DISABLED) { startMonitoring(); } notifyStateChange(); } }
private void handleCloseEvent() { if (closed.compareAndSet(false, true)) { origins.values().forEach(host -> removeMonitoredEndpoint(host.origin.id())); this.origins = ImmutableMap.of(); notifyStateChange(); eventBus.unregister(this); } }
private Origin(com.hotels.styx.api.extension.Origin origin) { this.origin = origin; connectionsPool = new ConnectionsPool(); String prefix = format("origins.%s.%s.requests.response.status", origin.applicationId(), origin.id()); this.responsesSupplier = new ResponseCodeSupplier(metrics, METER, prefix, true); this.requests = new Requests(format("origins.%s.%s", origin.applicationId(), origin.id())); }
private MonitoredOrigin addMonitoredEndpoint(Origin origin) { MonitoredOrigin monitoredOrigin = new MonitoredOrigin(origin); metricRegistry.register(monitoredOrigin.gaugeName, (Gauge<Integer>) () -> monitoredOrigin.state().gaugeValue); monitoredOrigin.startMonitoring(); LOG.info("New origin added and activated. Origin={}:{}", appId, monitoredOrigin.origin.id()); return monitoredOrigin; }
private LiveHttpResponse addStickySessionIdentifier(LiveHttpResponse httpResponse, Origin origin) { if (this.loadBalancer instanceof StickySessionLoadBalancingStrategy) { int maxAge = stickySessionConfig.stickySessionTimeoutSeconds(); return httpResponse.newBuilder() .addCookies(newStickySessionCookie(id, origin.id(), maxAge)) .build(); } else { return httpResponse; } }
private MonitoredOrigin(Origin origin) { this.origin = origin; this.connectionPool = hostConnectionPoolFactory.create(origin); this.hostClient = hostClientFactory.create(connectionPool); this.machine = new StateMachine.Builder<OriginState>() .initialState(ACTIVE) .onInappropriateEvent((state, event) -> state) .onStateChange(this::onStateChange) .transition(ACTIVE, UnhealthyEvent.class, e -> INACTIVE) .transition(INACTIVE, HealthyEvent.class, e -> ACTIVE) .transition(ACTIVE, DisableOrigin.class, e -> DISABLED) .transition(INACTIVE, DisableOrigin.class, e -> DISABLED) .transition(DISABLED, EnableOrigin.class, e -> INACTIVE) .build(); this.gaugeName = "origins." + appId + "." + origin.id() + ".status"; }