4 Commits

Author SHA1 Message Date
a9adfa5cb1 debug 3 2023-07-27 16:08:36 +08:00
d2025c628e debug 2 2023-07-27 16:04:57 +08:00
45e8b692f0 debug 2023-07-27 16:01:14 +08:00
857d26d092 feat: add metrics for nameko services 2023-07-27 14:02:01 +08:00
4 changed files with 48 additions and 55 deletions

View File

@@ -1,10 +1,8 @@
# namekoplus # namekoplus
[![Upload Python Package](https://github.com/Bryanthelol/namekoplus/actions/workflows/python-publish.yml/badge.svg?event=release)](https://github.com/Bryanthelol/namekoplus/actions/workflows/python-publish.yml)
A lightweight Python distributed microservice solution A lightweight Python distributed microservice solution
## CLI Usage ## Command Line Tool Usage
### Checkout Command ### Checkout Command
@@ -29,5 +27,5 @@ namekoplus init --directory <dir_name> --type <template_type>
See Documents: See Documents:
- [English](https://murl.vip/TwML) - [中文](https://doc.bearcatlog.com/)
- [中文](https://murl.vip/B0O9) - [English](https://legendary-sopapillas-e2626d.netlify.app/)

View File

@@ -116,7 +116,7 @@
"yaxis": { "yaxis": {
"align": false "align": false
} }
}, }
% endfor % endfor
], ],
"refresh": "3s", "refresh": "3s",

View File

@@ -1,3 +1,4 @@
import importlib
import inspect import inspect
import os import os
import shutil import shutil
@@ -9,10 +10,6 @@ import shortuuid
from python_on_whales import DockerException, ClientNotFoundError, DockerClient, docker from python_on_whales import DockerException, ClientNotFoundError, DockerClient, docker
from mako.template import Template 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(): def check_docker():
""" """
@@ -27,10 +24,9 @@ def check_docker():
click.echo('Please start docker correctly', err=True) click.echo('Please start docker correctly', err=True)
raise raise
# TODO 目前在某些系统环境的检查不准确,暂时去除这个检查逻辑 if not docker.compose.is_installed():
# if not docker.compose.is_installed(): click.echo('Please install docker-compose first', err=True)
# click.echo('Please install docker-compose first', err=True) raise
# raise
@contextmanager @contextmanager
@@ -109,7 +105,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.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', 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,
@@ -136,7 +132,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.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', 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',
@@ -158,7 +154,6 @@ def stop_network(network_name):
def start_metric_servers(): def start_metric_servers():
# TODO 检查相应容器是否已启动,如果启动,则先删除
start_network('metric_servers') start_network('metric_servers')
sleep(0.5) sleep(0.5)
start_prometheus() start_prometheus()
@@ -238,7 +233,7 @@ def cli():
@click.option('-t', '--type', '_type', @click.option('-t', '--type', '_type',
default='all', default='all',
show_default=True, 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') help='The template type of nameko service')
def init(directory, _type): def init(directory, _type):
""" """
@@ -263,7 +258,7 @@ def init(directory, _type):
@cli.command() @cli.command()
@click.option('-m', '--middleware', @click.option('-m', '--middleware',
required=True, required=True,
type=click.Choice(MIDDLEWARE_CHOICES, case_sensitive=False), type=click.Choice(['rabbitmq', 'metrics'], case_sensitive=False),
help='The middleware name') help='The middleware name')
def start(middleware): def start(middleware):
""" """
@@ -276,7 +271,7 @@ def start(middleware):
@cli.command() @cli.command()
@click.option('-m', '--middleware', @click.option('-m', '--middleware',
required=True, required=True,
type=click.Choice(MIDDLEWARE_CHOICES, case_sensitive=False), type=click.Choice(['rabbitmq', 'metrics'], case_sensitive=False),
help='The middleware name') help='The middleware name')
def stop(middleware): def stop(middleware):
""" """
@@ -293,7 +288,7 @@ def stop(middleware):
@click.option('-t', '--type', '_type', @click.option('-t', '--type', '_type',
default='unit', default='unit',
show_default=True, 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') help='The test type of the nameko service')
def test_gen(directory, _type): def test_gen(directory, _type):
""" """
@@ -322,17 +317,15 @@ def metric_config_gen(module, class_name_str):
""" """
Generate metric config for nameko services. Generate metric config for nameko services.
""" """
import sys
from statsd.client.timer import Timer from statsd.client.timer import Timer
sys.path.append(os.getcwd())
for root, dirs, files in os.walk(os.getcwd()): import sys
for _dir in dirs: click.echo(f'sys.path: {sys.path}')
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
dest_dir = module.split('.')[0]
file_name = module.split('.')[-1] file_name = module.split('.')[-1]
_module = __import__(module) _module = importlib.import_module(name='.'+file_name, package=dest_dir)
config_list = [] config_list = []
for class_name in class_name_str.split(','): for class_name in class_name_str.split(','):
members = inspect.getmembers(getattr(getattr(_module, file_name), class_name), predicate=inspect.isfunction) members = inspect.getmembers(getattr(getattr(_module, file_name), class_name), predicate=inspect.isfunction)
@@ -349,7 +342,6 @@ def metric_config_gen(module, class_name_str):
}) })
# Generate one file of statsd config yaml for statsd exporter # 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') 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') template_file_path = os.path.join(metric_configs_dir, 'statsd_mapping.yml.mako')
output_file = os.path.join('.', 'statsd_mapping.yml') output_file = os.path.join('.', 'statsd_mapping.yml')
@@ -357,11 +349,6 @@ def metric_config_gen(module, class_name_str):
**{'config_list': config_list}) **{'config_list': config_list})
# Generate files of json for grafana dashboard # 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(','): for class_name in class_name_str.split(','):
grafana_list = [] grafana_list = []
for config in config_list: for config in config_list:
@@ -369,7 +356,7 @@ def metric_config_gen(module, class_name_str):
grafana_list.append(config) grafana_list.append(config)
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(dest_dir, f'{class_name}_Grafana.json')
template_to_file(template_file=grafana_file_path, dest=output_file, output_encoding='utf-8', template_to_file(template_file=grafana_file_path, dest=output_file, output_encoding='utf-8',
**{'service_name': class_name, 'uid': shortuuid.uuid(), **{'service_name': class_name, 'uid': shortuuid.uuid(),
'grafana_list': grafana_list}) 'grafana_list': grafana_list})

View File

@@ -9,7 +9,7 @@ with open(path.join(here, 'README.md'), encoding='utf-8') as f:
setup( setup(
name='namekoplus', name='namekoplus',
version='0.4.14', version='0.4.0',
description='A lightweight Python distributed microservice solution', description='A lightweight Python distributed microservice solution',
long_description=long_description, long_description=long_description,
long_description_content_type='text/markdown', long_description_content_type='text/markdown',
@@ -50,7 +50,7 @@ setup(
install_requires=[ install_requires=[
'nameko==3.0.0rc11', 'nameko==3.0.0rc11',
'click==8.1.5', 'click==8.1.5',
'python-on-whales==0.64.0', 'python-on-whales==0.63.0',
'pytest==7.4.0', 'pytest==7.4.0',
'mako==1.2.4', 'mako==1.2.4',
'shortuuid==1.0.11' 'shortuuid==1.0.11'
@@ -59,11 +59,19 @@ setup(
'ha': ['tenacity==8.2.2', 'ha': ['tenacity==8.2.2',
'cachetools==5.3.0', 'cachetools==5.3.0',
'circuitbreaker==2.0.0', 'circuitbreaker==2.0.0',
'logstash_formatter==0.5.17'], 'statsd==4.0.1',
'ob': ['statsd==4.0.1', 'logstash_formatter==0.5.17',
'nameko-sentry==1.0.0', 'nameko-sentry==1.0.0',
'nameko-tracer==1.4.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'], 'security': ['cryptography'],
'dev': ['environs==9.5.0'] 'dev': ['environs==9.5.0']
}, },