|
|
|
@@ -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.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):
|
|
|
|
|
"""
|
|
|
|
@@ -322,17 +317,15 @@ def metric_config_gen(module, class_name_str):
|
|
|
|
|
"""
|
|
|
|
|
Generate metric config for nameko services.
|
|
|
|
|
"""
|
|
|
|
|
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))
|
|
|
|
|
|
|
|
|
|
import sys
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
_module = importlib.import_module(name='.'+file_name, package=dest_dir)
|
|
|
|
|
config_list = []
|
|
|
|
|
for class_name in class_name_str.split(','):
|
|
|
|
|
members = inspect.getmembers(getattr(getattr(_module, file_name), class_name), predicate=inspect.isfunction)
|
|
|
|
@@ -349,30 +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 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('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__':
|
|
|
|
|