Skip to content

Commit

Permalink
Add gunicorn and uvicorn examples
Browse files Browse the repository at this point in the history
  • Loading branch information
bigbag committed Oct 19, 2024
1 parent 73e1059 commit 8399061
Show file tree
Hide file tree
Showing 10 changed files with 312 additions and 1 deletion.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
**starlette-request-id** is a helper for starlette to add request id in logger.

* [Project Changelog](https://github.com/bigbag/starlette-request-id/blob/main/CHANGELOG.md)
* [Examples](https://github.com/bigbag/starlette-request-id/blob/main/examples/)


## Installation

Expand Down
63 changes: 63 additions & 0 deletions examples/gunicorn_runner/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
.PHONY: start
## Start server start with gunicorn
start:
@echo -n "Start demo services with uvicorn: "
@exec gunicorn -c gunicorn_conf.py main:app


.DEFAULT_GOAL := help

# Inspired by <http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html>
# sed script explained:
# /^##/:
# * save line in hold space
# * purge line
# * Loop:
# * append newline + line to hold space
# * go to next line
# * if line starts with doc comment, strip comment character off and loop
# * remove target prerequisites
# * append hold space (+ newline) to line
# * replace newline plus comments by `---`
# * print line
# Separate expressions are necessary because labels cannot be delimited by
# semicolon; see <http://stackoverflow.com/a/11799865/1968>
.PHONY: help
help:
@echo "$$(tput bold)Available rules:$$(tput sgr0)"
@echo
@sed -n -e "/^## / { \
h; \
s/.*//; \
:doc" \
-e "H; \
n; \
s/^## //; \
t doc" \
-e "s/:.*//; \
G; \
s/\\n## /---/; \
s/\\n/ /g; \
p; \
}" ${MAKEFILE_LIST} \
| LC_ALL='C' sort --ignore-case \
| awk -F '---' \
-v ncol=$$(tput cols) \
-v indent=19 \
-v col_on="$$(tput setaf 6)" \
-v col_off="$$(tput sgr0)" \
'{ \
printf "%s%*s%s ", col_on, -indent, $$1, col_off; \
n = split($$2, words, " "); \
line_length = ncol - indent; \
for (i = 1; i <= n; i++) { \
line_length -= length(words[i]) + 1; \
if (line_length <= 0) { \
line_length = ncol - indent - length(words[i]) - 1; \
printf "\n%*s ", -indent, " "; \
} \
printf "%s ", words[i]; \
} \
printf "\n"; \
}' \
| more $(shell test $(shell uname) = Darwin && echo '--no-init --raw-control-chars')
39 changes: 39 additions & 0 deletions examples/gunicorn_runner/gunicorn_conf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import logging

from request_id_helper import RequestIdFormatter

# Gunicorn config
workers = 1
worker_class = "uvicorn.workers.UvicornWorker"

# Logging Options
loglevel = "info"
logconfig_dict = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"default": {
"()": RequestIdFormatter,
"format": "[%(asctime)s] %(levelname)s [%(request_id)s] %(name)s | %(message)s",
"datefmt": "%d/%b/%Y %H:%M:%S",
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "default",
},
},
"loggers": {
"gunicorn.error": {
"level": "INFO",
"handlers": ["console"],
"propagate": False,
},
"gunicorn.access": {
"level": "INFO",
"handlers": ["console"],
"propagate": False,
},
},
}
53 changes: 53 additions & 0 deletions examples/gunicorn_runner/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import uvicorn
from starlette.applications import Starlette
from starlette.responses import PlainTextResponse

from starlette_request_id import REQUEST_ID_HEADER, RequestIdMiddleware, init_logger, request_id_ctx

LOGGING = {
"version": 1,
"disable_existing_loggers": 0,
"formatters": {
"default": {
"()": "request_id_helper.RequestIdFormatter",
"format": "[%(asctime)s] %(levelname)s [%(request_id)s] %(name)s | %(message)s",
"datefmt": "%d/%b/%Y %H:%M:%S",
}
},
"handlers": {
"stdout": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "default",
},
},
"loggers": {
"": {
"handlers": ["stdout"],
"propagate": True,
"level": "INFO",
},
},
}


def init_app():
init_logger(LOGGING)

app_ = Starlette()
app_.add_middleware(RequestIdMiddleware)

@app_.route("/")
def success(request):
return PlainTextResponse(f"Request id: {request_id_ctx.get()}", status_code=200)

return app_


app = init_app()

if __name__ == "__main__":
uvicorn.run(
app=app,
log_config=LOGGING,
)
2 changes: 2 additions & 0 deletions examples/gunicorn_runner/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
starlette-request-id
gunicorn
69 changes: 69 additions & 0 deletions examples/uvicorn_runner/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
.PHONY: start
## Start server
start:
@echo -n "Start demo services: "
@exec python main.py

.PHONY: start/uvicorn
## Start server start with uvicorn
start/uvicorn:
@echo -n "Start demo services with uvicorn: "
@exec uvicorn main:app --reload --log-config log_config.yaml


.DEFAULT_GOAL := help

# Inspired by <http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html>
# sed script explained:
# /^##/:
# * save line in hold space
# * purge line
# * Loop:
# * append newline + line to hold space
# * go to next line
# * if line starts with doc comment, strip comment character off and loop
# * remove target prerequisites
# * append hold space (+ newline) to line
# * replace newline plus comments by `---`
# * print line
# Separate expressions are necessary because labels cannot be delimited by
# semicolon; see <http://stackoverflow.com/a/11799865/1968>
.PHONY: help
help:
@echo "$$(tput bold)Available rules:$$(tput sgr0)"
@echo
@sed -n -e "/^## / { \
h; \
s/.*//; \
:doc" \
-e "H; \
n; \
s/^## //; \
t doc" \
-e "s/:.*//; \
G; \
s/\\n## /---/; \
s/\\n/ /g; \
p; \
}" ${MAKEFILE_LIST} \
| LC_ALL='C' sort --ignore-case \
| awk -F '---' \
-v ncol=$$(tput cols) \
-v indent=19 \
-v col_on="$$(tput setaf 6)" \
-v col_off="$$(tput sgr0)" \
'{ \
printf "%s%*s%s ", col_on, -indent, $$1, col_off; \
n = split($$2, words, " "); \
line_length = ncol - indent; \
for (i = 1; i <= n; i++) { \
line_length -= length(words[i]) + 1; \
if (line_length <= 0) { \
line_length = ncol - indent - length(words[i]) - 1; \
printf "\n%*s ", -indent, " "; \
} \
printf "%s ", words[i]; \
} \
printf "\n"; \
}' \
| more $(shell test $(shell uname) = Darwin && echo '--no-init --raw-control-chars')
28 changes: 28 additions & 0 deletions examples/uvicorn_runner/log_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
version: 1
disable_existing_loggers: False

formatters:
default:
(): starlette_request_id.request_id_formatter.RequestIdFormatter
format: "[%(asctime)s] %(levelname)s [%(request_id)s] %(name)s | %(message)s"
datefmt: "%d/%b/%Y %H:%M:%S"

handlers:
console:
class: logging.StreamHandler
formatter: default
stream: ext://sys.stdout

loggers:
uvicorn:
level: INFO
handlers: [console]
propagate: no
uvicorn.error:
level: INFO
handlers: [console]
propagate: no
uvicorn.access:
level: INFO
handlers: [console]
propagate: no
53 changes: 53 additions & 0 deletions examples/uvicorn_runner/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import uvicorn
from starlette.applications import Starlette
from starlette.responses import PlainTextResponse

from starlette_request_id import REQUEST_ID_HEADER, RequestIdMiddleware, init_logger, request_id_ctx

LOGGING = {
"version": 1,
"disable_existing_loggers": 0,
"formatters": {
"default": {
"()": "request_id_helper.RequestIdFormatter",
"format": "[%(asctime)s] %(levelname)s [%(request_id)s] %(name)s | %(message)s",
"datefmt": "%d/%b/%Y %H:%M:%S",
}
},
"handlers": {
"stdout": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "default",
},
},
"loggers": {
"": {
"handlers": ["stdout"],
"propagate": True,
"level": "INFO",
},
},
}


def init_app():
init_logger(LOGGING)

app_ = Starlette()
app_.add_middleware(RequestIdMiddleware)

@app_.route("/")
def success(request):
return PlainTextResponse(f"Request id: {request_id_ctx.get()}", status_code=200)

return app_


app = init_app()

if __name__ == "__main__":
uvicorn.run(
app=app,
log_config=LOGGING,
)
2 changes: 2 additions & 0 deletions examples/uvicorn_runner/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
starlette-request-id
uvicorn
2 changes: 1 addition & 1 deletion starlette_request_id/version.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
__all__ = "VERSION"

VERSION = "1.2.0"
VERSION = "1.2.1"

0 comments on commit 8399061

Please sign in to comment.