Beispiel #1
0
def main():
    logging.basicConfig(
        level=os.environ.get('LOGLEVEL', 'INFO').upper(),
        format='%(asctime)s %(levelname)s %(message)s',
    )
    sentry_dsn = os.environ.get('SENTRY_DSN')
    if sentry_dsn:
        sentry_sdk.init(
            dsn=sentry_dsn,
            release=os.environ.get('VERSION', 'unknown'),
            default_integrations=True,
            send_default_pii=False,
            with_locals=False,
            environment=os.environ.get('CLUSTER_ENVIRONMENT', 'unknown'),
            server_name='{}:{}:{}'.format(os.environ.get('CLUSTER_ALIAS', 'unknown'),
                                          os.environ.get('CLUSTER_NODE_NAME', 'unknown'),
                                          os.environ.get('HOSTNAME', 'unknown'))

        )

    argp = argparse.ArgumentParser(description='kubernetes containers log watcher.')
    argp.add_argument('-c', '--containers-path', dest='containers_path', default=CONTAINERS_PATH,
                      help='Containers directory path mounted from the host. Can be set via WATCHER_CONTAINERS_PATH '
                      'env variable.')

    argp.add_argument('-a', '--agents', dest='agents',
                      help=('Comma separated string of required log processor agents. '
                            'Current supported agents are {}. Can be set via WATCHER_AGENTS env '
                            'variable.').format(list(BUILTIN_AGENTS)))

    argp.add_argument('-i', '--cluster-id', dest='cluster_id',
                      help='Cluster ID. Can be set via WATCHER_CLUSTER_ID env variable.')

    argp.add_argument('-u', '--kube-url', dest='kube_url',
                      help='URL to API proxy service. Service is expected to handle authentication to the Kubernetes '
                      'cluster. If set, then log-watcher will not use serviceaccount config. Can be set via '
                      'WATCHER_KUBE_URL env variable.')

    argp.add_argument('--strict-labels', dest='strict_labels', default='',
                      help='Only follow containers in pods that are labeled with these labels. Takes a comma separated '
                           ' list of label names. Can be set via WATCHER_STRICT_LABELS env variable.')

    argp.add_argument('--updated-certificates', dest='update_certificates', action='store_true', default=False,
                      help='[DEPRECATED] Call update-ca-certificates for Kubernetes service account ca.crt. '
                           'Can be set via WATCHER_KUBERNETES_UPDATE_CERTIFICATES env variable.')

    # TODO: Load required agent dynamically? break hard dependency on builtins!
    # argp.add_argument('-e', '--extra-agent', dest='extra_agent_path', default=None,
    #                   help='Import path of agent module providing job/config Jinja2 template path and required extra '
    #                        'vars from pod labels.')

    argp.add_argument('--interval', dest='interval', default=60, type=int,
                      help='Sleep interval for the watcher. Can be set via WATCHER_INTERVAL env variable.')

    argp.add_argument('-v', '--verbose', dest='verbose', action='store_true', default=False,
                      help='Verbose output. Can be set via WATCHER_DEBUG env variable.')

    args = argp.parse_args()

    if args.verbose or os.environ.get('WATCHER_DEBUG'):
        logger.setLevel(logging.DEBUG)

    containers_path = os.environ.get('WATCHER_CONTAINERS_PATH', args.containers_path)
    cluster_id = os.environ.get('WATCHER_CLUSTER_ID', args.cluster_id)
    agents_str = os.environ.get('WATCHER_AGENTS', args.agents)
    strict_labels_str = os.environ.get('WATCHER_STRICT_LABELS', args.strict_labels)

    strict_labels = strict_labels_str.split(',') if strict_labels_str else []

    update_certificates = os.environ.get('WATCHER_KUBERNETES_UPDATE_CERTIFICATES', args.update_certificates)
    if update_certificates:
        kube.update_ca_certificate()

    if not agents_str:
        logger.error('No log proccesing agents specified, please specify at least one log processing agent from %s. '
                     'Terminating watcher!', list(BUILTIN_AGENTS))
        sys.exit(1)

    agents = set(agents_str.lower().strip(' ').strip(',').split(','))

    diff = agents - set(BUILTIN_AGENTS)
    if diff:
        logger.error('Unsupported agent supplied: %s. Current supported log processing agents are %s. '
                     'Terminating watcher!', diff, BUILTIN_AGENTS)
        sys.exit(1)

    kube_url = os.environ.get('WATCHER_KUBE_URL', args.kube_url)

    interval = os.environ.get('WATCHER_INTERVAL', args.interval)

    watcher_config_file = os.environ.get('WATCHER_CONFIG')

    logger.info('Loaded configuration:')
    logger.info('\tContainers path: %s', containers_path)
    logger.info('\tAgents: %s', agents)
    logger.info('\tKube url: %s', kube_url)
    logger.info('\tInterval: %s', interval)
    logger.info('\tStrict labels: %s', strict_labels_str)
    logger.info('\tWatcher configuration file: %s', watcher_config_file)

    watch(
        containers_path,
        agents,
        cluster_id,
        interval=interval,
        kube_url=kube_url,
        strict_labels=strict_labels,
        watcher_config_file=watcher_config_file,
    )
Beispiel #2
0
def main():
    argp = argparse.ArgumentParser(
        description='kubernetes containers log watcher.')
    argp.add_argument(
        '-c',
        '--containers-path',
        dest='containers_path',
        default=CONTAINERS_PATH,
        help=
        'Containers directory path mounted from the host. Can be set via WATCHER_CONTAINERS_PATH '
        'env variable.')

    argp.add_argument(
        '-a',
        '--agents',
        dest='agents',
        help=
        ('Comma separated string of required log processor agents. '
         'Current supported agents are {}. Can be set via WATCHER_AGENTS env '
         'variable.').format(list(BUILTIN_AGENTS)))

    argp.add_argument(
        '-i',
        '--cluster-id',
        dest='cluster_id',
        help='Cluster ID. Can be set via WATCHER_CLUSTER_ID env variable.')

    argp.add_argument(
        '-u',
        '--kube-url',
        dest='kube_url',
        help=
        'URL to API proxy service. Service is expected to handle authentication to the Kubernetes '
        'cluster. If set, then log-watcher will not use serviceaccount config. Can be set via '
        'WATCHER_KUBE_URL env variable.')

    argp.add_argument(
        '--strict-labels',
        dest='strict_labels',
        action='store_true',
        default=False,
        help=
        'Only Follow containers in pods with "application" and "version" set. '
        'Can be set via WATCHER_STRICT_LABELS env variable.')

    argp.add_argument(
        '--updated-certificates',
        dest='update_certificates',
        action='store_true',
        default=False,
        help=
        '[DEPRECATED] Call update-ca-certificates for Kubernetes service account ca.crt. '
        'Can be set via WATCHER_KUBERNETES_UPDATE_CERTIFICATES env variable.')

    # TODO: Load required agent dynamically? break hard dependency on builtins!
    # argp.add_argument('-e', '--extra-agent', dest='extra_agent_path', default=None,
    #                   help='Import path of agent module providing job/config Jinja2 template path and required extra '
    #                        'vars from pod labels.')

    argp.add_argument(
        '--interval',
        dest='interval',
        default=60,
        type=int,
        help=
        'Sleep interval for the watcher. Can be set via WATCHER_INTERVAL env variable.'
    )

    argp.add_argument(
        '-v',
        '--verbose',
        dest='verbose',
        action='store_true',
        default=False,
        help='Verbose output. Can be set via WATCHER_DEBUG env variable.')

    args = argp.parse_args()

    if args.verbose or os.environ.get('WATCHER_DEBUG'):
        logger.setLevel(logging.DEBUG)

    containers_path = os.environ.get('WATCHER_CONTAINERS_PATH',
                                     args.containers_path)
    cluster_id = os.environ.get('WATCHER_CLUSTER_ID', args.cluster_id)
    agents_str = os.environ.get('WATCHER_AGENTS', args.agents)
    strict_labels = os.environ.get('WATCHER_STRICT_LABELS', args.strict_labels)

    update_certificates = os.environ.get(
        'WATCHER_KUBERNETES_UPDATE_CERTIFICATES', args.update_certificates)
    if update_certificates:
        kube.update_ca_certificate()

    if not agents_str:
        logger.error((
            'No log proccesing agents specified, please specify at least one log processing agent from {}. '
            'Terminating watcher!').format(list(BUILTIN_AGENTS)))
        sys.exit(1)

    agents = set(agents_str.lower().strip(' ').strip(',').split(','))

    diff = agents - set(BUILTIN_AGENTS)
    if diff:
        logger.error(('Unsupported agent supplied: {}. '
                      'Current supported log processing agents are {}. '
                      'Terminating watcher!').format(diff, BUILTIN_AGENTS))
        sys.exit(1)

    kube_url = os.environ.get('WATCHER_KUBE_URL', args.kube_url)

    interval = os.environ.get('WATCHER_INTERVAL', args.interval)

    logger.info('Loaded configuration:')
    logger.info('\tContainers path: {}'.format(containers_path))
    logger.info('\tAgents: {}'.format(agents))
    logger.info('\tKube url: {}'.format(kube_url))
    logger.info('\tInterval: {}'.format(interval))

    watch(containers_path,
          agents,
          cluster_id,
          interval=interval,
          kube_url=kube_url,
          strict_labels=strict_labels)