{"id":781,"date":"2013-05-25T09:45:03","date_gmt":"2013-05-25T07:45:03","guid":{"rendered":"http:\/\/www.streppone.it\/cosimo\/blog\/?p=781"},"modified":"2013-05-25T10:10:47","modified_gmt":"2013-05-25T08:10:47","slug":"display-and-filter-traffic-at-the-varnish-level-vlogdump","status":"publish","type":"post","link":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/","title":{"rendered":"Display and filter traffic at the varnish level: vlogdump"},"content":{"rendered":"<p>Haven&#8217;t written much in the last few months. The reason is that I&#8217;ve been at work building the <a href=\"http:\/\/www.opera.com\/mobile\/android\">Opera Discover<\/a> service backend, that we launched on Opera mobile for Android just a few days ago.<\/p>\n<p>A few weeks before, during the first stress test sessions of Discover, I wrote this little tool called <code>vlogdump<\/code> that Opera allowed me to <a href=\"https:\/\/github.com\/cosimo\/vlogdump\">put up on github<\/a>. The main purpose, besides learning <a href=\"http:\/\/en.wikipedia.org\/wiki\/AWK\">awk<\/a> :-) is <b>to display and filter traffic coming into your varnish daemon.<\/b>.<\/p>\n<p><code>vlogdump<\/code> is not meant to replace <code>varnishlog<\/code> but I know that sometimes varnishlog gives me too much output to deal with, especially if I want to pinpoint a single client or a single request. I know that the varnishlog that ships with varnish 3.0.x is way better in this regard, but we&#8217;re using 2.1.x, and that version of varnishlog is not as capable.<\/p>\n<p><code>vlogdump<\/code> is easier to look at than varnishlog, but at the same time it conveys much more information than <code>varnishncsa<\/code> or the typical <code>access.log<\/code> format.<\/p>\n<p>Here&#8217;s an example of output:<\/p>\n<div style=\"background:#446; color:#eee; width:100%; margin:10px; padding:5px;\"><code>$ varnishlog | vlogdump -v only_misses=1<br \/>\n  172.22.0.15 => GET \/assets\/e85ed0a7b1b87120a0a2bfa025531c6733a48802 HTTP\/1.0 <span style=\"color:red\">MISS<\/span><br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <= 200 OK                                                          28.432 ms\n  172.22.0.18 => GET \/assets\/5a9e9440c5c85e8dc5d65e03e15c95e390901fa7 HTTP\/1.0 <span style=\"color:red\">MISS<\/span><br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <= 200 OK                                                          36.905 ms\n  172.22.0.18 => GET \/icons\/categories\/te\/icon32x32-technology.png HTTP\/1.0 <span style=\"color:red\">MISS<\/span><br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <= 304 Not Modified                                                 0.589 ms\n  172.22.0.15 => GET \/api\/fetch\/article-preview\/?client=2&language=en-GB HTTP\/1.1 <span style=\"color:red\">MISS<\/span><br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <= 301 MOVED PERMANENTLY                                            8.381 ms\n  172.22.0.18 => GET \/assets\/c3830e95b717761005e26ce49ebab253e0ccb40b HTTP\/1.0 <span style=\"color:red\">MISS<\/span><br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <= 200 OK                                                         291.354 ms\n  172.22.0.18 => GET \/api\/category?client=2&language=en-GB HTTP\/1.1 <span style=\"color:red\">MISS<\/span><br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <= 200 OK                                                          58.025 ms\n&nbsp;  ...\n<\/code>\n<\/div>\n<p>Another interesting example.<\/p>\n<p><b>Show request and response headers of transactions that resulted in cache hits and had request headers (any of them) matching \"Android\"<\/b>:<\/p>\n<div style=\"background:#446; color:#eee; width:100%; margin:10px; padding:5px;\"><code>$ varnishlog | vlogdump -v show_req_headers=1 -v show_resp_headers=1 -v req_headers_match=Android -v only_hits=1<br \/>\n  83.149.37.122 => GET \/api\/category\/?... HTTP\/1.1 <span style=\"color:#0f0\">HIT<\/span><br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <= 200 OK &nbsp; &nbsp; &nbsp; &nbsp; <span style=\"color:#0f0\">0.088 ms<\/span><br \/>\n&nbsp;&nbsp;        req.http.Accept = application\/json;version=1<br \/>\n&nbsp;&nbsp;        req.http.Accept-Encoding = gzip<br \/>\n&nbsp;&nbsp;        req.http.Host = ...opera.com<br \/>\n&nbsp;&nbsp;        req.http.Connection = Keep-Alive<br \/>\n&nbsp;&nbsp;        req.http.User-Agent = Mozilla\/5.0 (Linux; Android 4.1.2; GT-N7100 Build\/JZO54K) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31 OPR\/14.0.1074.57768<br \/>\n&nbsp;<br \/>\n&nbsp;&nbsp;        beresp.http.Server = Apache<br \/>\n&nbsp;&nbsp;        beresp.http.Content-Encoding = gzip<br \/>\n&nbsp;&nbsp;        beresp.http.Content-Type = application\/json<br \/>\n&nbsp;&nbsp;        beresp.http.Vary = Accept-Encoding, Origin<br \/>\n&nbsp;&nbsp;        beresp.http.Content-Length = 4217<br \/>\n&nbsp;&nbsp;        beresp.http.Date = Sat, 25 May 2013 07:59:53 GMT<br \/>\n&nbsp;&nbsp;        beresp.http.X-Varnish = 1611090407 1611007435<br \/>\n&nbsp;&nbsp;        beresp.http.Age = 267<br \/>\n&nbsp;&nbsp;        beresp.http.Via = 1.1 varnish<br \/>\n&nbsp;&nbsp;        beresp.http.Connection = keep-alive<br \/>\n<\/code>\n<\/div>\n<p>Now that you're eager to try it :-), you can do so in a few commands, and assuming you have the right awk installed:<\/p>\n<p><code>wget -q -Ovlogdump https:\/\/raw.github.com\/cosimo\/vlogdump\/master\/vlogdump<br \/>\nvarnishlog | .\/vlogdump [options]<br \/>\n<\/code><\/p>\n<p>The <a href=\"https:\/\/github.com\/cosimo\/vlogdump\/blob\/master\/README.pod\">documentation<\/a> lists all the available options.<\/p>\n<p>You can do <b>more interesting things<\/b>:<\/p>\n<ul>\n<li>display request or response headers for each transaction<br \/>\n  (<code>-v show_req_headers=1<\/code>, <code>-v show_resp_headers=1<\/code>)<\/li>\n<li>show only requests slower than 200ms (<code>vlogdump -v only_slow=200<\/code>)<\/li>\n<li>show only cache misses or hits (<code>-v only_hits=1<\/code> or <code>only_misses=1<\/code>)<\/li>\n<li>show only transactions where the URL matches regexp X<br \/>\n  (<code>-v url_match='X'<\/code> or <code>-v url_match='!X'<\/code> for negative match)<\/li>\n<li>show only transactions where the HTTP status code was X<br \/>\n  (<code>-v only_status=X<\/code>)<\/li>\n<li>show only transactions where the request or response headers match a given regular expression (<code>-v req_headers_match=Blah<\/code>, <code>-v resp_headers_match=Error<\/code>)<\/li>\n<\/ul>\n<p>You can also combine most of these options together. That is very useful when you are interested in a small fraction of the traffic, but <b>you want to see the whole in-flight transactions<\/b>.<\/p>\n<p>One recommendation though. It is my first (last?) significant awk script :-) I know it works well, and I'm using it, but due to the way it works, <b>I wouldn't leave it running for long periods of time<\/b>, as it will slowly eat your memory keeping track of all transactions and clients.<\/p>\n<p>If you have feedback or questions, feel free to comment on github or send me an email.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Haven&#8217;t written much in the last few months. The reason is that I&#8217;ve been at work building the Opera Discover service backend, that we launched on Opera mobile for Android just a few days ago. A few weeks before, during the first stress test sessions of Discover, I wrote this little tool called vlogdump that [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[512],"tags":[525,242,63,523,524,60,522,61],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Display and filter traffic at the varnish level: vlogdump - Random hacking<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Display and filter traffic at the varnish level: vlogdump - Random hacking\" \/>\n<meta property=\"og:description\" content=\"Haven&#8217;t written much in the last few months. The reason is that I&#8217;ve been at work building the Opera Discover service backend, that we launched on Opera mobile for Android just a few days ago. A few weeks before, during the first stress test sessions of Discover, I wrote this little tool called vlogdump that [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/\" \/>\n<meta property=\"og:site_name\" content=\"Random hacking\" \/>\n<meta property=\"article:published_time\" content=\"2013-05-25T07:45:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-05-25T08:10:47+00:00\" \/>\n<meta name=\"author\" content=\"cosimo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"cosimo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/\"},\"author\":{\"name\":\"cosimo\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\"},\"headline\":\"Display and filter traffic at the varnish level: vlogdump\",\"datePublished\":\"2013-05-25T07:45:03+00:00\",\"dateModified\":\"2013-05-25T08:10:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/\"},\"wordCount\":405,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\"},\"keywords\":[\"awk\",\"devops\",\"github\",\"traffic\",\"troubleshooting\",\"varnish\",\"vlogdump\",\"webops\"],\"articleSection\":[\"Operations\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/\",\"url\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/\",\"name\":\"Display and filter traffic at the varnish level: vlogdump - Random hacking\",\"isPartOf\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#website\"},\"datePublished\":\"2013-05-25T07:45:03+00:00\",\"dateModified\":\"2013-05-25T08:10:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.streppone.it\/cosimo\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Display and filter traffic at the varnish level: vlogdump\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#website\",\"url\":\"https:\/\/www.streppone.it\/cosimo\/blog\/\",\"name\":\"Random hacking\",\"description\":\"Assume nothing. Code defensively. Keep it simple, stupid!\",\"publisher\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.streppone.it\/cosimo\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\",\"name\":\"cosimo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g\",\"caption\":\"cosimo\"},\"logo\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/www.streppone.it\/cosimo\/blog\/author\/cosimo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Display and filter traffic at the varnish level: vlogdump - Random hacking","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/","og_locale":"en_US","og_type":"article","og_title":"Display and filter traffic at the varnish level: vlogdump - Random hacking","og_description":"Haven&#8217;t written much in the last few months. The reason is that I&#8217;ve been at work building the Opera Discover service backend, that we launched on Opera mobile for Android just a few days ago. A few weeks before, during the first stress test sessions of Discover, I wrote this little tool called vlogdump that [&hellip;]","og_url":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/","og_site_name":"Random hacking","article_published_time":"2013-05-25T07:45:03+00:00","article_modified_time":"2013-05-25T08:10:47+00:00","author":"cosimo","twitter_card":"summary_large_image","twitter_misc":{"Written by":"cosimo","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/#article","isPartOf":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/"},"author":{"name":"cosimo","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1"},"headline":"Display and filter traffic at the varnish level: vlogdump","datePublished":"2013-05-25T07:45:03+00:00","dateModified":"2013-05-25T08:10:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/"},"wordCount":405,"commentCount":1,"publisher":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1"},"keywords":["awk","devops","github","traffic","troubleshooting","varnish","vlogdump","webops"],"articleSection":["Operations"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/","url":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/","name":"Display and filter traffic at the varnish level: vlogdump - Random hacking","isPartOf":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#website"},"datePublished":"2013-05-25T07:45:03+00:00","dateModified":"2013-05-25T08:10:47+00:00","breadcrumb":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2013\/05\/display-and-filter-traffic-at-the-varnish-level-vlogdump\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.streppone.it\/cosimo\/blog\/"},{"@type":"ListItem","position":2,"name":"Display and filter traffic at the varnish level: vlogdump"}]},{"@type":"WebSite","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#website","url":"https:\/\/www.streppone.it\/cosimo\/blog\/","name":"Random hacking","description":"Assume nothing. Code defensively. Keep it simple, stupid!","publisher":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.streppone.it\/cosimo\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1","name":"cosimo","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g","caption":"cosimo"},"logo":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/"},"url":"https:\/\/www.streppone.it\/cosimo\/blog\/author\/cosimo\/"}]}},"_links":{"self":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts\/781"}],"collection":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/comments?post=781"}],"version-history":[{"count":25,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts\/781\/revisions"}],"predecessor-version":[{"id":806,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts\/781\/revisions\/806"}],"wp:attachment":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/media?parent=781"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/categories?post=781"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/tags?post=781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}