diff --git a/backup_github/backup.py b/backup_github/backup.py index 8f73409..1ed0fff 100644 --- a/backup_github/backup.py +++ b/backup_github/backup.py @@ -1,5 +1,6 @@ import logging import os +import shutil import subprocess from pathlib import Path from typing import Optional @@ -72,7 +73,8 @@ def __save_repositories(self, repositories, dir): for repository in repositories: if self.api.get_repository(repository)["size"] == 0: continue - self.__save_repo_content(repository, dir) + if not self.__save_repo_content(repository, dir): + continue repo = self.api.get_repository(repository) filter_save( repo, @@ -103,10 +105,17 @@ def __save_repo_content(self, repository, dir): repo_url = ( f"https://{self.token}@github.com/{self.organization}/{repository}.git" ) - subprocess_handle(subprocess.call, ["git", "clone", "--bare", repo_url]) + try: + subprocess_handle(subprocess.call, ["git", "clone", "--bare", repo_url]) + except subprocess.CalledProcessError: + shutil.rmtree(f"{dir}/{repository}") + logging.error(f"Repository {repository} backup error, will be skipped") + os.chdir(cur_dir) + return False os.chdir(f"{repository}.git") subprocess_handle(subprocess.check_output, ["git", "fetch", "-p"]) os.chdir(cur_dir) + return True def __save_members(self, members, members_dir): for member in members: diff --git a/backup_github/github.py b/backup_github/github.py index b559292..04ba746 100644 --- a/backup_github/github.py +++ b/backup_github/github.py @@ -3,6 +3,8 @@ import requests +from backup_github.metrics import rate_limit_count + class GithubAPI: headers = dict @@ -30,6 +32,7 @@ def __init__(self, message=None): def raise_by_status(self, response): if response.status_code == 403: logging.warning("Status is 403 - Rate limit exceeded exception") + rate_limit_count.labels(self.organization).inc() raise self.RateLimitExceededException(response.content) elif response.status_code == 404: logging.warning( diff --git a/backup_github/main.py b/backup_github/main.py index a674cc2..4ff2003 100644 --- a/backup_github/main.py +++ b/backup_github/main.py @@ -8,7 +8,7 @@ from backup_github.backup import Backup from backup_github.metrics import ( - backup_interval, + backup_duration, backup_time, git_size, meta_size, @@ -60,8 +60,8 @@ def main(): sum(p.stat().st_size for p in Path(parsed_args.output_dir).rglob("*")) - git_size.labels(parsed_args.organization)._value.get() ) - backup_interval.labels(parsed_args.organization).set(time() - start) - write_to_textfile(f"{parsed_args.metrics_path}/github_backup.prom", registry) + backup_duration.labels(parsed_args.organization).set(time() - start) + write_to_textfile(f"{parsed_args.metrics_path}", registry) if __name__ == "__main__": diff --git a/backup_github/metrics.py b/backup_github/metrics.py index f17f791..1eb58a1 100644 --- a/backup_github/metrics.py +++ b/backup_github/metrics.py @@ -25,9 +25,15 @@ labelnames=["organization"], registry=registry, ) -backup_interval = Gauge( - "github_backup_interval_timestamp_seconds", - "time of last backup in unixtime", +backup_duration = Gauge( + "github_backup_duration_seconds", + "duration of last backup in seconds", + labelnames=["organization"], + registry=registry, +) +rate_limit_count = Gauge( + "github_backup_rate_limit_count", + "count of rate limit", labelnames=["organization"], registry=registry, ) diff --git a/backup_github/utils.py b/backup_github/utils.py index ebfc493..de89b50 100644 --- a/backup_github/utils.py +++ b/backup_github/utils.py @@ -24,6 +24,7 @@ def subprocess_handle(func, args): logging.error("exit code: {}".format(e.returncode)) logging.error("stdout: {}".format(e.output.decode(sys.getfilesystemencoding()))) logging.error("stderr: {}".format(e.stderr.decode(sys.getfilesystemencoding()))) + raise e def filter_save(struct, fields, path):