mirror of
https://github.com/Bryanthelol/namekoplus
synced 2025-09-14 21:46:03 +08:00
Compare commits
2 Commits
v0.4.18
...
e389125b10
Author | SHA1 | Date | |
---|---|---|---|
e389125b10 | |||
ba7cc886e7 |
@@ -1,10 +1,8 @@
|
||||
# namekoplus
|
||||
|
||||
[](https://github.com/Bryanthelol/namekoplus/actions/workflows/python-publish.yml)
|
||||
|
||||
A lightweight Python distributed microservice solution
|
||||
|
||||
## CLI Usage
|
||||
## Command Line Tool Usage
|
||||
|
||||
### Checkout Command
|
||||
|
||||
@@ -29,5 +27,5 @@ namekoplus init --directory <dir_name> --type <template_type>
|
||||
|
||||
See Documents:
|
||||
|
||||
- [English](https://murl.vip/TwML)
|
||||
- [中文](https://murl.vip/B0O9)
|
||||
- [中文](https://doc.bearcatlog.com/)
|
||||
- [English](https://legendary-sopapillas-e2626d.netlify.app/)
|
@@ -36,6 +36,7 @@
|
||||
"dashes": false,
|
||||
"datasource": {
|
||||
"type": "statsd",
|
||||
"uid": "5qrwjFCnk"
|
||||
},
|
||||
"fill": 1,
|
||||
"fillGradient": 0,
|
||||
@@ -46,7 +47,7 @@
|
||||
"y": 0
|
||||
},
|
||||
"hiddenSeries": false,
|
||||
"id": ${loop.index},
|
||||
"id": 5,
|
||||
"legend": {
|
||||
"alignAsTable": true,
|
||||
"avg": true,
|
||||
@@ -91,7 +92,7 @@
|
||||
"title": "${service_name} | ${grafana_dict['stat_name']}",
|
||||
"tooltip": {
|
||||
"shared": true,
|
||||
"sort": ${loop.index},
|
||||
"sort": 0,
|
||||
"value_type": "individual"
|
||||
},
|
||||
"type": "graph",
|
||||
@@ -115,11 +116,7 @@
|
||||
"yaxis": {
|
||||
"align": false
|
||||
}
|
||||
% if ${grafana_dict['is_last']}:
|
||||
}
|
||||
% else:
|
||||
},
|
||||
% endif
|
||||
% endfor
|
||||
],
|
||||
"refresh": "3s",
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import importlib
|
||||
import inspect
|
||||
import os
|
||||
import shutil
|
||||
@@ -9,10 +10,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']
|
||||
|
||||
|
||||
def check_docker():
|
||||
"""
|
||||
@@ -27,10 +24,9 @@ def check_docker():
|
||||
click.echo('Please start docker correctly', err=True)
|
||||
raise
|
||||
|
||||
# TODO 目前在某些系统环境的检查不准确,暂时去除这个检查逻辑
|
||||
# if not docker.compose.is_installed():
|
||||
# click.echo('Please install docker-compose first', err=True)
|
||||
# raise
|
||||
if not docker.compose.is_installed():
|
||||
click.echo('Please install docker-compose first', err=True)
|
||||
raise
|
||||
|
||||
|
||||
@contextmanager
|
||||
@@ -109,7 +105,7 @@ def start_statsd_agent():
|
||||
|
||||
def start_statsd_exporter():
|
||||
with status(f'Starting statsd exporter'):
|
||||
statsd_mapping_file_path = os.getcwd() + '/statsd_mapping.yml'
|
||||
statsd_mapping_file_path = os.path.join('.', '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,
|
||||
@@ -136,7 +132,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(os.getcwd(), 'grafana_dashboards')
|
||||
grafana_dashboard_path = os.path.join(grafana_conf_dir, 'grafana_conf/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',
|
||||
@@ -158,7 +154,6 @@ def stop_network(network_name):
|
||||
|
||||
|
||||
def start_metric_servers():
|
||||
# TODO 检查相应容器是否已启动,如果启动,则先删除
|
||||
start_network('metric_servers')
|
||||
sleep(0.5)
|
||||
start_prometheus()
|
||||
@@ -238,7 +233,7 @@ def cli():
|
||||
@click.option('-t', '--type', '_type',
|
||||
default='all',
|
||||
show_default=True,
|
||||
type=click.Choice(INIT_TYPE_CHOICES, case_sensitive=False),
|
||||
type=click.Choice(['all', 'rpc', 'event', 'http', 'timer', 'demo'], case_sensitive=False),
|
||||
help='The template type of nameko service')
|
||||
def init(directory, _type):
|
||||
"""
|
||||
@@ -263,7 +258,7 @@ def init(directory, _type):
|
||||
@cli.command()
|
||||
@click.option('-m', '--middleware',
|
||||
required=True,
|
||||
type=click.Choice(MIDDLEWARE_CHOICES, case_sensitive=False),
|
||||
type=click.Choice(['rabbitmq', 'metrics'], case_sensitive=False),
|
||||
help='The middleware name')
|
||||
def start(middleware):
|
||||
"""
|
||||
@@ -276,7 +271,7 @@ def start(middleware):
|
||||
@cli.command()
|
||||
@click.option('-m', '--middleware',
|
||||
required=True,
|
||||
type=click.Choice(MIDDLEWARE_CHOICES, case_sensitive=False),
|
||||
type=click.Choice(['rabbitmq', 'metrics'], case_sensitive=False),
|
||||
help='The middleware name')
|
||||
def stop(middleware):
|
||||
"""
|
||||
@@ -293,7 +288,7 @@ def stop(middleware):
|
||||
@click.option('-t', '--type', '_type',
|
||||
default='unit',
|
||||
show_default=True,
|
||||
type=click.Choice(TEST_TYPE_CHOICES, case_sensitive=False),
|
||||
type=click.Choice(['unit'], case_sensitive=False),
|
||||
help='The test type of the nameko service')
|
||||
def test_gen(directory, _type):
|
||||
"""
|
||||
@@ -324,15 +319,13 @@ def metric_config_gen(module, class_name_str):
|
||||
"""
|
||||
import sys
|
||||
from statsd.client.timer import Timer
|
||||
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))
|
||||
sys.path.append(os.getcwd())
|
||||
click.echo(f'sys.path: {sys.path}')
|
||||
|
||||
# Extract information of statsd config from the class of nameko service
|
||||
dest_dir = module.split('.')[0]
|
||||
file_name = module.split('.')[-1]
|
||||
_module = __import__(module)
|
||||
|
||||
config_list = []
|
||||
for class_name in class_name_str.split(','):
|
||||
members = inspect.getmembers(getattr(getattr(_module, file_name), class_name), predicate=inspect.isfunction)
|
||||
@@ -349,34 +342,24 @@ def metric_config_gen(module, class_name_str):
|
||||
})
|
||||
|
||||
# Generate one file of statsd config yaml for statsd exporter
|
||||
with status(f'Creating statsd_mapping.yml'):
|
||||
metric_configs_dir = os.path.join(get_directory('chassis-agent'), 'metric-configs')
|
||||
template_file_path = os.path.join(metric_configs_dir, 'statsd_mapping.yml.mako')
|
||||
output_file = os.path.join('.', 'statsd_mapping.yml')
|
||||
template_to_file(template_file=template_file_path, dest=output_file, output_encoding='utf-8',
|
||||
**{'config_list': config_list})
|
||||
metric_configs_dir = os.path.join(get_directory('chassis-agent'), 'metric-configs')
|
||||
template_file_path = os.path.join(metric_configs_dir, 'statsd_mapping.yml.mako')
|
||||
output_file = os.path.join('.', 'statsd_mapping.yml')
|
||||
template_to_file(template_file=template_file_path, dest=output_file, output_encoding='utf-8',
|
||||
**{'config_list': config_list})
|
||||
|
||||
# Generate files of json for grafana dashboard
|
||||
if not os.access('grafana_dashboards', os.F_OK):
|
||||
with status(f'Creating directory {os.path.abspath("grafana_dashboards")!r}'):
|
||||
os.makedirs('grafana_dashboards')
|
||||
|
||||
with status(f'Creating files of Grafana.json into the directory of grafana_dashboards'):
|
||||
for class_name in class_name_str.split(','):
|
||||
grafana_list = []
|
||||
for idx, config in enumerate(config_list):
|
||||
if config['class_name'] == class_name:
|
||||
if idx+1 == len(config_list):
|
||||
config['is_last'] = True
|
||||
else:
|
||||
config['is_last'] = False
|
||||
grafana_list.append(config)
|
||||
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')
|
||||
template_to_file(template_file=grafana_file_path, dest=output_file, output_encoding='utf-8',
|
||||
**{'service_name': class_name, 'uid': shortuuid.uuid(),
|
||||
'grafana_list': grafana_list})
|
||||
for class_name in class_name_str.split(','):
|
||||
grafana_list = []
|
||||
for config in config_list:
|
||||
if config['class_name'] == class_name:
|
||||
grafana_list.append(config)
|
||||
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(dest_dir, f'{class_name}_Grafana.json')
|
||||
template_to_file(template_file=grafana_file_path, dest=output_file, output_encoding='utf-8',
|
||||
**{'service_name': class_name, 'uid': shortuuid.uuid(),
|
||||
'grafana_list': grafana_list})
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
18
setup.py
18
setup.py
@@ -9,7 +9,7 @@ with open(path.join(here, 'README.md'), encoding='utf-8') as f:
|
||||
|
||||
setup(
|
||||
name='namekoplus',
|
||||
version='0.4.18',
|
||||
version='0.4.0',
|
||||
description='A lightweight Python distributed microservice solution',
|
||||
long_description=long_description,
|
||||
long_description_content_type='text/markdown',
|
||||
@@ -50,7 +50,7 @@ setup(
|
||||
install_requires=[
|
||||
'nameko==3.0.0rc11',
|
||||
'click==8.1.5',
|
||||
'python-on-whales==0.64.0',
|
||||
'python-on-whales==0.63.0',
|
||||
'pytest==7.4.0',
|
||||
'mako==1.2.4',
|
||||
'shortuuid==1.0.11'
|
||||
@@ -59,11 +59,19 @@ setup(
|
||||
'ha': ['tenacity==8.2.2',
|
||||
'cachetools==5.3.0',
|
||||
'circuitbreaker==2.0.0',
|
||||
'logstash_formatter==0.5.17'],
|
||||
'ob': ['statsd==4.0.1',
|
||||
'statsd==4.0.1',
|
||||
'logstash_formatter==0.5.17',
|
||||
'nameko-sentry==1.0.0',
|
||||
'nameko-tracer==1.4.0'],
|
||||
'schema': ['marshmallow==3.20.1'],
|
||||
'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']
|
||||
},
|
||||
|
Reference in New Issue
Block a user