async def test_app_metrics(aiohttp_client, loop): parser = get_parser() config = Config(parser, args=[]) app = make_app(config) client = await aiohttp_client(app) resp = await client.get('/metrics') assert resp.status == 200 text = await resp.text() lines = [line for line in text.split('\n') if not line.startswith('#')] text = "\n".join(lines) assert len(lines) == 80 assert 'promsd_request_count' in text assert 'promsd_build_count' in text assert 'promsd_event_count' in text assert 'promsd_reinit_count' in text assert 'promsd_errors_count' in text assert 'promsd_build_seconds' in text assert 'promsd_config_size_bytes' in text assert 'promsd_configs_units' in text
async def test_save_configs(): scrape_config = [ { "labels": { "job": "job1", }, "targets": [ "example.com", "test.example.com", ] }, ] parser = get_parser() file_out = '/tmp/services.json' config = Config(parser, args=['--out', file_out]) await save_configs(config, scrape_config) async with AIOFile(file_out, 'r') as fin: data = await fin.read() obj = json.loads(data) assert len(obj) == len(scrape_config) assert obj[0]['labels']['job'] == scrape_config[0]['labels']['job']
def test_config_metrics_config(): parser = get_parser() args = [ '--out', 'text.json', '--metrics', '--metrics.path', '/met', '--metrics.host', '0.0.0.0', '--metrics.port', '9191' ] config = Config(parser, args, DockerClientMock) config.init() assert config.options.metrics == True assert config.options.metrics_path == '/met' assert config.options.metrics_host == '0.0.0.0' assert config.options.metrics_port == 9191 args = [ '--out', 'text.json', ] config = Config(parser, args, DockerClientMock) config.init() assert config.options.metrics == False assert config.options.metrics_path == '/metrics' assert config.options.metrics_host == 'localhost' assert config.options.metrics_port == 9090
def test_config_minimal_self_init(): parser = get_parser() config = Config(parser, ['--out', 'text.json'], DockerClientMock) assert config.validate() == True assert config.get_client().url == docker_url assert config.inited == True
def test_config_log_level_base(): parser = get_parser() args = [ '--out', 'text.json', ] config = Config(parser, args, DockerClientMock) setup_logging(config) assert isinstance(config.log_handler, logging.StreamHandler)
async def test_config_deinit(): success = True parser = get_parser() file_out = '/tmp/services.json' config = Config(parser, args=['--out', file_out]) config.init() assert config.inited == True await config.deinit() assert config.inited == False
async def test_server_metrics(aiohttp_client, loop): parser = get_parser() args = ['--out', 'text.json', '--metrics', '--metrics.host', '0.0.0.0'] config = Config(parser, args, DockerClientMock) assert config.options.metrics == True webserver = loop.create_task(make_server(config)) async with aiohttp.ClientSession() as session: async with session.get('http://localhost:9090/metrics') as resp: assert resp.status == 200
async def test_build_image(): docker = aiodocker.Docker() await docker.swarm.init() with tarfile.open('context.tar.gz', 'w:gz') as fout: for name in os.listdir('.'): fout.add(name) with open('context.tar.gz', 'rb') as context: image = await docker.images.build( fileobj=context, tag="promsd:latest", encoding="gzip", ) assert image is not None image_name = 'promsd:latest' service_config = { 'ContainerSpec': { 'Image': image_name, 'Args': ['--out', '/tmp/test.json'], 'Mounts': [{ 'Type': 'bind', 'Source': '/var/run/docker.sock', 'Target': '/var/run/docker.sock' }] } } labels = { "prometheus.enable": "true", "prometheus.jobs.main.port": "9090", } service = await docker.services.create(task_template=service_config, name="promsd-service", labels=labels) parser = get_parser() config = Config(parser, args=['--out', '/tmp/services.json']) # Could be done in a better way like waiting for service to be up await asyncio.sleep(10) service_inspect = await docker.services.inspect(service['ID']) configs = await load_service_configs(config, service_inspect) assert configs is not None configs2 = await load_existing_services(config) assert len(configs) == len(configs2) assert configs[0]['labels']['job'] == 'main' labels2 = labels.copy() labels2['prometheus.enable'] = 'false' service2 = await docker.services.create(task_template=service_config, name="promsd-service2", labels=labels2) configs3 = await load_existing_services(config) assert len(configs3) == 1 config = Config(parser, args=[ '--out', '/tmp/services.json', '--meta-labels', '--service-labels' ]) configs3 = await load_existing_services(config) assert len(configs3) == 1 assert '__meta_docker_service_label_prometheus_enable' in configs3[0][ 'labels'] # load all possible labels config = Config(parser, args=[ '--out', '/tmp/services.json', '--meta-labels', '--service-labels', '--task-labels', '--container-labels' ]) configs3 = await load_existing_services(config) assert len(configs3) == 1 assert '__meta_docker_service_label_prometheus_enable' in configs3[0][ 'labels'] assert '__meta_docker_container_label_com_docker_swarm_node_id' in configs3[ 0]['labels'] # TODO add test for task labels, those are usually empty services = await docker.services.list() assert len(services) > 0 await docker.services.delete(service['ID']) await docker.swarm.leave(force=True) await docker.close()
def test_config_no_args(): parser = get_parser() config = Config(parser, [], DockerClientMock) assert config.validate() == False