All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.azure.cosmos.implementation.circuitBreaker.LocationSpecificHealthContext Maven / Gradle / Ivy

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.cosmos.implementation.circuitBreaker;

import com.azure.cosmos.implementation.DiagnosticsInstantSerializer;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.IOException;
import java.io.Serializable;
import java.time.Instant;

@JsonSerialize(using = LocationSpecificHealthContext.LocationSpecificHealthContextSerializer.class)
public class LocationSpecificHealthContext implements Serializable {

    private static final long serialVersionUID = 1L;

    private final int exceptionCountForWriteForCircuitBreaking;
    private final int successCountForWriteForRecovery;
    private final int exceptionCountForReadForCircuitBreaking;
    private final int successCountForReadForRecovery;
    private final Instant unavailableSince;
    private final LocationHealthStatus locationHealthStatus;
    private final boolean isExceptionThresholdBreached;

    LocationSpecificHealthContext(
        int successCountForWriteForRecovery,
        int exceptionCountForWriteForCircuitBreaking,
        int successCountForReadForRecovery,
        int exceptionCountForReadForCircuitBreaking,
        Instant unavailableSince,
        LocationHealthStatus locationHealthStatus,
        boolean isExceptionThresholdBreached) {

        this.successCountForWriteForRecovery = successCountForWriteForRecovery;
        this.exceptionCountForWriteForCircuitBreaking = exceptionCountForWriteForCircuitBreaking;
        this.successCountForReadForRecovery = successCountForReadForRecovery;
        this.exceptionCountForReadForCircuitBreaking = exceptionCountForReadForCircuitBreaking;
        this.unavailableSince = unavailableSince;
        this.locationHealthStatus = locationHealthStatus;
        this.isExceptionThresholdBreached = isExceptionThresholdBreached;
    }

    public boolean isExceptionThresholdBreached() {
        return this.isExceptionThresholdBreached;
    }

    public boolean isRegionAvailableToProcessRequests() {
        return this.locationHealthStatus == LocationHealthStatus.Healthy ||
            this.locationHealthStatus == LocationHealthStatus.HealthyWithFailures ||
            this.locationHealthStatus == LocationHealthStatus.HealthyTentative;
    }

    public int getExceptionCountForWriteForCircuitBreaking() {
        return this.exceptionCountForWriteForCircuitBreaking;
    }

    public int getSuccessCountForWriteForRecovery() {
        return this.successCountForWriteForRecovery;
    }

    public int getExceptionCountForReadForCircuitBreaking() {
        return this.exceptionCountForReadForCircuitBreaking;
    }

    public int getSuccessCountForReadForRecovery() {
        return this.successCountForReadForRecovery;
    }

    public Instant getUnavailableSince() {
        return this.unavailableSince;
    }

    public LocationHealthStatus getLocationHealthStatus() {
        return this.locationHealthStatus;
    }

    static class Builder {

        private int exceptionCountForWriteForCircuitBreaking;
        private int successCountForWriteForRecovery;
        private int exceptionCountForReadForCircuitBreaking;
        private int successCountForReadForRecovery;
        private Instant unavailableSince;
        private LocationHealthStatus locationHealthStatus;
        private boolean isExceptionThresholdBreached;

        public Builder() {}

        public Builder withExceptionCountForWriteForCircuitBreaking(int exceptionCountForWriteForCircuitBreaking) {
            this.exceptionCountForWriteForCircuitBreaking = exceptionCountForWriteForCircuitBreaking;
            return this;
        }

        public Builder withSuccessCountForWriteForRecovery(int successCountForWriteForRecovery) {
            this.successCountForWriteForRecovery = successCountForWriteForRecovery;
            return this;
        }

        public Builder withExceptionCountForReadForCircuitBreaking(int exceptionCountForReadForCircuitBreaking) {
            this.exceptionCountForReadForCircuitBreaking = exceptionCountForReadForCircuitBreaking;
            return this;
        }

        public Builder withSuccessCountForReadForRecovery(int successCountForReadForRecovery) {
            this.successCountForReadForRecovery = successCountForReadForRecovery;
            return this;
        }

        public Builder withUnavailableSince(Instant unavailableSince) {
            this.unavailableSince = unavailableSince;
            return this;
        }

        public Builder withLocationHealthStatus(LocationHealthStatus locationHealthStatus) {
            this.locationHealthStatus = locationHealthStatus;
            return this;
        }

        public Builder withExceptionThresholdBreached(boolean exceptionThresholdBreached) {
            isExceptionThresholdBreached = exceptionThresholdBreached;
            return this;
        }

        public LocationSpecificHealthContext build() {

            return new LocationSpecificHealthContext(
                this.successCountForWriteForRecovery,
                this.exceptionCountForWriteForCircuitBreaking,
                this.successCountForReadForRecovery,
                this.exceptionCountForReadForCircuitBreaking,
                this.unavailableSince,
                this.locationHealthStatus,
                this.isExceptionThresholdBreached);
        }
    }

    static class LocationSpecificHealthContextSerializer extends com.fasterxml.jackson.databind.JsonSerializer {

        @Override
        public void serialize(LocationSpecificHealthContext value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            gen.writeStartObject();

            gen.writeNumberField("exceptionCountForWriteForCircuitBreaking", value.exceptionCountForWriteForCircuitBreaking);
            gen.writeNumberField("exceptionCountForReadForCircuitBreaking", value.exceptionCountForReadForCircuitBreaking);
            gen.writeNumberField("successCountForWriteForRecovery", value.successCountForWriteForRecovery);
            gen.writeNumberField("successCountForReadForRecovery", value.successCountForReadForRecovery);
            gen.writePOJOField("locationHealthStatus", value.locationHealthStatus);
            gen.writeStringField("unavailableSince", toInstantString(value.unavailableSince));

            gen.writeEndObject();
        }

        private String toInstantString(Instant instant) {
            return DiagnosticsInstantSerializer.fromInstant(instant);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy