{"id":18026842,"url":"https://github.com/yegor256/sixnines","last_synced_at":"2025-04-07T17:08:59.816Z","repository":{"id":48151379,"uuid":"84595359","full_name":"yegor256/sixnines","owner":"yegor256","description":"Website Availability Monitor: add your website to our dashboard and get 24x7 monitoring of its availability (and a badge!)","archived":false,"fork":false,"pushed_at":"2025-04-07T15:02:01.000Z","size":704,"stargazers_count":72,"open_issues_count":14,"forks_count":10,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-07T16:23:45.841Z","etag":null,"topics":["availability","hosted","monitoring","ruby"],"latest_commit_sha":null,"homepage":"https://www.sixnines.io","language":"Ruby","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/yegor256.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2017-03-10T19:48:30.000Z","updated_at":"2025-04-07T15:02:05.000Z","dependencies_parsed_at":"2023-12-15T03:39:01.235Z","dependency_job_id":"98067747-4452-4da9-84b7-402b951a2b08","html_url":"https://github.com/yegor256/sixnines","commit_stats":null,"previous_names":[],"tags_count":63,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yegor256%2Fsixnines","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yegor256%2Fsixnines/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yegor256%2Fsixnines/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yegor256%2Fsixnines/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yegor256","download_url":"https://codeload.github.com/yegor256/sixnines/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247694876,"owners_count":20980733,"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":["availability","hosted","monitoring","ruby"],"created_at":"2024-10-30T08:08:15.057Z","updated_at":"2025-04-07T17:08:59.802Z","avatar_url":"https://github.com/yegor256.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg alt=\"logo\" src=\"https://www.sixnines.io/images/logo.png\" width=\"64px\" height=\"64px\"/\u003e\n\n[![DevOps By Rultor.com](https://www.rultor.com/b/yegor256/sixnines)](https://www.rultor.com/p/yegor256/sixnines)\n[![We recommend RubyMine](https://www.elegantobjects.org/rubymine.svg)](https://www.jetbrains.com/ruby/)\n\n[![rake](https://github.com/yegor256/sixnines/actions/workflows/rake.yml/badge.svg)](https://github.com/yegor256/sixnines/actions/workflows/rake.yml)\n[![PDD status](https://www.0pdd.com/svg?name=yegor256/sixnines)](https://www.0pdd.com/p?name=yegor256/sixnines)\n[![Maintainability](https://api.codeclimate.com/v1/badges/c3b56d829753998ee405/maintainability)](https://codeclimate.com/github/yegor256/sixnines/maintainability)\n[![Hits-of-Code](https://hitsofcode.com/github/yegor256/sixnines)](https://hitsofcode.com/view/github/yegor256/sixnines)\n[![codecov](https://codecov.io/gh/yegor256/sixnines/branch/master/graph/badge.svg)](https://codecov.io/gh/yegor256/sixnines)\n\n[![Availability at SixNines](https://www.sixnines.io/b/9ccc)](https://www.sixnines.io/h/9ccc)\n\n[SixNines](https://www.sixnines.io) is a hosted service to validate\nand prove availability of your web service and sites.\n\nRead this blog post for more details:\n[_SixNines.io, Your Website Availability Monitor_](http://www.yegor256.com/2017/04/25/sixnines.html).\n\nThe badge is available as:\n\n```\nhttps://www.sixnines.io/b/5fa8?style=flat\u0026format=png\n```\n\nHere, the `style` parameter can be either `round` or `flat`.\nThe `format` parameter can be either `svg` (106x20) or `png` (424x80).\n\nThis is how you put it in your `README` (in Markdown):\n\n```\n[![Availability at SixNines](https://www.sixnines.io/b/5fa8)](https://www.sixnines.io/h/5fa8)\n```\n\nThe badge you see above works exactly like that.\n\n## DynamoDB Schema\n\nThe `sn-endpoints` table contains all registered end-points:\n\n```\nfields:\n  login/H: GitHub login of the owner\n  uri/R: URI of the endpoint, e.g. \"http://www.google.com/?q=hello\"\n  id: Unique ID of the endpoint\n  active: \"yes\" if it's alive, \"no\" otherwise\n  created: Epoch time number of when it was added\n  hostname: Host name of the URI, e.g. \"google.com\"\n  pings: Total amount of ping's we've done so far\n  failures: Total amount of failed attempts\n  state: Either \"up\" or \"down\"\n  updated: Epoch time of the most recent update of this record\n  flipped: Epoch time of recent state change\n  expires: Epoch time when it has to be pinged again\n  log: Detailed log of the most recent failure\n  favicon: URI of the favicon\nsn-endpoints/unique: (index)\n  id/H\nsn-endpoints/hostnames: (index)\n  active/H\n  hostname/R\nsn-endpoints/flips: (index)\n  active/H\n  flipped/R\nsn-endpoints/expires: (index)\n  active/H\n  expires/R\n```\n\nThe `sn-pings` table contains all recent pings:\n\n```\nfields:\n  uri/H: URI of the endpoint we pinged\n  time/R: Epoch time of ping\n  local: IP address where we were pinging from\n  remote: IP address of the endpoint we reached\n  msec: How many milliseconds it took\n  code: HTTP response code (2xx means success)\n  delete_on: TTL attribute for DynamoDB (when to delete this item)\n```\n\n## How to contribute?\n\nFirst, install\n[Java 8+](https://java.com/en/download/),\n[Maven 3.2+](https://maven.apache.org/),\n[Ruby 2.3+](https://www.ruby-lang.org/en/documentation/installation/),\n[Rubygems](https://rubygems.org/pages/download),\nand\n[Bundler](https://bundler.io/).\nThen:\n\n```bash\n$ bundle update\n$ bundle exec rake --quiet\n```\n\nThe build has to be clean. If it's not, [submit an issue](https://github.com/zold-io/out/issues).\n\nThen, make your changes, make sure the build is still clean,\nand [submit a pull request](https://www.yegor256.com/2014/04/15/github-guidelines.html).\n\nIn order to run a single test:\n\n```bash\n$ bundle exec rake run\n```\n\nThen, in another terminal:\n\n```bash\n$ bundle exec ruby test/test_base.rb -n test_lists_flips\n```\n\nThen, if you want to test the UI, open `http://localhost:9292` in your browser,\nand login, if necessary, by adding `?glogin=tester` to the URL.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyegor256%2Fsixnines","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyegor256%2Fsixnines","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyegor256%2Fsixnines/lists"}