Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何对AWS上部署的Flask应用程序进行50次并发调用?_Python 3.x_Amazon Web Services_Amazon Ec2_Flask_Load Testing - Fatal编程技术网

Python 3.x 如何对AWS上部署的Flask应用程序进行50次并发调用?

Python 3.x 如何对AWS上部署的Flask应用程序进行50次并发调用?,python-3.x,amazon-web-services,amazon-ec2,flask,load-testing,Python 3.x,Amazon Web Services,Amazon Ec2,Flask,Load Testing,我正在使用下面的python脚本测试在AWS实例上运行的应用程序 import sys import requests import logging import random from datetime import datetime import threading import os import time logger = logging.getLogger('Intrudx') handle = logging.FileHandler('Intrudx.log') formatte

我正在使用下面的python脚本测试在AWS实例上运行的应用程序

import sys
import requests
import logging
import random
from datetime import datetime
import threading
import os
import time


logger = logging.getLogger('Intrudx')
handle = logging.FileHandler('Intrudx.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
handle.setFormatter(formatter)
logger.addHandler(handle)
logger.setLevel(logging.INFO)


loop_count = int(sys.argv[1])
sleep_time = int(sys.argv[2])


# CHECKING THE HEARTBEAT
def heartbeat(SessionID, SiteID):
    logger.info("Starting heartbeat thread")
    try:
        heart_url = 'http://ec2-instance-address.com/license/heartbeat'
        heart_result = requests.post(heart_url, json={
                                                     "SessionID":str(SessionID),
                                                     "SiteID" : str(SiteID)
                                                      })
        if heart_result.status_code is 500:
            logger.error("Heartbeat Failed with 500")
            return "We Got 500"
        response_text = heart_result.json()["ResponseText"]
        logger.info("Heartbeat: "+str(response_text))
    except Exception as e:
        logger.error("Heartbeat Failed"+str(e))


# FINDING THE SERVER IP
def ip(SessionID):
    logger.info("Starting get server info thread")
    try:
        get_server_url = 'http://ec2-instance-address.com/server/getStreamingServer'
        get_server_result = requests.post(get_server_url, json={"SessionID": str(SessionID)})
        result_code = get_server_result.status_code
        if result_code is 500:
            logger.error("GetStreamingServerInfo: " + "Failed")
            return "We Got 500"
        response_text = get_server_result.json()["ResponseText"]
        logger.info("GetStreamingServerInfo: " + str(response_text))
    except Exception as e:
        logger.error("GetStreamingServerInfo: " + str(e))


def main():
    for i in range(loop_count):
        # LOGIN
        try:
            login_url = 'http://ec2-instance-address.com/user/login'
            login_result = requests.post(login_url, json={
                                                            "AccountName": "Account1",
                                                            "UserID": "user2",
                                                            "UserPassword": "test"
                                                         })
            result_code = login_result.status_code
            if result_code is 500:
                logger.error("Login: "+"Failed")
                return "We Got 500"
            SessionID = login_result.json()["SessionID"]
            response_text = login_result.json()["ResponseText"]
            logger.info("Login: "+str(response_text)+": "+ str(SessionID))
            print(str(SessionID)+str(response_text))

        except Exception as e:
            result_code = str(e)
            logger.error("Login: "+str(e))

        # GET NEW SITE
        try:
            get_new_site_url = 'http://ec2-instance-address.com/license/getNewSite'
            get_new_site_result = requests.post(get_new_site_url, json={"SessionID": str(SessionID)})
            result_code = get_new_site_result.status_code
            if result_code is 500:
                logger.error("Login: " + "Failed")
                return "We Got 500"
            response_text = get_new_site_result.json()["ResponseText"]
            site_id = get_new_site_result.json()["NewSiteID"]
            logger.info("getNewSite: "+str(response_text)+": "+str(site_id))

        except Exception as e:
            result_code = str(e)


             logger.error("getNewSite"+str(e))


        # STARTING HEARTBEAT THREAD
        try:
            threading.Thread(target=heartbeat(SessionID, site_id), args=(SessionID, site_id,)).start()
        except Exception as e:
            logger.error("Problem starting thread: "+str(e))

        # STARTING GET SERVER INFO THREAD
        try:
            threading.Thread(target=ip(SessionID), args=(SessionID)).start()
        except Exception as e:
            logger.error("Problem while starting Get Server Info Thread"+str(e))
此脚本仅使用一个用户,创建一个与服务器的会话/连接以进行API调用

以类似的方式,我希望使用50或100个不同的用户(具有不同的帐户/凭据)测试应用程序,这些用户连接到服务器进行API调用。例如,50或100个用户同时使用该应用程序。因此,我可以确保应用程序正确处理50个用户

如何使用脚本进行此类测试

更新:大多数路由都是隐藏的,它们需要@login\u required。

我建议您试试。它是一个python脚本,将启动micro EC2实例,并从这些实例向应用程序发送许多请求。这将模拟性能测试中流量的大幅增加

这件事我是从你那儿听说的。讲师有效地使用它来触发自动缩放和负载测试他的配置


祝你好运。

你也可以试试我们的小工具k6:

您可以使用JavaScript编写虚拟用户的行为脚本,因此很容易让50个不同的用户使用不同的凭据登录。看起来像这样(但这段代码需要调试:)

从“k6/http”导入http;
让我们登录\u url=”http://ec2-instance-address.com/user/login";
让我们获取新站点url=”http://ec2-instance-address.com/license/getNewSite";
让凭据=[
{“account”:“Account1”,“username”:“joe”,“password”:“secret”},
{“account”:“Account2”,“username”:“jane”,“password”:“verysecret”}
];
导出默认函数(){
让session_id=doLogin();
let response=doGetNewSite(会话id);
让response_text=response[“ResponseText”];
让new_site_id=response[“NewSiteID”];
对于(i=0;ir.status==200,
“登录成功”:(r)=>JSON.parse(r.body).hasOwnProperty(“SessionID”)
});
返回JSON.parse(res.body)[“SessionID”];
}
函数doGetNewSite(会话id){
让http_头={“内容类型”:“应用程序/json”};
让post_body={“SessionID”:session_id};
让res=http.post(获取新站点url,JSON.strjngify(post\u body),{headers:http\u headers});
检查(res{
“状态代码为200”:(r)=>r.Status==200,
“获取响应文本”:(r)=>JSON.parse(r.body).hasOwnProperty(“ResponseText”),
“获取新站点id”:(r)=>JSON.parse(r.body.hasOwnProperty(“NewSiteID”)
});
返回JSON.parse(res.body);
}

几乎所有API路由(登录和注册除外)都是隐藏的,它们需要@login\u required。它会如何影响那些API?谢谢,伙计。它确实给了我一个想法,我写了我自己的小程序库。谢谢,但我从来没有用JS编码,我急需它,所以我用Python写了我自己的脚本。
import http from "k6/http";

let login_url = "http://ec2-instance-address.com/user/login";
let get_new_site_url = "http://ec2-instance-address.com/license/getNewSite";
let credentials = [
    { "account": "Account1", "username": "joe", "password": "secret" },
    { "account": "Account2", "username": "jane", "password": "verysecret" }
];

export default function() {
  let session_id = doLogin();
  let response = doGetNewSite(session_id);
  let response_text = response["ResponseText"];
  let new_site_id = response["NewSiteID"];
  for (i = 0; i < loop_count; i++) {
    // do heartbeat stuff?
  }
}

function doLogin() {
  let index = Math.floor(Math.random() * credentials.length);
  let post_body = {
    "AccountName": credentials[index]["account"],
    "UserID": credentials[index]["username"],
    "UserPassword": credentials[index]["password"]
  };
  let http_headers = { "Content-Type": "application/json" };
  let res = http.post(login_url, JSON.stringify(post_body), { headers: http_headers });
  check(res, {
    "Response code is 200": (r) => r.status == 200,
    "Login successful": (r) => JSON.parse(r.body).hasOwnProperty("SessionID")
  });
  return JSON.parse(res.body)["SessionID"];
}

function doGetNewSite(session_id) {
  let http_headers = { "Content-Type": "application/json" };
  let post_body = { "SessionID": session_id };
  let res = http.post(get_new_site_url, JSON.strjngify(post_body), { headers: http_headers });
  check(res, {
    "Status code was 200": (r) => r.status == 200,
    "Got response text": (r) => JSON.parse(r.body).hasOwnProperty("ResponseText"),
    "Got new site id": (r) => JSON.parse(r.body).hasOwnProperty("NewSiteID")
  });
  return JSON.parse(res.body);
}