{"action":"created","comment":{"url":"https://api.github.com/repos/grpc/grpc/pulls/comments/50464642","id":50464642,"diff_hunk":"@@ -0,0 +1,535 @@\n+/*\n+ *\n+ * Copyright 2015-2016, Google Inc.\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are\n+ * met:\n+ *\n+ *     * Redistributions of source code must retain the above copyright\n+ * notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above\n+ * copyright notice, this list of conditions and the following disclaimer\n+ * in the documentation and/or other materials provided with the\n+ * distribution.\n+ *     * Neither the name of Google Inc. nor the names of its\n+ * contributors may be used to endorse or promote products derived from\n+ * this software without specific prior written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ *\n+ */\n+\n+#include <grpc/census.h>\n+#include <grpc/support/alloc.h>\n+#include <grpc/support/log.h>\n+#include <grpc/support/port_platform.h>\n+#include <grpc/support/useful.h>\n+#include <stdbool.h>\n+#include <string.h>\n+#include \"src/core/support/string.h\"\n+\n+// Functions in this file support the public tag_set API, as well as\n+// encoding/decoding tag_sets as part of context transmission across\n+// RPC's. The overall requirements (in approximate priority order) for the\n+// tag_set representations:\n+// 1. Efficient conversion to/from wire format\n+// 2. Minimal bytes used on-wire\n+// 3. Efficient tag set creation\n+// 4. Efficient lookup of value for a key\n+// 5. Efficient lookup of value for an index (to support iteration)\n+// 6. Minimal memory footprint\n+//\n+// Notes on tradeoffs/decisions:\n+// * tag includes 1 byte length of key, as well as nil-terminating byte. These\n+//   are to aid in efficient parsing and the ability to directly return key\n+//   strings. This is more important than saving a single byte/tag on the wire.\n+// * The wire encoding uses only single byte values. This eliminates the need\n+//   to handle endian-ness conversions. It also means there is a hard upper\n+//   limit of 255 for both CENSUS_MAX_TAG_KV_LEN and CENSUS_MAX_PROPAGATED_TAGS.\n+// * Keep all tag information (keys/values/flags) in a single memory buffer,\n+//   that can be directly copied to the wire. This makes iteration by index\n+//   somewhat less efficient. If it becomes a problem, we could consider\n+//   building an index at tag_set creation.\n+// * Binary tags share the same structure as, but are encoded seperately from,\n+//   non-binary tags. This is primarily because non-binary tags are far more\n+//   likely to be repeated across multiple RPC calls, so are more efficiently\n+//   cached and compressed in any metadata schemes.\n+// * all lengths etc. are restricted to one byte. This eliminates endian\n+//   issues.\n+\n+// Structure representing a set of tags. Essentially a count of number of tags\n+// present, and pointer to a chunk of memory that contains the per-tag details.\n+struct tag_set {\n+  int ntags;        // number of tags.\n+  int ntags_alloc;  // ntags + number of deleted tags (total number of tags\n+                    // in all of kvm). This will always be == ntags, except\n+                    // during the process of building a new tag set.\n+  size_t kvm_size;  // number of bytes allocated for key/value storage.\n+  size_t kvm_used;  // number of bytes of used key/value memory\n+  char *kvm;        // key/value memory. Consists of repeated entries of:\n+                    //   Offset  Size  Description\n+                    //     0      1    Key length, including trailing 0. (K)\n+                    //     1      1    Value length. (V)\n+                    //     2      1    Flags\n+                    //     3      K    Key bytes\n+                    //     3 + K  V    Value bytes\n+                    //\n+                    // We refer to the first 3 entries as the 'tag header'.\n+};\n+\n+// Number of bytes in tag header.\n+#define TAG_HEADER_SIZE 3  // key length (1) + value length (1) + flags (1)\n+// Offsets to tag header entries.\n+#define KEY_LEN_OFFSET 0\n+#define VALUE_LEN_OFFSET 1\n+#define FLAG_OFFSET 2\n+\n+// raw_tag represents the raw-storage form of a tag in the kvm of a tag_set.\n+struct raw_tag {\n+  uint8_t key_len;\n+  uint8_t value_len;\n+  uint8_t flags;\n+  char *key;\n+  char *value;\n+};\n+\n+// Use a reserved flag bit for indication of deleted tag.\n+#define CENSUS_TAG_DELETED CENSUS_TAG_RESERVED\n+#define CENSUS_TAG_IS_DELETED(flags) (flags & CENSUS_TAG_DELETED)\n+\n+// Primary (external) representation of a tag set. Composed of 3 underlying\n+// tag_set structs, one for each of the binary/printable propagated tags, and\n+// one for everything else.\n+struct census_tag_set {\n+  struct tag_set tags[3];\n+};\n+\n+// Indices into the tags member of census_tag_set\n+#define PROPAGATED_TAGS 0\n+#define PROPAGATED_BINARY_TAGS 1\n+#define LOCAL_TAGS 2\n+\n+// Extract a raw tag given a pointer (raw) to the tag header. Allow for some\n+// extra bytes in the tag header (see encode/decode functions for usage: this\n+// allows for future expansion of the tag header).\n+static char *decode_tag(struct raw_tag *tag, char *header, int offset) {","path":"src/core/census/tag_set.c","position":127,"original_position":127,"commit_id":"8e5b21fd9faf0b1ba2f74e88fe7e59bc3d5ed299","original_commit_id":"8e5b21fd9faf0b1ba2f74e88fe7e59bc3d5ed299","user":{"login":"a-veitch","id":10503072,"avatar_url":"https://avatars.githubusercontent.com/u/10503072?v=3","gravatar_id":"","url":"https://api.github.com/users/a-veitch","html_url":"https://github.com/a-veitch","followers_url":"https://api.github.com/users/a-veitch/followers","following_url":"https://api.github.com/users/a-veitch/following{/other_user}","gists_url":"https://api.github.com/users/a-veitch/gists{/gist_id}","starred_url":"https://api.github.com/users/a-veitch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/a-veitch/subscriptions","organizations_url":"https://api.github.com/users/a-veitch/orgs","repos_url":"https://api.github.com/users/a-veitch/repos","events_url":"https://api.github.com/users/a-veitch/events{/privacy}","received_events_url":"https://api.github.com/users/a-veitch/received_events","type":"User","site_admin":false},"body":"Can't be const, because during tag set creation it might not be.","created_at":"2016-01-21T21:11:48Z","updated_at":"2016-01-21T21:11:48Z","html_url":"https://github.com/grpc/grpc/pull/4750#discussion_r50464642","pull_request_url":"https://api.github.com/repos/grpc/grpc/pulls/4750","_links":{"self":{"href":"https://api.github.com/repos/grpc/grpc/pulls/comments/50464642"},"html":{"href":"https://github.com/grpc/grpc/pull/4750#discussion_r50464642"},"pull_request":{"href":"https://api.github.com/repos/grpc/grpc/pulls/4750"}}},"pull_request":{"url":"https://api.github.com/repos/grpc/grpc/pulls/4750","id":56222687,"html_url":"https://github.com/grpc/grpc/pull/4750","diff_url":"https://github.com/grpc/grpc/pull/4750.diff","patch_url":"https://github.com/grpc/grpc/pull/4750.patch","issue_url":"https://api.github.com/repos/grpc/grpc/issues/4750","number":4750,"state":"open","locked":false,"title":"Census Tag Set API and implementation","user":{"login":"a-veitch","id":10503072,"avatar_url":"https://avatars.githubusercontent.com/u/10503072?v=3","gravatar_id":"","url":"https://api.github.com/users/a-veitch","html_url":"https://github.com/a-veitch","followers_url":"https://api.github.com/users/a-veitch/followers","following_url":"https://api.github.com/users/a-veitch/following{/other_user}","gists_url":"https://api.github.com/users/a-veitch/gists{/gist_id}","starred_url":"https://api.github.com/users/a-veitch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/a-veitch/subscriptions","organizations_url":"https://api.github.com/users/a-veitch/orgs","repos_url":"https://api.github.com/users/a-veitch/repos","events_url":"https://api.github.com/users/a-veitch/events{/privacy}","received_events_url":"https://api.github.com/users/a-veitch/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-01-15T21:18:15Z","updated_at":"2016-01-21T21:11:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"911901735ce30078dc885ce2ba914809c1d8667b","assignee":{"login":"bogdandrutu","id":1373887,"avatar_url":"https://avatars.githubusercontent.com/u/1373887?v=3","gravatar_id":"","url":"https://api.github.com/users/bogdandrutu","html_url":"https://github.com/bogdandrutu","followers_url":"https://api.github.com/users/bogdandrutu/followers","following_url":"https://api.github.com/users/bogdandrutu/following{/other_user}","gists_url":"https://api.github.com/users/bogdandrutu/gists{/gist_id}","starred_url":"https://api.github.com/users/bogdandrutu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bogdandrutu/subscriptions","organizations_url":"https://api.github.com/users/bogdandrutu/orgs","repos_url":"https://api.github.com/users/bogdandrutu/repos","events_url":"https://api.github.com/users/bogdandrutu/events{/privacy}","received_events_url":"https://api.github.com/users/bogdandrutu/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/grpc/grpc/milestones/10","html_url":"https://github.com/grpc/grpc/milestones/Stats%20and%20Tracing","labels_url":"https://api.github.com/repos/grpc/grpc/milestones/10/labels","id":996162,"number":10,"title":"Stats and Tracing","description":"Implement collecting/aggregating statistics for RPC and RPC tracing for debugging purposes.\r\n- Stats collection and display\r\n- Tracing of active RPCs\r\n- Trace query API and impl","creator":{"login":"jayantkolhe","id":6886327,"avatar_url":"https://avatars.githubusercontent.com/u/6886327?v=3","gravatar_id":"","url":"https://api.github.com/users/jayantkolhe","html_url":"https://github.com/jayantkolhe","followers_url":"https://api.github.com/users/jayantkolhe/followers","following_url":"https://api.github.com/users/jayantkolhe/following{/other_user}","gists_url":"https://api.github.com/users/jayantkolhe/gists{/gist_id}","starred_url":"https://api.github.com/users/jayantkolhe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jayantkolhe/subscriptions","organizations_url":"https://api.github.com/users/jayantkolhe/orgs","repos_url":"https://api.github.com/users/jayantkolhe/repos","events_url":"https://api.github.com/users/jayantkolhe/events{/privacy}","received_events_url":"https://api.github.com/users/jayantkolhe/received_events","type":"User","site_admin":false},"open_issues":5,"closed_issues":1,"state":"open","created_at":"2015-02-26T01:42:35Z","updated_at":"2016-01-15T21:18:15Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/grpc/grpc/pulls/4750/commits","review_comments_url":"https://api.github.com/repos/grpc/grpc/pulls/4750/comments","review_comment_url":"https://api.github.com/repos/grpc/grpc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/grpc/grpc/issues/4750/comments","statuses_url":"https://api.github.com/repos/grpc/grpc/statuses/8e5b21fd9faf0b1ba2f74e88fe7e59bc3d5ed299","head":{"label":"a-veitch:tag_set","ref":"tag_set","sha":"8e5b21fd9faf0b1ba2f74e88fe7e59bc3d5ed299","user":{"login":"a-veitch","id":10503072,"avatar_url":"https://avatars.githubusercontent.com/u/10503072?v=3","gravatar_id":"","url":"https://api.github.com/users/a-veitch","html_url":"https://github.com/a-veitch","followers_url":"https://api.github.com/users/a-veitch/followers","following_url":"https://api.github.com/users/a-veitch/following{/other_user}","gists_url":"https://api.github.com/users/a-veitch/gists{/gist_id}","starred_url":"https://api.github.com/users/a-veitch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/a-veitch/subscriptions","organizations_url":"https://api.github.com/users/a-veitch/orgs","repos_url":"https://api.github.com/users/a-veitch/repos","events_url":"https://api.github.com/users/a-veitch/events{/privacy}","received_events_url":"https://api.github.com/users/a-veitch/received_events","type":"User","site_admin":false},"repo":{"id":32104318,"name":"grpc","full_name":"a-veitch/grpc","owner":{"login":"a-veitch","id":10503072,"avatar_url":"https://avatars.githubusercontent.com/u/10503072?v=3","gravatar_id":"","url":"https://api.github.com/users/a-veitch","html_url":"https://github.com/a-veitch","followers_url":"https://api.github.com/users/a-veitch/followers","following_url":"https://api.github.com/users/a-veitch/following{/other_user}","gists_url":"https://api.github.com/users/a-veitch/gists{/gist_id}","starred_url":"https://api.github.com/users/a-veitch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/a-veitch/subscriptions","organizations_url":"https://api.github.com/users/a-veitch/orgs","repos_url":"https://api.github.com/users/a-veitch/repos","events_url":"https://api.github.com/users/a-veitch/events{/privacy}","received_events_url":"https://api.github.com/users/a-veitch/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/a-veitch/grpc","description":"The C based gRPC (C++, Node.js, Python, Ruby, Objective-C, PHP, C#)","fork":true,"url":"https://api.github.com/repos/a-veitch/grpc","forks_url":"https://api.github.com/repos/a-veitch/grpc/forks","keys_url":"https://api.github.com/repos/a-veitch/grpc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/a-veitch/grpc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/a-veitch/grpc/teams","hooks_url":"https://api.github.com/repos/a-veitch/grpc/hooks","issue_events_url":"https://api.github.com/repos/a-veitch/grpc/issues/events{/number}","events_url":"https://api.github.com/repos/a-veitch/grpc/events","assignees_url":"https://api.github.com/repos/a-veitch/grpc/assignees{/user}","branches_url":"https://api.github.com/repos/a-veitch/grpc/branches{/branch}","tags_url":"https://api.github.com/repos/a-veitch/grpc/tags","blobs_url":"https://api.github.com/repos/a-veitch/grpc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/a-veitch/grpc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/a-veitch/grpc/git/refs{/sha}","trees_url":"https://api.github.com/repos/a-veitch/grpc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/a-veitch/grpc/statuses/{sha}","languages_url":"https://api.github.com/repos/a-veitch/grpc/languages","stargazers_url":"https://api.github.com/repos/a-veitch/grpc/stargazers","contributors_url":"https://api.github.com/repos/a-veitch/grpc/contributors","subscribers_url":"https://api.github.com/repos/a-veitch/grpc/subscribers","subscription_url":"https://api.github.com/repos/a-veitch/grpc/subscription","commits_url":"https://api.github.com/repos/a-veitch/grpc/commits{/sha}","git_commits_url":"https://api.github.com/repos/a-veitch/grpc/git/commits{/sha}","comments_url":"https://api.github.com/repos/a-veitch/grpc/comments{/number}","issue_comment_url":"https://api.github.com/repos/a-veitch/grpc/issues/comments{/number}","contents_url":"https://api.github.com/repos/a-veitch/grpc/contents/{+path}","compare_url":"https://api.github.com/repos/a-veitch/grpc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/a-veitch/grpc/merges","archive_url":"https://api.github.com/repos/a-veitch/grpc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/a-veitch/grpc/downloads","issues_url":"https://api.github.com/repos/a-veitch/grpc/issues{/number}","pulls_url":"https://api.github.com/repos/a-veitch/grpc/pulls{/number}","milestones_url":"https://api.github.com/repos/a-veitch/grpc/milestones{/number}","notifications_url":"https://api.github.com/repos/a-veitch/grpc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/a-veitch/grpc/labels{/name}","releases_url":"https://api.github.com/repos/a-veitch/grpc/releases{/id}","created_at":"2015-03-12T21:42:01Z","updated_at":"2015-03-12T21:42:05Z","pushed_at":"2016-01-20T17:17:17Z","git_url":"git://github.com/a-veitch/grpc.git","ssh_url":"git@github.com:a-veitch/grpc.git","clone_url":"https://github.com/a-veitch/grpc.git","svn_url":"https://github.com/a-veitch/grpc","homepage":"","size":64167,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":false,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"grpc:master","ref":"master","sha":"7e098a272ccb2b2ac06464064cb59fca857e2e2a","user":{"login":"grpc","id":7802525,"avatar_url":"https://avatars.githubusercontent.com/u/7802525?v=3","gravatar_id":"","url":"https://api.github.com/users/grpc","html_url":"https://github.com/grpc","followers_url":"https://api.github.com/users/grpc/followers","following_url":"https://api.github.com/users/grpc/following{/other_user}","gists_url":"https://api.github.com/users/grpc/gists{/gist_id}","starred_url":"https://api.github.com/users/grpc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/grpc/subscriptions","organizations_url":"https://api.github.com/users/grpc/orgs","repos_url":"https://api.github.com/users/grpc/repos","events_url":"https://api.github.com/users/grpc/events{/privacy}","received_events_url":"https://api.github.com/users/grpc/received_events","type":"Organization","site_admin":false},"repo":{"id":27729880,"name":"grpc","full_name":"grpc/grpc","owner":{"login":"grpc","id":7802525,"avatar_url":"https://avatars.githubusercontent.com/u/7802525?v=3","gravatar_id":"","url":"https://api.github.com/users/grpc","html_url":"https://github.com/grpc","followers_url":"https://api.github.com/users/grpc/followers","following_url":"https://api.github.com/users/grpc/following{/other_user}","gists_url":"https://api.github.com/users/grpc/gists{/gist_id}","starred_url":"https://api.github.com/users/grpc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/grpc/subscriptions","organizations_url":"https://api.github.com/users/grpc/orgs","repos_url":"https://api.github.com/users/grpc/repos","events_url":"https://api.github.com/users/grpc/events{/privacy}","received_events_url":"https://api.github.com/users/grpc/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/grpc/grpc","description":"The C based gRPC (C++, Node.js, Python, Ruby, Objective-C, PHP, C#)","fork":false,"url":"https://api.github.com/repos/grpc/grpc","forks_url":"https://api.github.com/repos/grpc/grpc/forks","keys_url":"https://api.github.com/repos/grpc/grpc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/grpc/grpc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/grpc/grpc/teams","hooks_url":"https://api.github.com/repos/grpc/grpc/hooks","issue_events_url":"https://api.github.com/repos/grpc/grpc/issues/events{/number}","events_url":"https://api.github.com/repos/grpc/grpc/events","assignees_url":"https://api.github.com/repos/grpc/grpc/assignees{/user}","branches_url":"https://api.github.com/repos/grpc/grpc/branches{/branch}","tags_url":"https://api.github.com/repos/grpc/grpc/tags","blobs_url":"https://api.github.com/repos/grpc/grpc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/grpc/grpc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/grpc/grpc/git/refs{/sha}","trees_url":"https://api.github.com/repos/grpc/grpc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/grpc/grpc/statuses/{sha}","languages_url":"https://api.github.com/repos/grpc/grpc/languages","stargazers_url":"https://api.github.com/repos/grpc/grpc/stargazers","contributors_url":"https://api.github.com/repos/grpc/grpc/contributors","subscribers_url":"https://api.github.com/repos/grpc/grpc/subscribers","subscription_url":"https://api.github.com/repos/grpc/grpc/subscription","commits_url":"https://api.github.com/repos/grpc/grpc/commits{/sha}","git_commits_url":"https://api.github.com/repos/grpc/grpc/git/commits{/sha}","comments_url":"https://api.github.com/repos/grpc/grpc/comments{/number}","issue_comment_url":"https://api.github.com/repos/grpc/grpc/issues/comments{/number}","contents_url":"https://api.github.com/repos/grpc/grpc/contents/{+path}","compare_url":"https://api.github.com/repos/grpc/grpc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/grpc/grpc/merges","archive_url":"https://api.github.com/repos/grpc/grpc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/grpc/grpc/downloads","issues_url":"https://api.github.com/repos/grpc/grpc/issues{/number}","pulls_url":"https://api.github.com/repos/grpc/grpc/pulls{/number}","milestones_url":"https://api.github.com/repos/grpc/grpc/milestones{/number}","notifications_url":"https://api.github.com/repos/grpc/grpc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/grpc/grpc/labels{/name}","releases_url":"https://api.github.com/repos/grpc/grpc/releases{/id}","created_at":"2014-12-08T18:58:53Z","updated_at":"2016-01-21T20:31:45Z","pushed_at":"2016-01-21T20:54:57Z","git_url":"git://github.com/grpc/grpc.git","ssh_url":"git@github.com:grpc/grpc.git","clone_url":"https://github.com/grpc/grpc.git","svn_url":"https://github.com/grpc/grpc","homepage":"","size":167767,"stargazers_count":4035,"watchers_count":4035,"language":"C","has_issues":true,"has_downloads":false,"has_wiki":true,"has_pages":true,"forks_count":658,"mirror_url":null,"open_issues_count":559,"forks":658,"open_issues":559,"watchers":4035,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/grpc/grpc/pulls/4750"},"html":{"href":"https://github.com/grpc/grpc/pull/4750"},"issue":{"href":"https://api.github.com/repos/grpc/grpc/issues/4750"},"comments":{"href":"https://api.github.com/repos/grpc/grpc/issues/4750/comments"},"review_comments":{"href":"https://api.github.com/repos/grpc/grpc/pulls/4750/comments"},"review_comment":{"href":"https://api.github.com/repos/grpc/grpc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/grpc/grpc/pulls/4750/commits"},"statuses":{"href":"https://api.github.com/repos/grpc/grpc/statuses/8e5b21fd9faf0b1ba2f74e88fe7e59bc3d5ed299"}}}}