Compare commits

...

34 Commits
v0.4.4 ... main

Author SHA1 Message Date
850437db3d chore: switch to pdm from setuptools 2023-11-06 17:40:27 +08:00
7ebb99a317 chore: switch to pdm from setuptools \5 2023-11-06 17:08:22 +08:00
a21146f6b6 chore: switch to pdm from setuptools \4 2023-11-06 17:02:08 +08:00
e05b440933 chore: switch to pdm from setuptools 3 2023-11-06 16:54:51 +08:00
4358e8514e
Update python-publish.yml 2023-11-06 16:50:32 +08:00
892dfc6cc0
Update python-publish.yml 2023-11-06 16:48:51 +08:00
4377c021d7
Update python-publish.yml 2023-11-06 16:48:09 +08:00
befe8bd087
Update python-publish.yml 2023-11-06 16:35:57 +08:00
02f334e5bb
Update python-publish.yml 2023-11-06 16:30:58 +08:00
9289bf83ec chore: switch to pdm from setuptools 2023-11-06 16:24:03 +08:00
14068cded1
Update python-publish.yml 2023-11-06 16:17:34 +08:00
4cb47e6d3b fix: adjust requires and templates 2023-10-26 15:56:10 +08:00
548817ea1b
doc: update readme (#34) 2023-10-24 22:32:04 +08:00
0b893851ff
doc: update readme (#33) 2023-08-09 00:00:22 +08:00
62e6b1c1ed
fix: grafana error 9 (#32) 2023-08-07 17:16:25 +08:00
58804bbe50
fix: grafana error 8 (#31) 2023-08-07 17:11:46 +08:00
1818308508
fix: grafana error 7 (#30) 2023-08-07 16:31:25 +08:00
7866e6cbbf
fix: grafana error 6 (#29) 2023-08-07 16:27:19 +08:00
a34e1c7d0b
fix: grafana error 5 (#28) 2023-08-07 16:23:29 +08:00
b6659976fb
fix: grafana error 4 (#27) 2023-08-07 16:15:22 +08:00
6c059ac19d
fix: grafana error 3 (#26) 2023-08-07 16:05:46 +08:00
3641e7a1fa
fix: grafana error 2 (#25) 2023-08-07 15:52:22 +08:00
ac50af774d
fix: grafana errors (#24) 2023-08-07 15:44:28 +08:00
96d33944a4 fix: metris errors 2023-08-07 15:11:45 +08:00
0fd6949262 fix: update setup 2023-08-07 14:59:31 +08:00
a8d088f6a3 fix: grafana.json.mako sytanx error 2023-08-07 14:59:31 +08:00
0a2a382a35 fix: update method of start_grafana 2023-08-07 14:45:29 +08:00
e19884b1c0 fix: update method of start_statsd_exporter 2023-08-07 14:38:17 +08:00
2f4c5b5d82 fix: update method of check_docker 2023-08-07 14:26:33 +08:00
68b8eb6c3b fix: update command metric-config-gen 2023-08-07 13:52:35 +08:00
2c58ffd698 chore: add extra require schema 2023-08-04 12:11:31 +08:00
57ff3be326 chore: remove useless dependencies 2023-08-04 10:15:13 +08:00
44ecc83e1a docs: update readme 2023-08-01 17:16:11 +08:00
ab47aa2551 chore: bump python-on-whales to 0.64.0 2023-08-01 14:39:37 +08:00
42 changed files with 147 additions and 116 deletions

View File

@ -12,28 +12,41 @@ on:
release: release:
types: [published] types: [published]
permissions: # permissions:
contents: read # contents: read
jobs: jobs:
deploy: # deploy:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v3
# - name: Set up Python
# uses: actions/setup-python@v3
# with:
# python-version: '3.x'
# - name: Install dependencies
# run: |
# python -m pip install --upgrade pip
# pip install build
# - name: Build package
# run: python -m build
# - name: Publish package
# uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
# with:
# user: ${{ secrets.PYPI_API_USER }}
# password: ${{ secrets.PYPI_API_PASSWORD }}
pypi-publish:
name: upload release to PyPI
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
contents: read
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v3 - uses: pdm-project/setup-pdm@v3
with:
python-version: '3.x' - name: Publish package distributions to PyPI
- name: Install dependencies run: pdm publish -u ${{ secrets.PYPI_API_USER }} -P ${{ secrets.PYPI_API_PASSWORD }}
run: |
python -m pip install --upgrade pip
pip install build
- name: Build package
run: python -m build
- name: Publish package
uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
user: ${{ secrets.PYPI_API_USER }}
password: ${{ secrets.PYPI_API_PASSWORD }}

2
.gitignore vendored
View File

@ -108,6 +108,8 @@ ipython_config.py
# in version control. # in version control.
# https://pdm.fming.dev/#use-with-ide # https://pdm.fming.dev/#use-with-ide
.pdm.toml .pdm.toml
.pdm-python
.pdm-build/
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/ __pypackages__/

View File

@ -4,6 +4,13 @@
A lightweight Python distributed microservice solution A lightweight Python distributed microservice solution
## Installation
```shell
python3 -m pip install namekoplus
```
## CLI Usage ## CLI Usage
### Checkout Command ### Checkout Command

View File

@ -1 +0,0 @@
from namekoplus.chassis.chassis import *

68
pyproject.toml Normal file
View File

@ -0,0 +1,68 @@
[project]
name = "namekoplus"
version = "0.5.3"
description = "A lightweight Python distributed microservice solution"
keywords = ["lightweight python distributed microservice solution"]
readme = "README.md"
authors = [
{name = "Bryant He", email = "bryantsisu@qq.com"},
]
classifiers = [
"Development Status :: 3 - Alpha",
"Environment :: Web Environment",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Topic :: Software Development :: Libraries :: Python Modules",
]
requires-python = ">=3.8, <4"
dependencies = [
"click==8.1.5",
"mako==1.2.4",
"nameko==3.0.0rc11",
"pytest==7.4.0",
"python-on-whales==0.65.0",
"shortuuid==1.0.11",
]
license = {text = "MIT"}
[project.urls]
"Homepage" = "https://github.com/Bryanthelol/namekoplus"
"Source Code" = "https://github.com/Bryanthelol/namekoplus"
"Bug Tracker" = "https://github.com/Bryanthelol/namekoplus/issues"
[project.optional-dependencies]
ha = [
"cachetools==5.3.0",
"circuitbreaker==2.0.0",
"tenacity==8.2.2",
]
ob = [
"nameko-sentry==1.0.0",
"nameko-tracer==1.4.0",
]
log = [
"logstash_formatter==0.5.17",
"loguru==0.7.2",
]
metric = [
"statsd==4.0.1",
]
schema = [
"marshmallow==3.20.1",
]
security = [
"cryptography",
]
dev = [
"environs==9.5.0",
"python-dotenv==1.0.0",
]
[project.scripts]
namekoplus = "namekoplus.command:cli"
[build-system]
requires = ["pdm-backend"]
build-backend = "pdm.backend"

View File

@ -1,78 +0,0 @@
from setuptools import setup, find_packages
from codecs import open
from os import path
here = path.abspath(path.dirname(__file__))
with open(path.join(here, 'README.md'), encoding='utf-8') as f:
long_description = f.read()
setup(
name='namekoplus',
version='0.4.4',
description='A lightweight Python distributed microservice solution',
long_description=long_description,
long_description_content_type='text/markdown',
url='',
project_urls={
'Documentation': 'https://doc.bearcatlog.com/',
'Source Code': 'https://github.com/Bryanthelol/namekoplus',
'Bug Tracker': 'https://github.com/Bryanthelol/namekoplus/issues',
},
author='Bryant He',
author_email='bryantsisu@qq.com',
license='MIT',
classifiers=[
'Development Status :: 3 - Alpha',
'Environment :: Web Environment',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 3',
'Topic :: Software Development :: Libraries :: Python Modules',
],
platforms='any',
python_requires='>=3.8, <4',
keywords='lightweight python distributed microservice solution',
packages=find_packages(exclude=['contrib', 'docs', 'tests']),
include_package_data=True,
data_files=['README.md'],
entry_points={
'console_scripts': [
'namekoplus = namekoplus.command:cli',
],
},
install_requires=[
'nameko==3.0.0rc11',
'click==8.1.5',
'python-on-whales==0.63.0',
'pytest==7.4.0',
'mako==1.2.4',
'shortuuid==1.0.11'
],
extras_require={
'ha': ['tenacity==8.2.2',
'cachetools==5.3.0',
'circuitbreaker==2.0.0',
'logstash_formatter==0.5.17'],
'ob': ['statsd==4.0.1',
'nameko-sentry==1.0.0',
'nameko-tracer==1.4.0'],
'apiflask': ['apiflask>=1.3.1',
'gevent>=22.10.2',
'gunicorn==20.1.0'],
'rocketry': ['rocketry==2.4.0'],
'gutter': ['gutter==0.5.0'],
'mysql': ['pymysql==1.0.3',
'sqlalchemy==2.0.15',
'sqlacodegen==2.3.0',
'alembic==1.11.1'],
'security': ['cryptography'],
'dev': ['environs==9.5.0']
},
)

View File

@ -0,0 +1 @@
from .chassis.chassis import *

View File

@ -28,15 +28,14 @@
"links": [], "links": [],
"liveNow": false, "liveNow": false,
"panels": [ "panels": [
% for grafana_dict in grafana_list: % for grafana_dict in grafana_list:
{ {
"aliasColors": {}, "aliasColors": {},
"bars": false, "bars": false,
"dashLength": 10, "dashLength": 10,
"dashes": false, "dashes": false,
"datasource": { "datasource": {
"type": "statsd", "type": "statsd"
"uid": "5qrwjFCnk"
}, },
"fill": 1, "fill": 1,
"fillGradient": 0, "fillGradient": 0,
@ -47,7 +46,7 @@
"y": 0 "y": 0
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 5, "id": ${loop.index},
"legend": { "legend": {
"alignAsTable": true, "alignAsTable": true,
"avg": true, "avg": true,
@ -92,7 +91,7 @@
"title": "${service_name} | ${grafana_dict['stat_name']}", "title": "${service_name} | ${grafana_dict['stat_name']}",
"tooltip": { "tooltip": {
"shared": true, "shared": true,
"sort": 0, "sort": ${loop.index},
"value_type": "individual" "value_type": "individual"
}, },
"type": "graph", "type": "graph",
@ -116,8 +115,13 @@
"yaxis": { "yaxis": {
"align": false "align": false
} }
% if grafana_dict['is_last'] == 1:
} }
% endfor % else:
},
% endif
% endfor
], ],
"refresh": "3s", "refresh": "3s",
"schemaVersion": 36, "schemaVersion": 36,

View File

@ -27,9 +27,10 @@ def check_docker():
click.echo('Please start docker correctly', err=True) click.echo('Please start docker correctly', err=True)
raise raise
if not docker.compose.is_installed(): # TODO 目前在某些系统环境的检查不准确,暂时去除这个检查逻辑
click.echo('Please install docker-compose first', err=True) # if not docker.compose.is_installed():
raise # click.echo('Please install docker-compose first', err=True)
# raise
@contextmanager @contextmanager
@ -108,7 +109,7 @@ def start_statsd_agent():
def start_statsd_exporter(): def start_statsd_exporter():
with status(f'Starting statsd exporter'): with status(f'Starting statsd exporter'):
statsd_mapping_file_path = os.path.join('.', 'statsd_mapping.yml') statsd_mapping_file_path = os.getcwd() + '/statsd_mapping.yml'
returned_string = docker.run(image='prom/statsd-exporter:latest', name='statsd-exporter', pull='missing', returned_string = docker.run(image='prom/statsd-exporter:latest', name='statsd-exporter', pull='missing',
detach=True, restart='always', tty=True, hostname='statsd-exporter', detach=True, restart='always', tty=True, hostname='statsd-exporter',
publish=[(9125, 9125, 'udp'), (9102, 9102)], interactive=True, publish=[(9125, 9125, 'udp'), (9102, 9102)], interactive=True,
@ -135,7 +136,7 @@ def start_grafana():
grafana_conf_dir = os.path.join(get_directory('chassis-agent'), 'metric-configs') grafana_conf_dir = os.path.join(get_directory('chassis-agent'), 'metric-configs')
grafana_provisioning_path = os.path.join(grafana_conf_dir, 'grafana_conf/provisioning') grafana_provisioning_path = os.path.join(grafana_conf_dir, 'grafana_conf/provisioning')
grafana_config_path = os.path.join(grafana_conf_dir, 'grafana_conf/config/grafana.ini') grafana_config_path = os.path.join(grafana_conf_dir, 'grafana_conf/config/grafana.ini')
grafana_dashboard_path = os.path.join('.', 'grafana_dashboards') grafana_dashboard_path = os.path.join(os.getcwd(), 'grafana_dashboards')
returned_string = docker.run(image='grafana/grafana:latest', name='grafana', hostname='grafana', returned_string = docker.run(image='grafana/grafana:latest', name='grafana', hostname='grafana',
detach=True, restart='always', tty=True, interactive=True, detach=True, restart='always', tty=True, interactive=True,
publish=[(3100, 3000)], pull='missing', publish=[(3100, 3000)], pull='missing',
@ -324,6 +325,9 @@ def metric_config_gen(module, class_name_str):
import sys import sys
from statsd.client.timer import Timer from statsd.client.timer import Timer
sys.path.append(os.getcwd()) sys.path.append(os.getcwd())
for root, dirs, files in os.walk(os.getcwd()):
for _dir in dirs:
sys.path.append(os.path.join(root, _dir))
# Extract information of statsd config from the class of nameko service # Extract information of statsd config from the class of nameko service
file_name = module.split('.')[-1] file_name = module.split('.')[-1]
@ -363,6 +367,11 @@ def metric_config_gen(module, class_name_str):
for config in config_list: for config in config_list:
if config['class_name'] == class_name: if config['class_name'] == class_name:
grafana_list.append(config) grafana_list.append(config)
for idx, grafana_dict in enumerate(grafana_list):
if idx + 1 == len(grafana_list):
grafana_dict['is_last'] = 1
else:
grafana_dict['is_last'] = 0
grafana_configs_dir = os.path.join(get_directory('chassis-agent'), 'metric-configs') grafana_configs_dir = os.path.join(get_directory('chassis-agent'), 'metric-configs')
grafana_file_path = os.path.join(grafana_configs_dir, 'grafana.json.mako') grafana_file_path = os.path.join(grafana_configs_dir, 'grafana.json.mako')
output_file = os.path.join('grafana_dashboards', f'{class_name}_Grafana.json') output_file = os.path.join('grafana_dashboards', f'{class_name}_Grafana.json')

View File

@ -2,7 +2,8 @@ AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:l
WEB_SERVER_ADDRESS: '0.0.0.0:8000' WEB_SERVER_ADDRESS: '0.0.0.0:8000'
RPC_EXCHANGE: 'nameko-rpc' RPC_EXCHANGE: 'nameko-rpc'
max_workers: 10 max_workers: 20
PREFETCH_COUNT: 20
parent_calls_tracked: 20 parent_calls_tracked: 20
LOGGING: LOGGING:

View File

@ -1,5 +1,6 @@
AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/ AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/
RPC_EXCHANGE: 'nameko-rpc' RPC_EXCHANGE: 'nameko-rpc'
max_workers: 10 max_workers: 20
PREFETCH_COUNT: 20
parent_calls_tracked: 20 parent_calls_tracked: 20

View File

@ -1,7 +1,8 @@
AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/ AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/
RPC_EXCHANGE: 'nameko-rpc' RPC_EXCHANGE: 'nameko-rpc'
max_workers: 10 max_workers: 20
PREFETCH_COUNT: 20
parent_calls_tracked: 20 parent_calls_tracked: 20
LOGGING: LOGGING:

View File

@ -2,7 +2,8 @@ AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:l
WEB_SERVER_ADDRESS: '0.0.0.0:8000' WEB_SERVER_ADDRESS: '0.0.0.0:8000'
RPC_EXCHANGE: 'nameko-rpc' RPC_EXCHANGE: 'nameko-rpc'
max_workers: 10 max_workers: 20
PREFETCH_COUNT: 20
parent_calls_tracked: 20 parent_calls_tracked: 20
LOGGING: LOGGING:

View File

@ -1,7 +1,8 @@
AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/ AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/
RPC_EXCHANGE: 'nameko-rpc' RPC_EXCHANGE: 'nameko-rpc'
max_workers: 10 max_workers: 20
PREFETCH_COUNT: 20
parent_calls_tracked: 20 parent_calls_tracked: 20
LOGGING: LOGGING:

View File

@ -1,7 +1,8 @@
AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/ AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/
RPC_EXCHANGE: 'nameko-rpc' RPC_EXCHANGE: 'nameko-rpc'
max_workers: 10 max_workers: 20
PREFETCH_COUNT: 20
parent_calls_tracked: 20 parent_calls_tracked: 20
LOGGING: LOGGING:

0
tests/__init__.py Normal file
View File