{"id":15981002,"url":"https://github.com/macbre/http-shadow","last_synced_at":"2025-07-20T11:32:57.211Z","repository":{"id":141987957,"uuid":"147650587","full_name":"macbre/http-shadow","owner":"macbre","description":"Compares HTTP responses from two different backends","archived":false,"fork":false,"pushed_at":"2020-10-02T08:42:03.000Z","size":44,"stargazers_count":0,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-22T19:12:52.602Z","etag":null,"topics":["sre","sus"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/macbre.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-06T09:31:04.000Z","updated_at":"2019-04-15T08:01:45.000Z","dependencies_parsed_at":null,"dependency_job_id":"760f6fc7-6361-4c46-a112-3347de178078","html_url":"https://github.com/macbre/http-shadow","commit_stats":{"total_commits":52,"total_committers":3,"mean_commits":"17.333333333333332","dds":0.09615384615384615,"last_synced_commit":"040935b0715f983714f38005f8ae97c255dae3e0"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/macbre/http-shadow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fhttp-shadow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fhttp-shadow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fhttp-shadow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fhttp-shadow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/macbre","download_url":"https://codeload.github.com/macbre/http-shadow/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fhttp-shadow/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266117712,"owners_count":23879108,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["sre","sus"],"created_at":"2024-10-08T00:23:51.392Z","updated_at":"2025-07-20T11:32:57.194Z","avatar_url":"https://github.com/macbre.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# http-shadow\nCompares HTTP responses from two different backends\n\n### How to run\n\n1. Set up virtualenv with python 3\n2. Install dependencies by running `python setup.py develop`\n3. Run the following (preferrably in `screen`):\n\n```\nget_urls | check_urls\n```\n\nThis will pipe URLs found in Apache access log to the process that will perform two requests: to Apache and to Kubernetes. Response code and headers will be compared and results logged via syslog with `http-shadow` ident.\n\n4. To compare production vs k8s-powered sandbox use:\n```\nget_urls | check_urls \u003csandbox name, e.g. sandbox-s6\u003e\n```\n\n### Log entry example\n\n```json\n{\n  \"appname\": \"http-shadow\",\n  \"is_ok\": true,\n  \"url\": \"http://muppet.fandom.com/wiki/Elmo\",\n  \"apache\": {\n    \"response\": {\n      \"status_code\": 200,\n      \"location\": null,\n      \"cache_control\": \"s-maxage=86400, must-revalidate, max-age=0\",\n      \"content_type\": \"text/html; charset=utf-8\"\n    },\n    \"info\": {\n      \"x_served_by\": \"ap-s204\",\n      \"x_response_time\": 0.083\n    }\n  },\n  \"kube\": {\n    \"response\": {\n      \"status_code\": 200,\n      \"location\": null,\n      \"cache_control\": \"s-maxage=86400, must-revalidate, max-age=0\",\n      \"content_type\": \"text/html; charset=utf-8\"\n    },\n    \"info\": {\n      \"x_served_by\": \"mediawiki-sandbox-s6-99597bbd4-f2h7q\",\n      \"x_response_time\": 0.124\n    }\n  }\n}\n```\n\n### Tests\n\nRun `py.test`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmacbre%2Fhttp-shadow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmacbre%2Fhttp-shadow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmacbre%2Fhttp-shadow/lists"}