كيف يمكنني العثور على وقت الاستجابة لطلب HTTP من خلال المقبس

StackOverflow https://stackoverflow.com/questions/68999

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أستخدم مقبس Java متصلاً بالخادم.إذا قمت بإرسال طلب HEADER http، فكيف يمكنني قياس وقت الاستجابة من الخادم؟هل يجب علي استخدام مؤقت جافا المتوفر، أم أن هناك طريقة أسهل؟

أبحث عن إجابة قصيرة، ولا أريد استخدام بروتوكولات أخرى وما إلى ذلك.من الواضح أنني لا أرغب في الحصول على حل يربط تطبيقي بنظام تشغيل معين.إرضاء الناس، حلول IN-CODE فقط.

هل كانت مفيدة؟

المحلول

أود أن أقول إن ذلك يعتمد على الفاصل الزمني المحدد الذي تحاول قياسه، ومقدار الوقت من آخر بايت من الطلب الذي ترسله حتى البايت الأول من الاستجابة التي تتلقاها؟أو حتى يتم استلام الرد كاملا؟أم أنك تحاول قياس الوقت من جانب الخادم فقط؟

إذا كنت تحاول قياس وقت المعالجة من جانب الخادم فقط، فسوف تجد صعوبة في حساب مقدار الوقت الذي تقضيه في نقل الشبكة حتى يصل طلبك ويعود الرد.بخلاف ذلك، نظرًا لأنك تدير الطلب بنفسك من خلال مقبس، يمكنك قياس الوقت المنقضي بين أي لحظتين عن طريق التحقق من ساعة النظام وحساب الفرق.على سبيل المثال:

public void sendHttpRequest(byte[] requestData, Socket connection) {
    long startTime = System.currentTimeMillis();
    writeYourRequestData(connection.getOutputStream(), requestData);
    byte[] responseData = readYourResponseData(connection.getInputStream());
    long elapsedTime = System.currentTimeMillis() - startTime;
    System.out.println("Total elapsed http request/response time in milliseconds: " + elapsedTime);
}

سيقيس هذا الرمز الوقت من وقت البدء في كتابة طلبك حتى الانتهاء من تلقي الرد، وطباعة النتيجة (على افتراض أنك قمت بتنفيذ طرق القراءة/الكتابة المحددة الخاصة بك).

نصائح أخرى

curl -s -w "%{time_total}\n" -o /dev/null http://server:3000

يمكنك استخدام الوقت والالتفاف والوقت في سطر الأوامر.ترشدك الوسيطة -I الخاصة بالضفيرة إلى طلب الرأس فقط.

time curl -I 'http://server:3000'

شيء من هذا القبيل قد يفي بالغرض

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.HeadMethod;
import org.apache.commons.lang.time.StopWatch;
//import org.apache.commons.lang3.time.StopWatch

public class Main {

    public static void main(String[] args) throws URIException {
        StopWatch watch = new StopWatch();
        HttpClient client = new HttpClient();
        HttpMethod method = new HeadMethod("http://stackoverflow.com/");

        try {
            watch.start();
            client.executeMethod(method);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            watch.stop();
        }

        System.out.println(String.format("%s %s %d: %s", method.getName(), method.getURI(), method.getStatusCode(), watch.toString()));

    }
}
HEAD http://stackoverflow.com/ 200: 0:00:00.404

ربما أفتقد شيئًا ما، ولكن لماذا لا تستخدم فقط:

// open your connection
long start = System.currentTimeMillis();
// send request, wait for response (the simple socket calls are all blocking)
long end = System.currentTimeMillis();
System.out.println("Round trip response time = " + (end-start) + " millis");

استخدم AOP لاعتراض المكالمات إلى المقبس وقياس وقت الاستجابة.

@Aspect
@Profile("performance")
@Component
public class MethodsExecutionPerformance {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Pointcut("execution(* it.test.microservice.myService.service.*.*(..))")
    public void serviceMethods() {
    }

    @Around("serviceMethods()")
    public Object monitorPerformance(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        StopWatch stopWatch = new StopWatch(getClass().getName());
        stopWatch.start();
        Object output = proceedingJoinPoint.proceed();
        stopWatch.stop();
        logger.info("Method execution time\n{}", stopWatch.prettyPrint());
        return output;
    }
}

وبهذه الطريقة، يمكنك حساب وقت الاستجابة الحقيقي لخدمتك بشكل مستقل عن سرعة الشبكة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top