kolla-cli/tools/log_collector.py

119 lines
3.4 KiB
Python
Executable File

#!/usr/bin/env python
# Copyright(c) 2016, Oracle and/or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import shutil
import sys
import tarfile
import tempfile
import traceback
from kollacli.api.client import ClientApi
tar_file_descr = None
CLIENT = ClientApi()
LOGDIR = '/tmp/container_logs'
def get_logs_from_host(host):
try:
maj_services = []
services = CLIENT.service_get_all()
for service in services:
if not service.get_parent():
# top level service
maj_services.append(service.name)
print('Adding container logs from host: %s' % host)
CLIENT.support_get_logs(maj_services, host, LOGDIR)
except Exception as e:
print('Error getting logs on host: %s: %s' % (host, str(e)))
def dump_kolla_info():
print('Getting kolla client logs')
dump_path = None
try:
dump_path = CLIENT.support_dump('/tmp')
tar_file_descr.add(dump_path)
except Exception:
print('ERROR: running dump command %s' % traceback.format_exc())
finally:
if dump_path and os.path.exists(dump_path):
os.remove(dump_path)
def main():
"""collect docker logs from servers
$ command is $ log_collector.py <all | host1[,host2,host3...]>
"""
global tar_file_descr
help_msg = 'Usage: log_collector.py <all | host1[,host2,host3...]>'
hosts = []
if len(sys.argv) == 2:
if '-h' == sys.argv[1] or '--help' == sys.argv[1]:
print(help_msg)
sys.exit(0)
elif 'all' == sys.argv[1]:
# get logs from all hosts
hosts = []
host_objs = CLIENT.host_get_all()
for host_obj in host_objs:
hosts.append(host_obj.name)
else:
# get logs from specified hosts
hostnames = sys.argv[1].split(',')
for host in hostnames:
if host not in hosts:
hosts.append(host)
else:
print(help_msg)
sys.exit(1)
# open tar file for storing logs
fd, tar_path = tempfile.mkstemp(prefix='kolla_support_logs_',
suffix='.tgz')
os.close(fd) # avoid fd leak
with tarfile.open(tar_path, 'w:gz') as tar_file_descr:
# clear out old logs
if os.path.exists(LOGDIR):
shutil.rmtree(LOGDIR)
os.mkdir(LOGDIR)
# gather logs from selected hosts
try:
for host in hosts:
get_logs_from_host(host)
# tar up all the container logs
tar_file_descr.add(LOGDIR, arcname='container_logs')
finally:
# remove uncompressed logs
if os.path.exists(LOGDIR):
shutil.rmtree(LOGDIR)
# gather dump output from kollacli
dump_kolla_info()
print('Log collection complete. Logs are at %s' % tar_path)
if __name__ == '__main__':
main()