mirror of
https://github.com/Bryanthelol/namekoplus
synced 2025-06-08 04:40:43 +08:00
Compare commits
37 Commits
Author | SHA1 | Date | |
---|---|---|---|
850437db3d | |||
7ebb99a317 | |||
a21146f6b6 | |||
e05b440933 | |||
4358e8514e | |||
892dfc6cc0 | |||
4377c021d7 | |||
befe8bd087 | |||
02f334e5bb | |||
9289bf83ec | |||
14068cded1 | |||
4cb47e6d3b | |||
548817ea1b | |||
0b893851ff | |||
62e6b1c1ed | |||
58804bbe50 | |||
1818308508 | |||
7866e6cbbf | |||
a34e1c7d0b | |||
b6659976fb | |||
6c059ac19d | |||
3641e7a1fa | |||
ac50af774d | |||
96d33944a4 | |||
0fd6949262 | |||
a8d088f6a3 | |||
0a2a382a35 | |||
e19884b1c0 | |||
2f4c5b5d82 | |||
68b8eb6c3b | |||
2c58ffd698 | |||
57ff3be326 | |||
44ecc83e1a | |||
ab47aa2551 | |||
18ec9b259b | |||
19deb5473d | |||
e480218d3e |
53
.github/workflows/python-publish.yml
vendored
53
.github/workflows/python-publish.yml
vendored
@ -12,28 +12,41 @@ on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
# permissions:
|
||||
# contents: read
|
||||
|
||||
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
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
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 }}
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: pdm-project/setup-pdm@v3
|
||||
|
||||
- name: Publish package distributions to PyPI
|
||||
run: pdm publish -u ${{ secrets.PYPI_API_USER }} -P ${{ secrets.PYPI_API_PASSWORD }}
|
||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -108,6 +108,8 @@ ipython_config.py
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/#use-with-ide
|
||||
.pdm.toml
|
||||
.pdm-python
|
||||
.pdm-build/
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
15
README.md
15
README.md
@ -1,8 +1,17 @@
|
||||
# namekoplus
|
||||
|
||||
[](https://github.com/Bryanthelol/namekoplus/actions/workflows/python-publish.yml)
|
||||
|
||||
A lightweight Python distributed microservice solution
|
||||
|
||||
## Command Line Tool Usage
|
||||
## Installation
|
||||
|
||||
```shell
|
||||
python3 -m pip install namekoplus
|
||||
```
|
||||
|
||||
|
||||
## CLI Usage
|
||||
|
||||
### Checkout Command
|
||||
|
||||
@ -27,5 +36,5 @@ namekoplus init --directory <dir_name> --type <template_type>
|
||||
|
||||
See Documents:
|
||||
|
||||
- [中文](https://doc.bearcatlog.com/)
|
||||
- [English](https://legendary-sopapillas-e2626d.netlify.app/)
|
||||
- [English](https://legendary-sopapillas-e2626d.netlify.app/)
|
||||
- [中文](https://doc.bearcatlog.com/)
|
@ -1 +0,0 @@
|
||||
from namekoplus.chassis.chassis import *
|
68
pyproject.toml
Normal file
68
pyproject.toml
Normal 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"
|
78
setup.py
78
setup.py
@ -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.1',
|
||||
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']
|
||||
},
|
||||
)
|
1
src/namekoplus/__init__.py
Normal file
1
src/namekoplus/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from .chassis.chassis import *
|
@ -28,15 +28,14 @@
|
||||
"links": [],
|
||||
"liveNow": false,
|
||||
"panels": [
|
||||
% for grafana_dict in grafana_list:
|
||||
% for grafana_dict in grafana_list:
|
||||
{
|
||||
"aliasColors": {},
|
||||
"bars": false,
|
||||
"dashLength": 10,
|
||||
"dashes": false,
|
||||
"datasource": {
|
||||
"type": "statsd",
|
||||
"uid": "5qrwjFCnk"
|
||||
"type": "statsd"
|
||||
},
|
||||
"fill": 1,
|
||||
"fillGradient": 0,
|
||||
@ -47,7 +46,7 @@
|
||||
"y": 0
|
||||
},
|
||||
"hiddenSeries": false,
|
||||
"id": 5,
|
||||
"id": ${loop.index},
|
||||
"legend": {
|
||||
"alignAsTable": true,
|
||||
"avg": true,
|
||||
@ -92,7 +91,7 @@
|
||||
"title": "${service_name} | ${grafana_dict['stat_name']}",
|
||||
"tooltip": {
|
||||
"shared": true,
|
||||
"sort": 0,
|
||||
"sort": ${loop.index},
|
||||
"value_type": "individual"
|
||||
},
|
||||
"type": "graph",
|
||||
@ -116,8 +115,13 @@
|
||||
"yaxis": {
|
||||
"align": false
|
||||
}
|
||||
|
||||
% if grafana_dict['is_last'] == 1:
|
||||
}
|
||||
% endfor
|
||||
% else:
|
||||
},
|
||||
% endif
|
||||
% endfor
|
||||
],
|
||||
"refresh": "3s",
|
||||
"schemaVersion": 36,
|
@ -1,4 +1,3 @@
|
||||
import importlib
|
||||
import inspect
|
||||
import os
|
||||
import shutil
|
||||
@ -10,7 +9,6 @@ import shortuuid
|
||||
from python_on_whales import DockerException, ClientNotFoundError, DockerClient, docker
|
||||
from mako.template import Template
|
||||
|
||||
|
||||
INIT_TYPE_CHOICES = ['all', 'rpc', 'event', 'http', 'timer', 'demo']
|
||||
MIDDLEWARE_CHOICES = ['rabbitmq', 'metrics']
|
||||
TEST_TYPE_CHOICES = ['unit']
|
||||
@ -29,9 +27,10 @@ def check_docker():
|
||||
click.echo('Please start docker correctly', err=True)
|
||||
raise
|
||||
|
||||
if not docker.compose.is_installed():
|
||||
click.echo('Please install docker-compose first', err=True)
|
||||
raise
|
||||
# TODO 目前在某些系统环境的检查不准确,暂时去除这个检查逻辑
|
||||
# if not docker.compose.is_installed():
|
||||
# click.echo('Please install docker-compose first', err=True)
|
||||
# raise
|
||||
|
||||
|
||||
@contextmanager
|
||||
@ -110,7 +109,7 @@ def start_statsd_agent():
|
||||
|
||||
def start_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',
|
||||
detach=True, restart='always', tty=True, hostname='statsd-exporter',
|
||||
publish=[(9125, 9125, 'udp'), (9102, 9102)], interactive=True,
|
||||
@ -137,7 +136,7 @@ def start_grafana():
|
||||
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_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',
|
||||
detach=True, restart='always', tty=True, interactive=True,
|
||||
publish=[(3100, 3000)], pull='missing',
|
||||
@ -159,6 +158,7 @@ def stop_network(network_name):
|
||||
|
||||
|
||||
def start_metric_servers():
|
||||
# TODO 检查相应容器是否已启动,如果启动,则先删除
|
||||
start_network('metric_servers')
|
||||
sleep(0.5)
|
||||
start_prometheus()
|
||||
@ -324,10 +324,12 @@ def metric_config_gen(module, class_name_str):
|
||||
"""
|
||||
import sys
|
||||
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
|
||||
dest_dir = module.split('.')[0]
|
||||
file_name = module.split('.')[-1]
|
||||
_module = __import__(module)
|
||||
|
||||
@ -365,6 +367,11 @@ def metric_config_gen(module, class_name_str):
|
||||
for config in config_list:
|
||||
if config['class_name'] == class_name:
|
||||
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_file_path = os.path.join(grafana_configs_dir, 'grafana.json.mako')
|
||||
output_file = os.path.join('grafana_dashboards', f'{class_name}_Grafana.json')
|
@ -2,7 +2,8 @@ AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:l
|
||||
WEB_SERVER_ADDRESS: '0.0.0.0:8000'
|
||||
RPC_EXCHANGE: 'nameko-rpc'
|
||||
|
||||
max_workers: 10
|
||||
max_workers: 20
|
||||
PREFETCH_COUNT: 20
|
||||
parent_calls_tracked: 20
|
||||
|
||||
LOGGING:
|
@ -1,5 +1,6 @@
|
||||
AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/
|
||||
RPC_EXCHANGE: 'nameko-rpc'
|
||||
|
||||
max_workers: 10
|
||||
max_workers: 20
|
||||
PREFETCH_COUNT: 20
|
||||
parent_calls_tracked: 20
|
@ -1,7 +1,8 @@
|
||||
AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/
|
||||
RPC_EXCHANGE: 'nameko-rpc'
|
||||
|
||||
max_workers: 10
|
||||
max_workers: 20
|
||||
PREFETCH_COUNT: 20
|
||||
parent_calls_tracked: 20
|
||||
|
||||
LOGGING:
|
@ -2,7 +2,8 @@ AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:l
|
||||
WEB_SERVER_ADDRESS: '0.0.0.0:8000'
|
||||
RPC_EXCHANGE: 'nameko-rpc'
|
||||
|
||||
max_workers: 10
|
||||
max_workers: 20
|
||||
PREFETCH_COUNT: 20
|
||||
parent_calls_tracked: 20
|
||||
|
||||
LOGGING:
|
@ -1,7 +1,8 @@
|
||||
AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/
|
||||
RPC_EXCHANGE: 'nameko-rpc'
|
||||
|
||||
max_workers: 10
|
||||
max_workers: 20
|
||||
PREFETCH_COUNT: 20
|
||||
parent_calls_tracked: 20
|
||||
|
||||
LOGGING:
|
@ -1,7 +1,8 @@
|
||||
AMQP_URI: pyamqp://${RABBIT_USER:admin}:${RABBIT_PASSWORD:admin}@${RABBIT_HOST:localhost}:${RABBIT_PORT:5672}/
|
||||
RPC_EXCHANGE: 'nameko-rpc'
|
||||
|
||||
max_workers: 10
|
||||
max_workers: 20
|
||||
PREFETCH_COUNT: 20
|
||||
parent_calls_tracked: 20
|
||||
|
||||
LOGGING:
|
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
Loading…
x
Reference in New Issue
Block a user