I'm trying to setup new relic, I have followed the instructions they give however the last command give me this error.
newrelic-admin run-program gunicorn wsgi:application
why?
2013-04-16 10:39:30 [4175] [INFO] Starting gunicorn 0.14.5
2013-04-16 10:39:30 [4175] [INFO] Listening at: http://127.0.0.1:8000 (4175)
2013-04-16 10:39:30 [4175] [INFO] Using worker: sync
2013-04-16 10:39:30 [4178] [INFO] Booting worker with pid: 4178
2013-04-16 10:39:30 [4178] [INFO] Worker exiting (pid: 4178)
2013-04-16 10:39:31 [4175] [INFO] Shutting down: Master
2013-04-16 10:39:31 [4175] [INFO] Reason: Worker failed to boot.
Follow the instructions found here:
https://newrelic.com/docs/python/python-agent-integration
I'm assuming as this i posted in Django that its a Django app.
add
import newrelic.agent
newrelic.agent.initialize('/some/path/newrelic.ini')
Related
I have a Python + FastAPI restful API project running the free tier of Oracle Cloud VM instance.
I use Gunicorn to serve the api and also installed Nginx just in case it's needed.
I have tested my running project with
curl http://localhost:8000
and I can see my API response.
Now my question is : how can I expose this api endpoint outside on the Internet?
Update 1
I started my Python API project with this command:
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --timeout 1200 -b 0.0.0.0
I saw the messages below:
[2021-05-23 00:40:28 +0000] [3850] [INFO] Starting gunicorn 20.0.2
[2021-05-23 00:40:28 +0000] [3850] [INFO] Listening at: http://0.0.0.0:8000 (3850)
[2021-05-23 00:40:28 +0000] [3850] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2021-05-23 00:40:28 +0000] [3853] [INFO] Booting worker with pid: 3853
[2021-05-23 00:40:28 +0000] [3854] [INFO] Booting worker with pid: 3854
[2021-05-23 00:40:28 +0000] [3857] [INFO] Booting worker with pid: 3857
[2021-05-23 00:40:28 +0000] [3858] [INFO] Booting worker with pid: 3858
[2021-05-23 00:42:04 +0000] [3853] [INFO] Started server process [3853]
[2021-05-23 00:42:04 +0000] [3857] [INFO] Started server process [3857]
[2021-05-23 00:42:04 +0000] [3857] [INFO] Waiting for application startup.
[2021-05-23 00:42:04 +0000] [3858] [INFO] Started server process [3858]
[2021-05-23 00:42:04 +0000] [3858] [INFO] Waiting for application startup.
[2021-05-23 00:42:04 +0000] [3858] [INFO] Application startup complete.
[2021-05-23 00:42:04 +0000] [3853] [INFO] Waiting for application startup.
[2021-05-23 00:42:04 +0000] [3853] [INFO] Application startup complete.
[2021-05-23 00:42:04 +0000] [3857] [INFO] Application startup complete.
[2021-05-23 00:42:04 +0000] [3854] [INFO] Started server process [3854]
[2021-05-23 00:42:04 +0000] [3854] [INFO] Waiting for application startup.
[2021-05-23 00:42:04 +0000] [3854] [INFO] Application startup complete.
Then I copied the IP address from the Compute >> Instances >> Instance Details panel and accessed it from my Chrome. Straightaway, it shows me
Unable to connect
Also read through several articles about using Nginx and tried without any luck.
Update 2
Using curl to access the website from my local machine
$ curl http://168.138.12.192:8000/
curl: (7) Failed to connect to 168.138.12.192 port 8000: No route to host
However, when access the IP directly using curl, I was able to get the default Nginx website.
$ curl http://168.138.12.192
Finally, I found out what I missed:
sudo iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 8000 -j ACCEPT
I have to run this command to open the port 8000(yes, my website is using port 8000).
I thought I have added Ingress Rule to accept tcp 8000, but it turns out that I still need to run the aforementioned command.
I do not quite understand why I need to do it, but it solves the problem.
Did you changed the default html page under /var/www/html directory? If not try customize the html page as per your requirement and see if it works for you or else it would just show the default nginx page when accessed from browser using public IP.
Adding to this, Also check if the port 8000 is allowed in the security list and OS firewall. The default port for http request is 80, you need to change the default port from 80 to 8000 in the config file to make this work. refer this page this might be useful How to Change Apache HTTP Port in Linux.
I'm using :
python 3.6
django==2.1.1
gunicorn==19.9.0
i have done the following:
created a django project called api
created an apiapp (an app in my project)
and i have this code in api_app's apps.py :
from django.apps import AppConfig
from api import settings
class ApiappConfig(AppConfig):
name = 'apiapp'
verbose_name = "random_name"
def ready(self):
self.job()
#classmethod
def job(cls):
### doing whatever here for example :
print(settings.SHARED_VARIABLE)
and the following in api_app's __init__.py:
import os
default_app_config = 'apiapp.apps.ApiappConfig'
i'm creating an API so i am required to use multiple workers when deploying:
gunicorn api.wsgi -w 10
now, my issue is that the function job which is called when the server is started, is getting called 10 times because i'm using 10 gunicorn workers, i would like to call it only once
another thing that i would like to do is to have the
settings.SHARED_VARIABLE variable, shared between the different workers. this variable will be updated only by the worker that will launch the app.py on server start.
Thank you !
gunicorn has a setting to do this: --preload
So, after I add this in settings.py: SHARED_VARIABLE = 'content of SHARED_VARIABLE' (and fixed apiapp/__init__.py to use the real app name), I can run gunicorn with the application loaded only once:
$ gunicorn api.wsgi -w 10 --preload
content of SHARED_VARIABLE
[2018-12-31 10:12:15 +0000] [394] [INFO] Starting gunicorn 19.6.0
[2018-12-31 10:12:15 +0000] [394] [INFO] Listening at: http://127.0.0.1:8000 (394)
[2018-12-31 10:12:15 +0000] [394] [INFO] Using worker: sync
[2018-12-31 10:12:15 +0000] [399] [INFO] Booting worker with pid: 399
[2018-12-31 10:12:15 +0000] [400] [INFO] Booting worker with pid: 400
[2018-12-31 10:12:15 +0000] [401] [INFO] Booting worker with pid: 401
[2018-12-31 10:12:15 +0000] [403] [INFO] Booting worker with pid: 403
[2018-12-31 10:12:15 +0000] [404] [INFO] Booting worker with pid: 404
[2018-12-31 10:12:15 +0000] [405] [INFO] Booting worker with pid: 405
[2018-12-31 10:12:15 +0000] [406] [INFO] Booting worker with pid: 406
[2018-12-31 10:12:15 +0000] [408] [INFO] Booting worker with pid: 408
[2018-12-31 10:12:15 +0000] [410] [INFO] Booting worker with pid: 410
[2018-12-31 10:12:15 +0000] [411] [INFO] Booting worker with pid: 411
When I start gunicorn it prints this:
[2018-11-09 16:30:20 +0000] [16] [INFO] Starting gunicorn 19.9.0
[2018-11-09 16:30:20 +0000] [16] [INFO] Listening at: http://0.0.0.0:8000 (16)
[2018-11-09 16:30:20 +0000] [16] [INFO] Using worker: sync
[2018-11-09 16:30:20 +0000] [19] [INFO] Booting worker with pid: 19
Setting up a logger for the gunicorn package (propagating) doesn't seem to affect it. What module is the one I should configure to modify these messages?
Those messages are output by the Arbiter class in gunicorn/arbiter.py, but it may be that any configuring you try and do is overridden by gunicorn's machinery, or not applicable - for example, trying to set up logging in a worker won't affect what the arbiter does, as they are separate processes. So you may need to invoke the arbiter in a special way (i.e. not just through running a canned gunicorn script) if you want to affect its logging, or amend the gunicorn configuration used for the arbiter.
I've a simple falcon app straight from the getting started example
import falcon
import json
class QuoteResource:
def on_get(self, req, resp):
"""Handles GET requests"""
quote = {
'quote': 'I\'ve always been more interested in the future than in the past.',
'author': 'Grace Hopper'
}
resp.body = json.dumps(quote)
api = falcon.API()
api.add_route('/quote', QuoteResource())
The code is in a file called manage.py
When I try to run gunicorn manage:app
This is what I get
2017-06-04 20:47:18 -0700] [2370] [INFO] Starting gunicorn 19.7.1
[2017-06-04 20:47:18 -0700] [2370] [INFO] Listening at: http://127.0.0.1:8000 (2370)
[2017-06-04 20:47:18 -0700] [2370] [INFO] Using worker: sync
[2017-06-04 20:47:18 -0700] [2373] [INFO] Booting worker with pid: 2373
Failed to find application: 'manage'
[2017-06-04 20:47:18 -0700] [2373] [INFO] Worker exiting (pid: 2373)
[2017-06-04 20:47:18 -0700] [2370] [INFO] Shutting down: Master
[2017-06-04 20:47:18 -0700] [2370] [INFO] Reason: App failed to load.
What am I doing wrong here?
Not sure whether it is a typo or because of misunderstanding but you should start the application this way:
gunicorn manage:api
But not gunicorn manage:app
The manage:api option tells to invoke the api object defined in your manage.py module. Otherwise you need to rename api variable to app in your code.
Then you can check that application is running by accessing the following url:
http://localhost:8000/quote
By default the port should 8000 but you need to check it when gunicorn starts. It should be something like this:
[INFO] Listening at: http://127.0.0.1:8000
Does anyone know if package install order matters in Python? More specifically my pip requirements.txt for a Django website I am building was:
Django==1.4
MySQL-python==1.2.3
django-evolution==0.6.7
django-pagination==1.0.7
boto==2.5.2
numpy==1.6.2
requests==0.13.1
simplejson==2.5.2
gunicorn==0.14.6
When deploying to Heroku the application would crash with the following error:
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [12] [INFO] Worker exiting (pid: 12)
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [8] [INFO] Worker exiting (pid: 8)
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [4] [INFO] Handling signal: term
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [7] [INFO] Worker exiting (pid: 7)
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [4] [INFO] Starting gunicorn 0.14.6
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [4] [INFO] Listening at: http://0.0.0.0:20132 (4)
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [4] [INFO] Using worker: sync
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [7] [INFO] Booting worker with pid: 7
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [8] [INFO] Booting worker with pid: 8
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [9] [INFO] Booting worker with pid: 9
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [10] [INFO] Booting worker with pid: 10
2012-08-05T09:26:57+00:00 heroku[web.1]: State changed from starting to up
2012-08-05T09:26:57+00:00 heroku[web.1]: Process exited with status 143
2012-08-05T09:27:17+00:00 app[web.1]: Usage: gunicorn [options]
2012-08-05T09:27:17+00:00 app[web.1]: gunicorn: error: no such option: --workers
2012-08-05T09:27:17+00:00 app[web.1]:
2012-08-05T09:27:17+00:00 app[web.1]: 2012-08-05 09:27:17 [9] [INFO] Worker exiting (pid: 9)
Where my Procfile is as follows:
web: python manage.py collectstatic --noinput; gunicorn commerical_production.wsgi:application --workers=4 --bind=0.0.0.0:$PORT
The problem was fixed by simply changing the order of requirements to:
Django==1.4
gunicorn==0.14.6
MySQL-python==1.2.3
django-evolution==0.6.7
django-pagination==1.0.7
boto==2.5.2
numpy==1.6.2
requests==0.13.1
simplejson==2.5.2
(note that gunicorn is now moved to the top)
I found this out by luckily guessing to try and change the order of the imports but my question is has anyone else run into this problem or know why the order of the packages makes a difference when installed from the requirements.txt? Could this problem indicative of some larger dependency issue that is in my app?
Pip is not very good at handling package dependencies as easy_install. We had the same problem in our project. Even though the order in req.txt was correct, we had dependency problems that is related to order.
My solution is to feed the req.txt to easy_install, but than you should be careful with the packages that is editable or those from github etc.
You may want to check below links:
http://metak4ml.blogspot.com/2009/08/easyinstall-read-pip-requirementstxt.html
http://community.webfaction.com/questions/1220/using-easy_install-to-get-all-dependencies-listed-in-requirementstxt (while read line answer is close to what we do)
Pyton setup install scripts hold already requirements and order, so the install process will respect and install in order all requirements for each of your app in the requirements file.
So, if you have your own applications that require others, put your requirements only in your setup files and enroll your main application in the requirements.txt
For third party python apps that don't require compilation you don't have to worry about the order in your requirements.
Otherwise eazy_install becomes deprecated, use pip instead of it.