override fun intercept()

in plugin-azure-server/src/main/kotlin/jetbrains/buildServer/clouds/azure/arm/throttler/AzureThrottlerInterceptor.kt [17:70]


    override fun intercept(chain: Interceptor.Chain): Response {
        val sleepTime = myThrottlerDelayInMilliseconds.get()
        if (sleepTime != 0L) {
            Thread.sleep(sleepTime)
        }

        val request = chain.request()
        val requestId = request.header(CLIENT_REQUEST_ID)

        val taskContext = tackContextProvider.getContext()
        val corellationId = "[${taskContext?.corellationId ?: "-${requestId}"}/${taskContext?.getRequestSequenceLength()?.toString() ?: "---"}]"

        LOG.debug("[$name] $corellationId Azure request starting")

        val response = chain.proceed(request)

        val remainingReads = getHeaderLongValue(response, SUBSCRIPTION_REMAINING_READS_HEADER);
        val remainingWrites = getHeaderLongValue(response, SUBSCRIPTION_REMAINING_WRITES_HEADER);
        val remainingDeletes = getHeaderLongValue(response, SUBSCRIPTION_REMAINING_DELETES_HEADER);
        val remainingResource = response.header(REMAINING_RESOURCE)
        val remainingResourceReads = getHeaderLongValue(response, SUBSCRIPTION_RESOURCE_REMAINING_READS_HEADER);
        val remainingTenantReads = getHeaderLongValue(response, TENANT_REMAINING_READS_HEADER);
        val remainingTenantResourceReads = getHeaderLongValue(response, TENANT_RESOURCE_REMAINING_READS_HEADER);
        val userQuotaRemaining = getHeaderLongValue(response, USER_QUOTA_REMAINING);
        val userQuotaResetsAfter = response.header(USER_QUOTA_RESETS_AFTER);

        val remainingReadsResult = remainingReads ?: remainingTenantReads ?: remainingResourceReads ?: remainingTenantResourceReads;


        LOG.debug("[$name] $corellationId Azure request processed: Remaining reads: $remainingReadsResult, Url: ${request.url()}")
        LOG.debug("[$name] $corellationId Azure request processed: Headers: $SUBSCRIPTION_REMAINING_READS_HEADER=$remainingReads, " +
                "$SUBSCRIPTION_REMAINING_WRITES_HEADER=$remainingWrites, " +
                "$SUBSCRIPTION_REMAINING_DELETES_HEADER=$remainingDeletes, " +
                "$REMAINING_RESOURCE=$remainingResource, " +
                "$SUBSCRIPTION_RESOURCE_REMAINING_READS_HEADER=$remainingResourceReads, " +
                "$TENANT_REMAINING_READS_HEADER=$remainingTenantReads, " +
                "$TENANT_RESOURCE_REMAINING_READS_HEADER=$remainingTenantResourceReads, ")

        userQuotaRemaining?.let {
            LOG.debug("[$name] $corellationId Azure request processed: Headers: $USER_QUOTA_REMAINING=$it, " +
                    "$USER_QUOTA_RESETS_AFTER=$userQuotaResetsAfter ")
        }

        taskContext?.increaseRequestsSequenceLength()

        remainingReadsNotifier.notifyRemainingReads(remainingReadsResult, 1)

        if (response.code() == RETRY_AFTER_STATUS_CODE) {
            val retryAfterSeconds = getRetryAfterSeconds(response, corellationId)
            LOG.info("[$name] $corellationId Azure Resource Manager read/write per hour limit reached. Will retry in: $retryAfterSeconds seconds")
            throw ThrottlerRateLimitReachedException(retryAfterSeconds ?: DEFAULT_RETRY_AFTER_SECONDS, taskContext?.getRequestSequenceLength() ?: 1)
        }
        return response
    }