{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla-services/heka/pulls/comments/61090823","id":61090823,"diff_hunk":"@@ -0,0 +1,274 @@\n+-- This Source Code Form is subject to the terms of the Mozilla Public\n+-- License, v. 2.0. If a copy of the MPL was not distributed with this\n+-- file, You can obtain one at http://mozilla.org/MPL/2.0/.\n+\n+--[[BIND query log decoder\n+\n+BIND DNS query log decoder script.\n+\n+Adapted from: https://github.com/mozilla-services/heka/wiki/How-to-convert-a-PayloadRegex-MultiDecoder-to-a-SandboxDecoder-using-an-LPeg-Grammar\n+\n+Built with the help of: http://lpeg.trink.com/\n+\n+Reference for LPEG functions and uses: http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html\n+\n+Sources for explanations on what the flags mean:\n+\n+https://deepthought.isc.org/article/AA-00434/0/What-do-EDC-and-other-letters-I-see-in-my-query-log-mean.html\n+\n+http://jpmens.net/2011/02/22/bind-querylog-know-your-flags/\n+\n+Set the print-category, print-severity and print-time options to 'yes' in your query logging channel options in /etc/named.conf.\n+\n+Config:\n+\n+- type (string, optional, default nil):\n+    Sets the message 'Type' header to the specified value\n+\n+Example usage:\n+\n+[bind_query_logs]\n+type = \"LogstreamerInput\"\n+decoder = \"bind_query_log_decoder\"\n+file_match = 'named_query.log'\n+log_directory = \"/var/log/named\"\n+\n+[bind_query_log_decoder]\n+type = \"SandboxDecoder\"\n+filename = \"lua_decoders/bind_query_log_decoder.lua\"\n+  [bind_query_log_decoder.config]\n+  type = \"bind.query\"\n+\n+--]]\n+\n+local l = require 'lpeg'\n+local math = require 'math'\n+local string = require 'string'\n+local date_time = require 'date_time'\n+local ip = require 'ip_address'\n+local table = require 'table'\n+local syslog   = require \"syslog\"\n+l.locale(l)\n+\n+local formats  = read_config(\"formats\")\n+--Read the \"type\" value from the config:\n+local msg_type = read_config(\"type\")\n+\n+--[[ Generic patterns --]]\n+--Patterns for strings in the log lines that don't change from query to query:\n+local space = l.space\n+-- ':'\n+local colon_literal = l.P\":\"\n+-- 'queries'\n+local queries_literal = l.P\"queries:\"\n+-- '#'\n+local pound_literal = l.P\"#\" \n+-- 'info'\n+local info_literal = l.P\"info:\"\n+-- 'client'\n+local client_literal = l.P\"client\"\n+-- '('\n+local open_paren_literal = l.P\"(\"\n+-- ')'\n+local close_paren_literal = l.P\")\"\n+-- 'query'\n+local query_literal = l.P\"query:\"\n+-- 'IN' literal string; \n+local in_literal = l.P\"IN\"\n+-- '+' literal character; + indicates that recursion was requested.\n+local plus_literal = l.P\"+\"\n+-- '-' literal character; - indicates that recursion was not requested.\n+local minus_literal = l.P\"-\"\n+-- 'E' literal character; E indicates that extended DNS was used\n+-- Source: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2575001\n+-- More about EDNS: https://en.wikipedia.org/wiki/Extension_mechanisms_for_DNS\n+local e_literal = l.P\"E\"\n+-- 'S' literal character; s indicates that the query was signed\n+-- Source: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2575001\n+local s_literal = l.P\"S\"\n+--'D' literal character; D means the client wants any DNSSEC related data\n+-- Source: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2575001\n+local d_literal = l.P\"D\"\n+--'T' literal character; if TCP was used\n+-- Source: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2575001\n+local t_literal = l.P\"T\"\n+--'C' literal character; queryer wants an answer anyway even if DNSSEC validation checks fail\n+-- Source: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2575001\n+local c_literal = l.P\"C\"\n+\n+\n+--[[ More complicated patterns for things that do change from line to line: --]]\n+\n+--The below pattern matches date/timestamps in the following format:\n+-- 27-May-2015 21:06:49.246\n+-- The milliseconds (the .246) are discarded by the `l.P\".\" * l.P(3)` at the end:\n+--Source: https://github.com/mozilla-services/lua_sandbox/blob/dev/modules/date_time.lua\n+local timestamp = l.Cg(date_time.build_strftime_grammar(\"%d-%b-%Y %H:%M:%S\") / date_time.time_to_ns, \"Timestamp\") * l.P\".\" * l.P(3)\n+local x4            = l.xdigit * l.xdigit * l.xdigit * l.xdigit\n+\n+--The below pattern matches IPv4 addresses from BIND query logs like the following:\n+-- 10.0.1.70#41242\n+-- The # and ephemeral port number are discarded by the `pound_literal * l.P(5)` at the end:\n+local client_ip = l.Cg(l.Ct(l.Cg(ip.v4, \"value\") * l.Cg(l.Cc\"ipv4\", \"representation\")), \"ClientIP\") * pound_literal * l.P(5)\n+\n+--The ends of query logs have the IP address the DNS server used to respond to the query with. The LPEG capture group is just like \n+-- the client IP, but encased in ( ) and without the # literal at the front: (10.0.1.71)\n+local server_responding_ip = l.P\"(\" * l.Cg(l.Ct(l.Cg(ip.v4, \"value\") * l.Cg(l.Cc\"ipv4\", \"representation\")), \"ServerRespondingIP\") * l.P\")\"\n+\n+--[[DNS query record types:\n+Create a capture group that will match the DNS record type.\n+\n+The + signs mean to select A or CNAME or MX or PTR and so on.\n+\n+The ', \"record_type\"' part sets the name of the capture's entry in the table of\n+matches that gets built.\n+\n+Source: https://en.wikipedia.org/wiki/List_of_DNS_record_types\n+--]]\n+dns_record_type = l.Cg(\n+      l.P\"A\" /\"A\"\n+    + l.P\"AAAA\" /\"AAAA\"\n+    + l.P\"AFSDB\" /\"AFSDB\"\n+    + l.P\"APL\" /\"APL\"\n+    + l.P\"AXFR\" /\"AXFR\"\n+    + l.P\"CAA\" /\"CAA\"\n+    + l.P\"CDNSKEY\" /\"CDNSKEY\"\n+    + l.P\"CDS\" /\"CDS\"\n+    + l.P\"CERT\" /\"CERT\"\n+    + l.P\"CNAME\" /\"CNAME\"\n+    + l.P\"DHCID\" /\"DHCID\"\n+    + l.P\"DLV\" /\"DLV\"\n+    + l.P\"DNAME\" /\"DNAME\"\n+    + l.P\"DS\" /\"DS\"\n+    + l.P\"HIP\" /\"HIP\"\n+    + l.P\"IPSECKEY\" /\"IPSECKEY\"\n+    + l.P\"IXFR\" /\"IXFR\"\n+    + l.P\"KEY\" /\"KEY\"\n+    + l.P\"KX\" /\"KX\"\n+    + l.P\"LOC\" /\"LOC\"\n+    + l.P\"MX\" /\"MX\"\n+    + l.P\"NAPTR\" /\"NAPTR\"\n+    + l.P\"NS\" /\"NS\"\n+    + l.P\"NSEC\" /\"NSEC\"\n+    + l.P\"NSEC3\" /\"NSEC3\"\n+    + l.P\"NSEC3PARAM\" /\"NSEC3PARAM\"\n+    + l.P\"OPT\" /\"OPT\"\n+    + l.P\"PTR\" /\"PTR\"\n+    + l.P\"RRSIG\" /\"RRSIG\"\n+    + l.P\"RP\" /\"RP\"\n+    + l.P\"SIG\" /\"SIG\"\n+    + l.P\"SOA\" /\"SOA\"\n+    + l.P\"SRV\" /\"SRV\"\n+    + l.P\"SSHFP\" /\"SSHFP\"\n+    + l.P\"TA\" /\"TA\"\n+    + l.P\"TKEY\" /\"TKEY\"\n+    + l.P\"TLSA\" /\"TLSA\"\n+    + l.P\"TSIG\" /\"TSIG\"\n+    + l.P\"TXT\" /\"TXT\"\n+    + l.P\"*\" /\"*\"\n+    , \"RecordType\")\n+\n+--A capture group for the 3 kinds of DNS record classes.\n+-- Source: https://en.wikipedia.org/wiki/Domain_Name_System#DNS_resource_records\n+dns_record_class = l.Cg(\n+      --For internet records:\n+      l.P\"IN\" /\"IN\"\n+      --For CHAOS records:\n+    + l.P\"CH\" /\"CH\"\n+      --For Hesiod records:\n+    + l.P\"HS\" /\"HS\"\n+    , \"RecordClass\")\n+\n+--[[Query flag patterns\n+Sources on what the query flags mean: \n+\n+* https://deepthought.isc.org/article/AA-00434/0/What-do-EDC-and-other-letters-I-see-in-my-query-log-mean.html\n+* http://jpmens.net/2011/02/22/bind-querylog-know-your-flags/\n+\n+]]--\n+\n+--Create a table to hold possible matches that may appear:\n+local t = {\n+      [\"+\"] = \"recursion requested\",\n+      [\"-\"] = \"recursion not requested\",\n+      E = \"EDNS used\",\n+      S = \"query signed\",\n+      D = \"DNSSEC data wanted\",\n+      C = \"no DNSSEC validation check\",\n+      T = \"TCP used\",\n+}\n+\n+--Create a capture group that uses the table above to match any one or more of '+-EDCST'\n+--that are present and add them to a new table called QueryFlags: \n+query_flags = l.Cg( l.Ct((l.S\"+-EDCST\" / t)^1), \"QueryFlags\" )\n+\n+--[[Hostname and domain name patterns\n+\n+Hostnames and domain names are broken up into fragments that are called \n+\"labels\", which are the parts between the dots.\n+\n+Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names\n+\n+For instance, webserver.company.com has the labels \"webserver\", \"company\" and \n+\"com\"\n+\n+The pattern below uses the upper, lower and digit shortcuts from the main LPEG \n+library and combines them with the hyphen (-) character to match anything that's\n+part of a valid hostname label. The ^1 means match one or more instances of it.\n+--]]\n+local hostname_fragment = (l.upper + l.lower + l.digit +  \"-\")^1\n+\n+--The pattern below matches one or more hostname_fragments, followed by a . \n+--and followed by one more hostname_fragment, indicating the end of a complete\n+--hostname. The open and close parens and colon are to match the decorations\n+--BIND puts around the name: \n+-- (webserver.company.com):\n+local enclosed_query = \"(\" * l.Cg((hostname_fragment * \".\")^1 * hostname_fragment, \"FullQuery\") * \"):\"\n+\n+--The ^-1 means match at most 1 instance of the pattern. We want this so that we \n+--can match the first part of a hostname and leave the rest for the l.Cg((hostname_fragment...\n+--capture group to match into the QueryDomain table entry.\n+--In webserver.company.com, `(hostname_fragment * \".\")^-1` matches webserver.\n+--and `l.Cg((hostname_fragment...` matches company.com\n+local query = l.Cg((hostname_fragment)^-1, \"QueryName\") * \".\" * l.Cg((hostname_fragment * \".\")^1 * hostname_fragment, \"QueryDomain\")\n+\n+--Use all of the previously defined patterns to build a grammar:\n+local bind_query = timestamp * space * queries_literal * space * info_literal * space * client_literal * space * client_ip * space * enclosed_query * space * query_literal * space * query * space * dns_record_class * space * dns_record_type * space * query_flags * space * server_responding_ip\n+\n+-- To use the above grammar on http://lpeg.trink.com/, paste in everything above this line and just the single line below (uncomment it too):\n+--grammar = l.Ct(bind_query)\n+\n+local msg = {\n+  --This value is read in from the 'msg_type' config option in the TOML:\n+  Type        = msg_type,\n+  Payload     = nil,\n+  Severity    = 'info',\n+  Fields      = {},\n+}\n+\n+function process_message ()\n+\n+  --Create a local variable for the log line from the Payload of the incoming Heka message.\n+  --The LogstreamerInput that generates the messages automatically puts the log line in the Payload:\n+  local query_log_line = read_message(\"Payload\")\n+  --Use the bind_query grammar defined farther above to create a local grammar object:\n+  local grammar = l.Ct(bind_query)","path":"sandbox/lua/decoders/bind_query_log.lua","position":255,"original_position":255,"commit_id":"63ce9965abf1e83591948025009cf4ea4cf61890","original_commit_id":"63ce9965abf1e83591948025009cf4ea4cf61890","user":{"login":"trink","id":795988,"avatar_url":"https://avatars.githubusercontent.com/u/795988?v=3","gravatar_id":"","url":"https://api.github.com/users/trink","html_url":"https://github.com/trink","followers_url":"https://api.github.com/users/trink/followers","following_url":"https://api.github.com/users/trink/following{/other_user}","gists_url":"https://api.github.com/users/trink/gists{/gist_id}","starred_url":"https://api.github.com/users/trink/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/trink/subscriptions","organizations_url":"https://api.github.com/users/trink/orgs","repos_url":"https://api.github.com/users/trink/repos","events_url":"https://api.github.com/users/trink/events{/privacy}","received_events_url":"https://api.github.com/users/trink/received_events","type":"User","site_admin":false},"body":"Ideally this grammar would be made into a module so it could be re-used.  To  be used with Heka it would need to go into the heka branch of the lua_sandbox","created_at":"2016-04-26T14:04:17Z","updated_at":"2016-04-26T14:04:17Z","html_url":"https://github.com/mozilla-services/heka/pull/1916#discussion_r61090823","pull_request_url":"https://api.github.com/repos/mozilla-services/heka/pulls/1916","_links":{"self":{"href":"https://api.github.com/repos/mozilla-services/heka/pulls/comments/61090823"},"html":{"href":"https://github.com/mozilla-services/heka/pull/1916#discussion_r61090823"},"pull_request":{"href":"https://api.github.com/repos/mozilla-services/heka/pulls/1916"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla-services/heka/pulls/1916","id":67811510,"html_url":"https://github.com/mozilla-services/heka/pull/1916","diff_url":"https://github.com/mozilla-services/heka/pull/1916.diff","patch_url":"https://github.com/mozilla-services/heka/pull/1916.patch","issue_url":"https://api.github.com/repos/mozilla-services/heka/issues/1916","number":1916,"state":"open","locked":false,"title":"BIND query log decoder Lua plugin","user":{"login":"nickchappell","id":1515223,"avatar_url":"https://avatars.githubusercontent.com/u/1515223?v=3","gravatar_id":"","url":"https://api.github.com/users/nickchappell","html_url":"https://github.com/nickchappell","followers_url":"https://api.github.com/users/nickchappell/followers","following_url":"https://api.github.com/users/nickchappell/following{/other_user}","gists_url":"https://api.github.com/users/nickchappell/gists{/gist_id}","starred_url":"https://api.github.com/users/nickchappell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nickchappell/subscriptions","organizations_url":"https://api.github.com/users/nickchappell/orgs","repos_url":"https://api.github.com/users/nickchappell/repos","events_url":"https://api.github.com/users/nickchappell/events{/privacy}","received_events_url":"https://api.github.com/users/nickchappell/received_events","type":"User","site_admin":false},"body":"@rafrombrc @trink do you want this squashed into a single commit?","created_at":"2016-04-26T00:51:41Z","updated_at":"2016-04-26T14:04:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"edcbd9a1e6bc6c553aa661a1a4bc334612294658","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mozilla-services/heka/pulls/1916/commits","review_comments_url":"https://api.github.com/repos/mozilla-services/heka/pulls/1916/comments","review_comment_url":"https://api.github.com/repos/mozilla-services/heka/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla-services/heka/issues/1916/comments","statuses_url":"https://api.github.com/repos/mozilla-services/heka/statuses/63ce9965abf1e83591948025009cf4ea4cf61890","head":{"label":"nickchappell:nickchappell/bind_query_log_decoder","ref":"nickchappell/bind_query_log_decoder","sha":"63ce9965abf1e83591948025009cf4ea4cf61890","user":{"login":"nickchappell","id":1515223,"avatar_url":"https://avatars.githubusercontent.com/u/1515223?v=3","gravatar_id":"","url":"https://api.github.com/users/nickchappell","html_url":"https://github.com/nickchappell","followers_url":"https://api.github.com/users/nickchappell/followers","following_url":"https://api.github.com/users/nickchappell/following{/other_user}","gists_url":"https://api.github.com/users/nickchappell/gists{/gist_id}","starred_url":"https://api.github.com/users/nickchappell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nickchappell/subscriptions","organizations_url":"https://api.github.com/users/nickchappell/orgs","repos_url":"https://api.github.com/users/nickchappell/repos","events_url":"https://api.github.com/users/nickchappell/events{/privacy}","received_events_url":"https://api.github.com/users/nickchappell/received_events","type":"User","site_admin":false},"repo":{"id":29512704,"name":"heka","full_name":"nickchappell/heka","owner":{"login":"nickchappell","id":1515223,"avatar_url":"https://avatars.githubusercontent.com/u/1515223?v=3","gravatar_id":"","url":"https://api.github.com/users/nickchappell","html_url":"https://github.com/nickchappell","followers_url":"https://api.github.com/users/nickchappell/followers","following_url":"https://api.github.com/users/nickchappell/following{/other_user}","gists_url":"https://api.github.com/users/nickchappell/gists{/gist_id}","starred_url":"https://api.github.com/users/nickchappell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nickchappell/subscriptions","organizations_url":"https://api.github.com/users/nickchappell/orgs","repos_url":"https://api.github.com/users/nickchappell/repos","events_url":"https://api.github.com/users/nickchappell/events{/privacy}","received_events_url":"https://api.github.com/users/nickchappell/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/nickchappell/heka","description":"Data collection and processing made easy.","fork":true,"url":"https://api.github.com/repos/nickchappell/heka","forks_url":"https://api.github.com/repos/nickchappell/heka/forks","keys_url":"https://api.github.com/repos/nickchappell/heka/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nickchappell/heka/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nickchappell/heka/teams","hooks_url":"https://api.github.com/repos/nickchappell/heka/hooks","issue_events_url":"https://api.github.com/repos/nickchappell/heka/issues/events{/number}","events_url":"https://api.github.com/repos/nickchappell/heka/events","assignees_url":"https://api.github.com/repos/nickchappell/heka/assignees{/user}","branches_url":"https://api.github.com/repos/nickchappell/heka/branches{/branch}","tags_url":"https://api.github.com/repos/nickchappell/heka/tags","blobs_url":"https://api.github.com/repos/nickchappell/heka/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nickchappell/heka/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nickchappell/heka/git/refs{/sha}","trees_url":"https://api.github.com/repos/nickchappell/heka/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nickchappell/heka/statuses/{sha}","languages_url":"https://api.github.com/repos/nickchappell/heka/languages","stargazers_url":"https://api.github.com/repos/nickchappell/heka/stargazers","contributors_url":"https://api.github.com/repos/nickchappell/heka/contributors","subscribers_url":"https://api.github.com/repos/nickchappell/heka/subscribers","subscription_url":"https://api.github.com/repos/nickchappell/heka/subscription","commits_url":"https://api.github.com/repos/nickchappell/heka/commits{/sha}","git_commits_url":"https://api.github.com/repos/nickchappell/heka/git/commits{/sha}","comments_url":"https://api.github.com/repos/nickchappell/heka/comments{/number}","issue_comment_url":"https://api.github.com/repos/nickchappell/heka/issues/comments{/number}","contents_url":"https://api.github.com/repos/nickchappell/heka/contents/{+path}","compare_url":"https://api.github.com/repos/nickchappell/heka/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nickchappell/heka/merges","archive_url":"https://api.github.com/repos/nickchappell/heka/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nickchappell/heka/downloads","issues_url":"https://api.github.com/repos/nickchappell/heka/issues{/number}","pulls_url":"https://api.github.com/repos/nickchappell/heka/pulls{/number}","milestones_url":"https://api.github.com/repos/nickchappell/heka/milestones{/number}","notifications_url":"https://api.github.com/repos/nickchappell/heka/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nickchappell/heka/labels{/name}","releases_url":"https://api.github.com/repos/nickchappell/heka/releases{/id}","deployments_url":"https://api.github.com/repos/nickchappell/heka/deployments","created_at":"2015-01-20T05:02:14Z","updated_at":"2016-04-25T23:48:50Z","pushed_at":"2016-04-26T00:50:15Z","git_url":"git://github.com/nickchappell/heka.git","ssh_url":"git@github.com:nickchappell/heka.git","clone_url":"https://github.com/nickchappell/heka.git","svn_url":"https://github.com/nickchappell/heka","homepage":"http://hekad.readthedocs.org/","size":10886,"stargazers_count":1,"watchers_count":1,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"dev"}},"base":{"label":"mozilla-services:dev","ref":"dev","sha":"3714844df408c0a2aa1691cf6b82dd47e8707de1","user":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"repo":{"id":6248212,"name":"heka","full_name":"mozilla-services/heka","owner":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla-services/heka","description":"Data collection and processing made easy.","fork":false,"url":"https://api.github.com/repos/mozilla-services/heka","forks_url":"https://api.github.com/repos/mozilla-services/heka/forks","keys_url":"https://api.github.com/repos/mozilla-services/heka/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla-services/heka/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla-services/heka/teams","hooks_url":"https://api.github.com/repos/mozilla-services/heka/hooks","issue_events_url":"https://api.github.com/repos/mozilla-services/heka/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla-services/heka/events","assignees_url":"https://api.github.com/repos/mozilla-services/heka/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla-services/heka/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla-services/heka/tags","blobs_url":"https://api.github.com/repos/mozilla-services/heka/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla-services/heka/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla-services/heka/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla-services/heka/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla-services/heka/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla-services/heka/languages","stargazers_url":"https://api.github.com/repos/mozilla-services/heka/stargazers","contributors_url":"https://api.github.com/repos/mozilla-services/heka/contributors","subscribers_url":"https://api.github.com/repos/mozilla-services/heka/subscribers","subscription_url":"https://api.github.com/repos/mozilla-services/heka/subscription","commits_url":"https://api.github.com/repos/mozilla-services/heka/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla-services/heka/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla-services/heka/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla-services/heka/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla-services/heka/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla-services/heka/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla-services/heka/merges","archive_url":"https://api.github.com/repos/mozilla-services/heka/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla-services/heka/downloads","issues_url":"https://api.github.com/repos/mozilla-services/heka/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla-services/heka/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla-services/heka/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla-services/heka/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla-services/heka/labels{/name}","releases_url":"https://api.github.com/repos/mozilla-services/heka/releases{/id}","deployments_url":"https://api.github.com/repos/mozilla-services/heka/deployments","created_at":"2012-10-16T17:20:51Z","updated_at":"2016-04-26T08:12:02Z","pushed_at":"2016-04-26T00:51:42Z","git_url":"git://github.com/mozilla-services/heka.git","ssh_url":"git@github.com:mozilla-services/heka.git","clone_url":"https://github.com/mozilla-services/heka.git","svn_url":"https://github.com/mozilla-services/heka","homepage":"http://hekad.readthedocs.org/","size":14535,"stargazers_count":3030,"watchers_count":3030,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":464,"mirror_url":null,"open_issues_count":226,"forks":464,"open_issues":226,"watchers":3030,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla-services/heka/pulls/1916"},"html":{"href":"https://github.com/mozilla-services/heka/pull/1916"},"issue":{"href":"https://api.github.com/repos/mozilla-services/heka/issues/1916"},"comments":{"href":"https://api.github.com/repos/mozilla-services/heka/issues/1916/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla-services/heka/pulls/1916/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla-services/heka/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla-services/heka/pulls/1916/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla-services/heka/statuses/63ce9965abf1e83591948025009cf4ea4cf61890"}}}}