GitHub PullRequestReviewCommentEvent at 2014-07-10 06:58:17
Repository: percona-agent
Actor: helginet
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/percona/percona-agent/pulls/comments/14751762","id":14751762,"diff_hunk":"@@ -0,0 +1,259 @@\n+/*\n+   Copyright (c) 2014, Percona LLC and/or its affiliates. All rights reserved.\n+\n+   This program is free software: you can redistribute it and/or modify\n+   it under the terms of the GNU Affero General Public License as published by\n+   the Free Software Foundation, either version 3 of the License, or\n+   (at your option) any later version.\n+\n+   This program is distributed in the hope that it will be useful,\n+   but WITHOUT ANY WARRANTY; without even the implied warranty of\n+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+   GNU Affero General Public License for more details.\n+\n+   You should have received a copy of the GNU Affero General Public License\n+   along with this program.  If not, see <http://www.gnu.org/licenses/>\n+*/\n+\n+package qan\n+\n+import (\n+\t\"database/sql\"\n+\t\"encoding/json\"\n+\t\"fmt\"\n+\t\"github.com/percona/cloud-protocol/proto\"\n+\t\"github.com/percona/mysql-log-parser/log\"\n+\t\"github.com/percona/percona-agent/instance\"\n+\t\"github.com/percona/percona-agent/mysql\"\n+\t\"github.com/percona/percona-agent/pct\"\n+\t\"sync\"\n+\t\"math\"\n+\t\"time\"\n+)\n+\n+type PfsManager struct {\n+\tlogger       *pct.Logger\n+\tMysqlFactory mysql.ConnectionFactory\n+\tmux          *sync.RWMutex // guards config and running\n+\tIm           *instance.Repo\n+\tconfig       *Config\n+\tstatus       *pct.Status\n+\trunning      bool\n+\tMysqlConn    mysql.Connector\n+}\n+\n+func NewPfsManager(logger *pct.Logger, mysqlFactory mysql.ConnectionFactory, im *instance.Repo) *PfsManager {\n+\tm := &PfsManager{\n+\t\tlogger:       logger,\n+\t\tMysqlFactory: mysqlFactory,\n+\t\tIm:           im,\n+\t\tmux:          new(sync.RWMutex),\n+\t}\n+\treturn m\n+}\n+\n+func (m *PfsManager) Handle(cmd *proto.Cmd) *proto.Reply {\n+\tconfig := &Config{}\n+\tif err := json.Unmarshal(cmd.Data, config); err != nil {\n+\t\treturn cmd.Reply(nil, err)\n+\t}\n+\n+\t// Start run()/qan-pfs\n+\tif err := m.start(config); err != nil {\n+\t\treturn cmd.Reply(nil, err)\n+\t}\n+\n+\treturn cmd.Reply(nil) // success\n+}\n+\n+func (m *PfsManager) start(config *Config) error {\n+\tm.mux.Lock()\n+\tif m.running {\n+\t\tm.mux.Unlock()\n+\t\treturn pct.ServiceIsRunningError{Service: \"qan\"}\n+\t}\n+\tm.running = true\n+\tm.mux.Unlock()\n+\n+\t// Get MySQL instance info from service instance database (SID).\n+\tmysqlIt := &proto.MySQLInstance{}\n+\tif err := m.Im.Get(config.Service, config.InstanceId, mysqlIt); err != nil {\n+\t\treturn err\n+\t}\n+\n+\t// Connect to MySQL\n+\tm.MysqlConn = m.MysqlFactory.Make(mysqlIt.DSN)\n+\tif err := m.MysqlConn.Connect(2); err != nil {\n+\t\treturn err\n+\t}\n+\tdefer m.MysqlConn.Close()\n+\n+\tvar status string\n+\tvar err error\n+\tif err, status = m.StatusPfs(); err != nil {\n+\t\treturn err\n+\t}\n+\tif status != \"ON\" {\n+\t\treturn fmt.Errorf(\"performance_schema value: %s\", status)\n+\t}\n+\tif err := m.SetupConsumers(); err != nil {\n+\t\treturn err\n+\t}\n+\tresult := &Result{}\n+\tif result, err = m.CollectData(); err != nil {\n+\t\treturn err\n+\t}\n+\tm.sendEvents(result)\n+\treturn nil\n+}\n+\n+func (m *PfsManager) StatusPfs() (error, string) {\n+\tvar variable, value string\n+\terr := m.MysqlConn.DB().QueryRow(\"SHOW VARIABLES LIKE 'performance_schema'\").Scan(&variable, &value)\n+\treturn err, value\n+}\n+\n+func (m *PfsManager) SetupConsumers() error {\n+\tconn := m.MysqlConn.DB()\n+\tif _, err := conn.Exec(\"USE performance_schema\"); err != nil {\n+\t\treturn err\n+\t}\n+\tvar value string\n+\tif err := conn.QueryRow(\"SHOW TABLES LIKE 'setup_instruments'\").Scan(&value); err != nil {\n+\t\treturn fmt.Errorf(\"No table 'setup_instruments' found, please use MySQL 5.6 and upper (%s)\", err)\n+\t}\n+\tif err := conn.QueryRow(\"SHOW TABLES LIKE 'setup_consumers'\").Scan(&value); err != nil {\n+\t\treturn fmt.Errorf(\"No table 'setup_consumers' found, please use MySQL 5.6 and upper (%s)\", err)\n+\t}\n+\tif _, err := conn.Exec(\"UPDATE setup_consumers SET ENABLED = ? WHERE NAME = ?\", \"YES\", \"statements_digest\"); err != nil {\n+\t\treturn err\n+\t}\n+\tif _, err := conn.Exec(\"UPDATE setup_instruments SET ENABLED = ?, TIMED = ? WHERE NAME LIKE ?\", \"YES\", \"YES\", \"statement/sql/%\"); err != nil {\n+\t\treturn err\n+\t}\n+\treturn nil\n+}\n+\n+func (m *PfsManager) CollectData() (result *Result, err error) {\n+\tconn := m.MysqlConn.DB()\n+\tif _, err = conn.Exec(\"USE performance_schema\"); err != nil {\n+\t\treturn nil, err\n+\t}\n+\tquery := \"SELECT \" +\n+\t\t\"DIGEST, DIGEST_TEXT, COUNT_STAR, \" +\n+\t\t\"SUM_TIMER_WAIT, MIN_TIMER_WAIT, AVG_TIMER_WAIT, \" +\n+\t\t\"MAX_TIMER_WAIT, SUM_LOCK_TIME, SUM_ROWS_AFFECTED, \" +\n+\t\t\"SUM_ROWS_SENT, SUM_ROWS_EXAMINED, SUM_CREATED_TMP_DISK_TABLES, \" +\n+\t\t\"SUM_CREATED_TMP_TABLES, SUM_SELECT_FULL_JOIN, SUM_SELECT_SCAN, \" +\n+\t\t\"SUM_SORT_MERGE_PASSES, FIRST_SEEN, LAST_SEEN \" +\n+\t\t\"FROM events_statements_summary_by_digest\"\n+\tvar (\n+\t\tdigest, digestText                                         string\n+\t\tsumTimerWait, minTimerWait, avgTimerWait, maxTimerWait     uint64\n+\t\tsumLockTime, sumRowsAffected, sumRowsSent, sumRowsExemined uint64\n+\t\tsumSelectFullJoin, sumSelectScan, sumSortMergePasses       uint\n+\t\tsumCreatedTmpDiskTables, sumCreatedTmpTables, countStar    uint\n+\t\tfirstSeen, lastSeen                                        time.Time\n+\t)\n+\trows, err := conn.Query(query)\n+\tif err != nil {\n+\t\tif err == sql.ErrNoRows {\n+\t\t\treturn nil, nil\n+\t\t}\n+\t\treturn nil, err\n+\t}\n+\tdefer rows.Close()\n+\n+\tevent      := log.NewEvent()\n+\tglobal     := log.NewGlobalClass()\n+\tqueries    := make(map[string]*log.QueryClass)\n+\tresult     = &Result{}\n+\n+\tfor rows.Next() {\n+\t\teventStat := log.NewEventStats()\n+\t\terr := rows.Scan(\n+\t\t\t&digest, &digestText, &countStar,\n+\t\t\t&sumTimerWait, &minTimerWait, &avgTimerWait, &maxTimerWait, &sumLockTime,\n+\t\t\t&sumRowsAffected, &sumRowsSent, &sumRowsExemined, &sumCreatedTmpDiskTables, &sumCreatedTmpTables,\n+\t\t\t&sumSelectFullJoin, &sumSelectScan, &sumSortMergePasses, &firstSeen, &lastSeen,\n+\t\t)\n+\t\tif err != nil {\n+\t\t\treturn nil, fmt.Errorf(\"rows.Scan error: %s: \", err)\n+\t\t}\n+\n+\t\tevent.Query                                      = digestText\n+\t\tevent.Ts                                         = fmt.Sprintf(\"%s\", lastSeen)\n+\t\teventStat.TimeMetrics[\"Query_time\"]              = &log.TimeStats{}\n+\t\teventStat.TimeMetrics[\"Query_time\"].Sum          = float64(sumTimerWait) * math.Pow10(-6)\n+\t\teventStat.TimeMetrics[\"Query_time\"].Min          = float64(minTimerWait) * math.Pow10(-6)\n+\t\teventStat.TimeMetrics[\"Query_time\"].Max          = float64(maxTimerWait) * math.Pow10(-6)\n+\t\teventStat.TimeMetrics[\"Query_time\"].Avg          = float64(avgTimerWait) * math.Pow10(-6)\n+\t\teventStat.TimeMetrics[\"Query_time\"].Cnt          = countStar\n+\n+\t\teventStat.TimeMetrics[\"Lock_time\"]               = &log.TimeStats{}\n+\t\teventStat.TimeMetrics[\"Lock_time\"].Sum           = float64(sumLockTime) * math.Pow10(-6)\n+\n+\t\teventStat.NumberMetrics[\"Rows_affected\"]         = &log.NumberStats{}\n+\t\teventStat.NumberMetrics[\"Rows_affected\"].Sum     = sumRowsAffected\n+\n+\t\teventStat.NumberMetrics[\"Rows_sent\"]             = &log.NumberStats{}\n+\t\teventStat.NumberMetrics[\"Rows_sent\"].Sum         = sumRowsSent\n+\n+\t\teventStat.NumberMetrics[\"Rows_examined\"]         = &log.NumberStats{}\n+\t\teventStat.NumberMetrics[\"Rows_examined\"].Sum     = sumRowsExemined\n+\n+\t\teventStat.NumberMetrics[\"Tmp_table_on_disk\"]     = &log.NumberStats{}\n+\t\teventStat.NumberMetrics[\"Tmp_table_on_disk\"].Cnt = sumCreatedTmpDiskTables\n+\n+\t\teventStat.NumberMetrics[\"Tmp_table\"]             = &log.NumberStats{}\n+\t\teventStat.NumberMetrics[\"Tmp_table\"].Cnt         = sumCreatedTmpTables\n+\n+\t\teventStat.NumberMetrics[\"Full_join\"]             = &log.NumberStats{}\n+\t\teventStat.NumberMetrics[\"Full_join\"].Cnt         = sumSelectFullJoin\n+\n+\t\teventStat.NumberMetrics[\"Full_scan\"]             = &log.NumberStats{}\n+\t\teventStat.NumberMetrics[\"Full_scan\"].Cnt         = sumSelectScan\n+\n+\t\teventStat.NumberMetrics[\"Merge_passes\"]          = &log.NumberStats{}\n+\t\teventStat.NumberMetrics[\"Merge_passes\"].Cnt      = sumSortMergePasses\n+\n+\t\taddErr := global.AddEvent(event)\n+\t\tswitch addErr.(type) {\n+\t\tcase log.MixedRateLimitsError:\n+\t\t\tresult.Error = addErr.Error()\n+\t\t\tbreak\n+\t\t}\n+\n+\t\tfingerprint := log.Fingerprint(event.Query)\n+\t\tclassId := log.Checksum(fingerprint)\n+\t\tclass, haveClass := queries[classId]\n+\t\tif !haveClass {\n+\t\t\tclass = log.NewQueryClass(classId, fingerprint, false)\n+\t\t\tqueries[classId] = class\n+\t\t}\n+\t\tclass.AddEvent(event)\n+\t\tclass.Metrics = eventStat\n+\t}\n+\tif err := rows.Err(); err != nil {\n+\t\treturn nil, fmt.Errorf(\"rows.Err error: %s: \", err)\n+\t}\n+\tif _, err := conn.Exec(\"TRUNCATE `events_statements_summary_by_digest`\"); err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\tnQueries := len(queries)\n+\tclasses  := make([]*log.QueryClass, nQueries)\n+\tfor _, class := range queries {\n+\t\tnQueries--\n+\t\tclasses[nQueries] = class\n+\t}","path":"qan/pfs_manager.go","position":249,"original_position":249,"commit_id":"f08c4edbb4ce87aa59964c48aaa2b3a776a9cf76","original_commit_id":"f08c4edbb4ce87aa59964c48aaa2b3a776a9cf76","user":{"login":"helginet","id":3428972,"avatar_url":"https://avatars.githubusercontent.com/u/3428972?","gravatar_id":"979d29f20a40c6524e4037fa8dd8bd2b","url":"https://api.github.com/users/helginet","html_url":"https://github.com/helginet","followers_url":"https://api.github.com/users/helginet/followers","following_url":"https://api.github.com/users/helginet/following{/other_user}","gists_url":"https://api.github.com/users/helginet/gists{/gist_id}","starred_url":"https://api.github.com/users/helginet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/helginet/subscriptions","organizations_url":"https://api.github.com/users/helginet/orgs","repos_url":"https://api.github.com/users/helginet/repos","events_url":"https://api.github.com/users/helginet/events{/privacy}","received_events_url":"https://api.github.com/users/helginet/received_events","type":"User","site_admin":false},"body":"@daniel-nichter, ok then maybe we can remove that code (if it's wrong).","created_at":"2014-07-10T06:58:17Z","updated_at":"2014-07-10T06:58:17Z","html_url":"https://github.com/percona/percona-agent/pull/61#discussion_r14751762","pull_request_url":"https://api.github.com/repos/percona/percona-agent/pulls/61","_links":{"self":{"href":"https://api.github.com/repos/percona/percona-agent/pulls/comments/14751762"},"html":{"href":"https://github.com/percona/percona-agent/pull/61#discussion_r14751762"},"pull_request":{"href":"https://api.github.com/repos/percona/percona-agent/pulls/61"}}},"pull_request":{"url":"https://api.github.com/repos/percona/percona-agent/pulls/61","id":17016680,"html_url":"https://github.com/percona/percona-agent/pull/61","diff_url":"https://github.com/percona/percona-agent/pull/61.diff","patch_url":"https://github.com/percona/percona-agent/pull/61.patch","issue_url":"https://api.github.com/repos/percona/percona-agent/issues/61","number":61,"state":"open","title":"PCT-686: pfs status checking","user":{"login":"helginet","id":3428972,"avatar_url":"https://avatars.githubusercontent.com/u/3428972?","gravatar_id":"979d29f20a40c6524e4037fa8dd8bd2b","url":"https://api.github.com/users/helginet","html_url":"https://github.com/helginet","followers_url":"https://api.github.com/users/helginet/followers","following_url":"https://api.github.com/users/helginet/following{/other_user}","gists_url":"https://api.github.com/users/helginet/gists{/gist_id}","starred_url":"https://api.github.com/users/helginet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/helginet/subscriptions","organizations_url":"https://api.github.com/users/helginet/orgs","repos_url":"https://api.github.com/users/helginet/repos","events_url":"https://api.github.com/users/helginet/events{/privacy}","received_events_url":"https://api.github.com/users/helginet/received_events","type":"User","site_admin":false},"body":"","created_at":"2014-06-11T19:02:42Z","updated_at":"2014-07-10T06:58:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b14002320bf8ad308a558fba77bd9170553ad365","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/percona/percona-agent/pulls/61/commits","review_comments_url":"https://api.github.com/repos/percona/percona-agent/pulls/61/comments","review_comment_url":"https://api.github.com/repos/percona/percona-agent/pulls/comments/{number}","comments_url":"https://api.github.com/repos/percona/percona-agent/issues/61/comments","statuses_url":"https://api.github.com/repos/percona/percona-agent/statuses/f08c4edbb4ce87aa59964c48aaa2b3a776a9cf76","head":{"label":"percona:PCT-686--psf","ref":"PCT-686--psf","sha":"f08c4edbb4ce87aa59964c48aaa2b3a776a9cf76","user":{"login":"percona","id":1683025,"avatar_url":"https://avatars.githubusercontent.com/u/1683025?","gravatar_id":"5f02b19a52725a3dc324baf483b584d7","url":"https://api.github.com/users/percona","html_url":"https://github.com/percona","followers_url":"https://api.github.com/users/percona/followers","following_url":"https://api.github.com/users/percona/following{/other_user}","gists_url":"https://api.github.com/users/percona/gists{/gist_id}","starred_url":"https://api.github.com/users/percona/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/percona/subscriptions","organizations_url":"https://api.github.com/users/percona/orgs","repos_url":"https://api.github.com/users/percona/repos","events_url":"https://api.github.com/users/percona/events{/privacy}","received_events_url":"https://api.github.com/users/percona/received_events","type":"Organization","site_admin":false},"repo":{"id":11132795,"name":"percona-agent","full_name":"percona/percona-agent","owner":{"login":"percona","id":1683025,"avatar_url":"https://avatars.githubusercontent.com/u/1683025?","gravatar_id":"5f02b19a52725a3dc324baf483b584d7","url":"https://api.github.com/users/percona","html_url":"https://github.com/percona","followers_url":"https://api.github.com/users/percona/followers","following_url":"https://api.github.com/users/percona/following{/other_user}","gists_url":"https://api.github.com/users/percona/gists{/gist_id}","starred_url":"https://api.github.com/users/percona/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/percona/subscriptions","organizations_url":"https://api.github.com/users/percona/orgs","repos_url":"https://api.github.com/users/percona/repos","events_url":"https://api.github.com/users/percona/events{/privacy}","received_events_url":"https://api.github.com/users/percona/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/percona/percona-agent","description":"Percona Cloud Tools Agent","fork":false,"url":"https://api.github.com/repos/percona/percona-agent","forks_url":"https://api.github.com/repos/percona/percona-agent/forks","keys_url":"https://api.github.com/repos/percona/percona-agent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/percona/percona-agent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/percona/percona-agent/teams","hooks_url":"https://api.github.com/repos/percona/percona-agent/hooks","issue_events_url":"https://api.github.com/repos/percona/percona-agent/issues/events{/number}","events_url":"https://api.github.com/repos/percona/percona-agent/events","assignees_url":"https://api.github.com/repos/percona/percona-agent/assignees{/user}","branches_url":"https://api.github.com/repos/percona/percona-agent/branches{/branch}","tags_url":"https://api.github.com/repos/percona/percona-agent/tags","blobs_url":"https://api.github.com/repos/percona/percona-agent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/percona/percona-agent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/percona/percona-agent/git/refs{/sha}","trees_url":"https://api.github.com/repos/percona/percona-agent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/percona/percona-agent/statuses/{sha}","languages_url":"https://api.github.com/repos/percona/percona-agent/languages","stargazers_url":"https://api.github.com/repos/percona/percona-agent/stargazers","contributors_url":"https://api.github.com/repos/percona/percona-agent/contributors","subscribers_url":"https://api.github.com/repos/percona/percona-agent/subscribers","subscription_url":"https://api.github.com/repos/percona/percona-agent/subscription","commits_url":"https://api.github.com/repos/percona/percona-agent/commits{/sha}","git_commits_url":"https://api.github.com/repos/percona/percona-agent/git/commits{/sha}","comments_url":"https://api.github.com/repos/percona/percona-agent/comments{/number}","issue_comment_url":"https://api.github.com/repos/percona/percona-agent/issues/comments/{number}","contents_url":"https://api.github.com/repos/percona/percona-agent/contents/{+path}","compare_url":"https://api.github.com/repos/percona/percona-agent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/percona/percona-agent/merges","archive_url":"https://api.github.com/repos/percona/percona-agent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/percona/percona-agent/downloads","issues_url":"https://api.github.com/repos/percona/percona-agent/issues{/number}","pulls_url":"https://api.github.com/repos/percona/percona-agent/pulls{/number}","milestones_url":"https://api.github.com/repos/percona/percona-agent/milestones{/number}","notifications_url":"https://api.github.com/repos/percona/percona-agent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/percona/percona-agent/labels{/name}","releases_url":"https://api.github.com/repos/percona/percona-agent/releases{/id}","created_at":"2013-07-02T19:09:37Z","updated_at":"2014-06-27T05:53:05Z","pushed_at":"2014-07-09T23:38:04Z","git_url":"git://github.com/percona/percona-agent.git","ssh_url":"git@github.com:percona/percona-agent.git","clone_url":"https://github.com/percona/percona-agent.git","svn_url":"https://github.com/percona/percona-agent","homepage":"","size":10564,"stargazers_count":21,"watchers_count":21,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":6,"mirror_url":null,"open_issues_count":3,"forks":6,"open_issues":3,"watchers":21,"default_branch":"release"}},"base":{"label":"percona:release","ref":"release","sha":"85639fe6d0304a02a4cd1cd27079c5e50b361b76","user":{"login":"percona","id":1683025,"avatar_url":"https://avatars.githubusercontent.com/u/1683025?","gravatar_id":"5f02b19a52725a3dc324baf483b584d7","url":"https://api.github.com/users/percona","html_url":"https://github.com/percona","followers_url":"https://api.github.com/users/percona/followers","following_url":"https://api.github.com/users/percona/following{/other_user}","gists_url":"https://api.github.com/users/percona/gists{/gist_id}","starred_url":"https://api.github.com/users/percona/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/percona/subscriptions","organizations_url":"https://api.github.com/users/percona/orgs","repos_url":"https://api.github.com/users/percona/repos","events_url":"https://api.github.com/users/percona/events{/privacy}","received_events_url":"https://api.github.com/users/percona/received_events","type":"Organization","site_admin":false},"repo":{"id":11132795,"name":"percona-agent","full_name":"percona/percona-agent","owner":{"login":"percona","id":1683025,"avatar_url":"https://avatars.githubusercontent.com/u/1683025?","gravatar_id":"5f02b19a52725a3dc324baf483b584d7","url":"https://api.github.com/users/percona","html_url":"https://github.com/percona","followers_url":"https://api.github.com/users/percona/followers","following_url":"https://api.github.com/users/percona/following{/other_user}","gists_url":"https://api.github.com/users/percona/gists{/gist_id}","starred_url":"https://api.github.com/users/percona/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/percona/subscriptions","organizations_url":"https://api.github.com/users/percona/orgs","repos_url":"https://api.github.com/users/percona/repos","events_url":"https://api.github.com/users/percona/events{/privacy}","received_events_url":"https://api.github.com/users/percona/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/percona/percona-agent","description":"Percona Cloud Tools Agent","fork":false,"url":"https://api.github.com/repos/percona/percona-agent","forks_url":"https://api.github.com/repos/percona/percona-agent/forks","keys_url":"https://api.github.com/repos/percona/percona-agent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/percona/percona-agent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/percona/percona-agent/teams","hooks_url":"https://api.github.com/repos/percona/percona-agent/hooks","issue_events_url":"https://api.github.com/repos/percona/percona-agent/issues/events{/number}","events_url":"https://api.github.com/repos/percona/percona-agent/events","assignees_url":"https://api.github.com/repos/percona/percona-agent/assignees{/user}","branches_url":"https://api.github.com/repos/percona/percona-agent/branches{/branch}","tags_url":"https://api.github.com/repos/percona/percona-agent/tags","blobs_url":"https://api.github.com/repos/percona/percona-agent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/percona/percona-agent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/percona/percona-agent/git/refs{/sha}","trees_url":"https://api.github.com/repos/percona/percona-agent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/percona/percona-agent/statuses/{sha}","languages_url":"https://api.github.com/repos/percona/percona-agent/languages","stargazers_url":"https://api.github.com/repos/percona/percona-agent/stargazers","contributors_url":"https://api.github.com/repos/percona/percona-agent/contributors","subscribers_url":"https://api.github.com/repos/percona/percona-agent/subscribers","subscription_url":"https://api.github.com/repos/percona/percona-agent/subscription","commits_url":"https://api.github.com/repos/percona/percona-agent/commits{/sha}","git_commits_url":"https://api.github.com/repos/percona/percona-agent/git/commits{/sha}","comments_url":"https://api.github.com/repos/percona/percona-agent/comments{/number}","issue_comment_url":"https://api.github.com/repos/percona/percona-agent/issues/comments/{number}","contents_url":"https://api.github.com/repos/percona/percona-agent/contents/{+path}","compare_url":"https://api.github.com/repos/percona/percona-agent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/percona/percona-agent/merges","archive_url":"https://api.github.com/repos/percona/percona-agent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/percona/percona-agent/downloads","issues_url":"https://api.github.com/repos/percona/percona-agent/issues{/number}","pulls_url":"https://api.github.com/repos/percona/percona-agent/pulls{/number}","milestones_url":"https://api.github.com/repos/percona/percona-agent/milestones{/number}","notifications_url":"https://api.github.com/repos/percona/percona-agent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/percona/percona-agent/labels{/name}","releases_url":"https://api.github.com/repos/percona/percona-agent/releases{/id}","created_at":"2013-07-02T19:09:37Z","updated_at":"2014-06-27T05:53:05Z","pushed_at":"2014-07-09T23:38:04Z","git_url":"git://github.com/percona/percona-agent.git","ssh_url":"git@github.com:percona/percona-agent.git","clone_url":"https://github.com/percona/percona-agent.git","svn_url":"https://github.com/percona/percona-agent","homepage":"","size":10564,"stargazers_count":21,"watchers_count":21,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":6,"mirror_url":null,"open_issues_count":3,"forks":6,"open_issues":3,"watchers":21,"default_branch":"release"}},"_links":{"self":{"href":"https://api.github.com/repos/percona/percona-agent/pulls/61"},"html":{"href":"https://github.com/percona/percona-agent/pull/61"},"issue":{"href":"https://api.github.com/repos/percona/percona-agent/issues/61"},"comments":{"href":"https://api.github.com/repos/percona/percona-agent/issues/61/comments"},"review_comments":{"href":"https://api.github.com/repos/percona/percona-agent/pulls/61/comments"},"review_comment":{"href":"https://api.github.com/repos/percona/percona-agent/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/percona/percona-agent/pulls/61/commits"},"statuses":{"href":"https://api.github.com/repos/percona/percona-agent/statuses/f08c4edbb4ce87aa59964c48aaa2b3a776a9cf76"}}}}