def get_key_paths(data_dict,
                  keys_to_consider=None,
                  keys_not_to_consider=None,
                  root_path=None):
    """

    Example:
    get_key_paths({
        'a' : {
            'b': 1
        },
        'c' : 2
    })

    returns:
    ['a.b', 'c']

    :param data_dict: (Nested) dict with metrics
    :type data_dict: dict

    :param keys_to_consider: list with (root) key names to focus
    :type keys_to_consider: list

    :param keys_not_to_consider: list with key names to discard (on any nesting level)
    :type keys_not_to_consider: list

    :param root_path: root path to prepend.
    :type root_path: string

    :return: list with key metric path strings

    :rtype:
    """
    if keys_to_consider is None:
        keys_to_consider = list(data_dict.keys())

    if keys_not_to_consider is None:
        keys_not_to_consider = []

    key_paths = []
    for key in keys_to_consider:
        if key in keys_not_to_consider:
            continue

        value = data_dict[key]

        if root_path is not None:
            current_path = f"{root_path}.{key}"
        else:
            current_path = key

        path_list = []
        if type(value) is dict:
            path_list = get_key_paths(value,
                                      keys_not_to_consider=keys_not_to_consider,
                                      root_path=current_path)

        if len(path_list) == 0:
            path_list = [current_path]

        key_paths += path_list

    return key_paths