热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Solutions:如何为PythonFlask应用进行APM

Solutions:如何为PythonFlask应用进行APM,Go语言社区,Golang程序员人脉社

如果大家之前看过我写的文章“应用程序性能监控/管理(APM)实践”,那么你就会对Elastic APM有个比较清楚的认识。在今天的蚊帐中,我就再累述了。在那篇文章中,我着重介绍了APM到底是什么东东。在今天的练习中,我来展示如何对Python Flask来进行监控。

测试应用

我们的Flash测试应用非常简单,就是一个简单的查询天气的微服务。这个API的接口如下:

http://api.openweathermap.org/data/2.5/weather?q=beijing&units=imperial&appid=271d1234d3f497eed5b1d80a07b3fcd1

使用上面的接口,我们可以得到北京的天气如下:

{"coord":{"lon":116.4,"lat":39.91},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":79.68,"feels_like":72.21,"temp_min":73.99,"temp_max":84.99,"pressure":1016,"humidity":11},"visibility":10000,"wind":{"speed":4.47,"deg":250},"clouds":{"all":0},"dt":1586754618,"sys":{"type":1,"id":9609,"country":"CN","sunrise":1586727568,"sunset":1586774994},"timezone":28800,"id":1816670,"name":"Beijing","cod":200}

这是一个非常简单的应用。整个应用的代码如下:

app.py

import requests
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///weather.db'

db = SQLAlchemy(app)

class City(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)


@app.route('/beijing', methods=['GET'])
def getBeijing():
    url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=271d1234d3f497eed5b1d80a07b3fcd1'

    city = "beijing"
    weather_data = []
    r = requests.get(url.format(city)).json()

    weather = {
        'city' : city,
        'temperature' : r['main']['temp'],
        'description' : r['weather'][0]['description'],
        'icon' : r['weather'][0]['icon'],
    }

    weather_data.append(weather)

    return render_template('weather.html', weather_data=weather_data)    

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        new_city = request.form.get('city')
        
        if new_city:
            new_city_obj = City(name=new_city)

            db.session.add(new_city_obj)
            db.session.commit()

    cities = City.query.all()

    url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=271d1234d3f497eed5b1d80a07b3fcd1'

    weather_data = []

    for city in cities:

        r = requests.get(url.format(city.name)).json()

        weather = {
            'city' : city.name,
            'temperature' : r['main']['temp'],
            'description' : r['weather'][0]['description'],
            'icon' : r['weather'][0]['icon'],
        }

        weather_data.append(weather)


    return render_template('weather.html', weather_data=weather_data)

为了能够运行这个应用,我们必须安装相应的python库:

pip3 install requests
pip3 install flask
pip3 install flask_sqlalchemy

在命令行中,我们打入如下的命令:

export FLASK_APP=app.py

然后,我们运行这个应用:

flask run

如果你上面都运行正确的话,我们可以在浏览器中输入localhost:5000,并可以看到如下的内容:

$ flask run
 * Serving Flask-SocketIO app "app"
/usr/local/lib/python3.7/site-packages/flask_sqlalchemy/__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
 * Serving Flask app "app"
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

我们可以添加一个城市来得到它的天气。在这个应用中它除了得到天气之外,它也同时访问sqlite数据库。

安装

安装Elastic Stack,有两种方法。最简单的一种方法是运用docker来一键部署Elasticsearch, Kibana和APM服务器。详细安装步骤请参阅链接liu-xiao-guo/apm-contrib。下面我们采用一种手动的方法来部署Elastic Stack。

我们可以按照我们的文章“Elastic:菜鸟上手指南”来安装及运行我们的Elasticsearch及Kibana。

我们也必须安装和Elasticsearch一样版本的APM服务器。我们打开我们的Kibana界面,并点击左上角的部分:

然后,我们按照上面的步骤一步一步地进行安装:

我们按照上面的要求配置好Elasticsearch的地址及用户名和密码(如果你已经启动了安全的设置):

如果我们能看到上面的信息则表示我们的APM服务器的安装是成功的。由于我们针对的是Flask应用框架,所以我们点击Flask来进行安装。

按照上面的要求,我们需要进行安装如下的python 模块:

pip3 install elastic-apm[flask]
pip3 install psutil

同时按照要求,我们需要对我们的python应用进行修改。整个修改后的应用如下:

app.py

import requests
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy 

# initialize using environment variables
from elasticapm.contrib.flask import ElasticAPM
app = Flask(__name__)
apm = ElasticAPM(app)

# or configure to use ELASTIC_APM in your application's settings
from elasticapm.contrib.flask import ElasticAPM
app.config['ELASTIC_APM'] = {
  # Set required service name. Allowed characters:
  # a-z, A-Z, 0-9, -, _, and space
  'SERVICE_NAME': 'python-flask',

  # Use if APM Server requires a token
  'SECRET_TOKEN': '',

  # Set custom APM Server URL (default: http://localhost:8200)
  'SERVER_URL': 'http://localhost:8200',
}

apm = ElasticAPM(app)

#app = Flask(__name__)
#app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///weather.db'

db = SQLAlchemy(app)

...

在上面,我们把从Kibana中拷贝过来的代码粘贴过来。同时我们需要把DEBUG功能关掉。这个可以在官方文档中可以看到。如果是在DEBUG模式下,transaction及error是不会发到我们的APM服务器中的。我们在上面填入SERVICE_NAME及SERVER_URL。

一旦完成我们上面的配置后,我们重新运行一下我们的Python Flash应用,并打开我们的 Kibana:

点击上面的python_flask:

点击上面的GET /,我们可以看到:

我们可以看到在页面启动的时候的一个transaction的时间是花在哪里。这对我们的在调试微服务及数据库的访问性能调试会有很大的帮助。

我们在浏览器中打入http://localhost:5000/beijing,这样:

点击上面的Traces:

在上面,它显示了目前在APM应用中的所有的接口的列表。我们点击上面的GET /beijing:

在上面,我们可以看到这个接口调用的情况。

整个Python flask的应用可以在地址https://github.com/liu-xiao-guo/weather_app_flask 下载

更多阅读
  • Solutions:应用程序性能监控/管理(APM)实践

  • Solutions:如何使用Elastic APM来监控多语言微服务应用程序

参考:

【1】https://www.elastic.co/guide/en/apm/agent/python/current/flask-support.html


推荐阅读
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文详细介绍了定时器输入捕捉技术的原理及其应用。通过配置定时器通道的引脚模式为输入模式,并设置相应的捕获触发条件,可以实现对外部信号的精确捕捉。该技术在实时控制系统中具有广泛的应用,如电机控制、频率测量等场景。文中还提供了具体的配置步骤和示例代码,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 基于Linux系统的Kickstart自动化服务器部署方案
    本文针对企业需求,提出了一种基于Linux系统的Kickstart自动化服务器部署方案。该方案旨在通过无盘批量安装操作系统,提高企业IT基础设施的部署效率。Kickstart是一种利用Anaconda工具实现服务器自动化安装的技术,能够显著简化和加速操作系统的安装过程。通过详细的实施规划,本文介绍了Kickstart的工作原理及其在实际部署中的应用,为企业提供了高效的自动化部署解决方案。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
author-avatar
一起去钓鱼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有