{"id":21712,"date":"2018-03-28T17:51:41","date_gmt":"2018-03-28T17:51:41","guid":{"rendered":"http:\/\/inside_the_black_box_with_server_timing"},"modified":"2023-07-09T05:40:41","modified_gmt":"2023-07-09T12:40:41","slug":"inside_the_black_box_with_server_timing","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing","title":{"rendered":"Inside the Black Box with Server-Timing"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><h2>TL;DR<\/h2>\n<ul>\n<li>Cloudinary is committed to openness and transparency<\/li>\n<li>Server-Timing is now available on-demand with the request header <code>Pragma: server-timing<\/code>\n<\/li>\n<li>We plan to make this \u201calways-on\u201d in the near future<\/li>\n<li>We want to hear your feedback<\/li>\n<\/ul>\n<h2>Overview<\/h2>\n<p>This week at the <a href=\"https:\/\/perfmattersconf.com\/\">#PerfMatters Conference<\/a>, we learned about the importance of performance measurement and <a href=\"https:\/\/w3c.github.io\/server-timing\/\">new standards<\/a> like <code>Server-Timing<\/code> that is available in Chrome 65, Opera and soon Firefox.<\/p>\n<p>At Cloudinary we are committed to transparency and accountability. That\u2019s why I\u2019m really excited to announce that we now support <code>Server-Timing<\/code> for all our customers! Today, <code>Server-Timing<\/code> is available on-demand, but in the near future we will enable this broadly &#8211; enabling greater insights with your <a href=\"https:\/\/speedcurve.com\/features\/lux\/\">RUM<\/a> <a href=\"https:\/\/www.akamai.com\/us\/en\/products\/web-performance\/mpulse.jsp\">solutions<\/a>.<\/p>\n<h2>How do I see it?<\/h2>\n<p><code>Server-Timing<\/code> is now enabled on-demand for all customers. It can be enabled on the client side by adding the header <code>Pragma: server-timing<\/code><\/p>\n<p>In curl, you can add it with <code>-H &quot;Pragma: server-timing&quot;<\/code>:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>curl http:\/\/res.cloudinary.com\/colinbendell\/sample.jpg -H &quot;Pragma: server-timing&quot; -D - -I\n<\/code><\/pre>\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>(<code>-D -<\/code> sends headers to the console, <code>-I<\/code> is for a head request so you don\u2019t see the bytes)<\/p><\/div>\n<p>In return, you will see:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>Date: Wed, 28 Mar 2018 15:22:05 GMT\nContent-Type: image\/jpg\nServer-Timing: cloudinary;dur=105;start=1522250525.545;total=105\nServer-Timing: akam;dur=18;start=1522250525.454;total=233;desc=&quot;~(cache~'miss~rtt~6~id~'42c1b76~pconn~1~f_pconn~1)&quot;\n<\/code><\/pre>\n<p>Or in your browser, you can add it with a <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/modheader\/idgpnmonknjnojddfkpgkljpfnnfcklj?hl=en-US\">Chrome Extension<\/a>:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_600,c_fill\/Server_timing.png\" alt=\"Server-Timing\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"600\" height=\"204\"\/><\/p>\n<p>Now you can see it your devtools:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_700,c_fill\/dpr_auto\/Devtools_Server-timing.png\" alt=\"DevTools Server Timing\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"692\"\/><\/p>\n<p>And you can query it via javascript:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">window<\/span><span class=\"hljs-selector-class\">.performance<\/span><span class=\"hljs-selector-class\">.getEntries<\/span>()\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_700,c_fill\/dpr_auto\/Performance_resource_timing.png\" alt=\"Performance Resource Timing\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"898\"\/><\/p>\n<h2>What details are you sharing?<\/h2>\n<p>In our first iteration, we are sharing a number of operational details. In the <code>desc<\/code> field you will notice a <a href=\"https:\/\/github.com\/Sage\/jsurl\"><code>jsurl<\/code> encoded<\/a> payload.\nThis iteration exposes a few interesting details:<\/p>\n<ul>\n<li>\n<code>start<\/code> (epoch.ms) &#8211; the start time &#8211; from the server\u2019s perspective<\/li>\n<li>\n<code>total<\/code> (ms) &#8211; the total \u2018clock-time\u2019 to turn the response around. This is important if there were dependencies.<\/li>\n<li>\n<code>dur<\/code> (ms) &#8211; the duration or \u2018effort-time\u2019 to satisfy the request. This would be the cpu, io, etc from the time the request started totalled until the bytes were flushed to the network as a response.<\/li>\n<li>\n<code>rtt<\/code> (ms) &#8211; the TCP round-trip-time from the last packet from the server\u2019s perspective.<\/li>\n<li>\n<code>cache<\/code> &#8211; hit or miss<\/li>\n<li>\n<code>pconn<\/code> &#8211; the request count on the TCP socket<\/li>\n<li>\n<code>fpconn<\/code> &#8211; the request count on the outgoing TCP socket<\/li>\n<\/ul>\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>Yes, it isn\u2019t human readable, but this is the only mechanism that allows Javascript to programmatically access these extra fields.<\/p><\/div>\n<p>A few important notes:<\/p>\n<ul>\n<li>There are three different names exposed: <code>cloudinary<\/code>, <code>akamai<\/code> and <code>fastly<\/code>. This relates to the different service providers. The first is the entry from our servers, the last two are from the CDNs we use<\/li>\n<li>Multiple <code>Server-Timing<\/code> entries &#8211; one for each <strong>\u2018hop\u2019<\/strong> along the journey<\/li>\n<li>Check the <code>start<\/code> time! Historical <code>Server-Timing<\/code> entries are also preserved. It might be a cache-hit on our CDN, but you will still see where this entry came from, when it was added to the cache, etc.<\/li>\n<\/ul>\n<h2>What insights can I gain today?<\/h2>\n<p>Here are some of the interesting observations we have found already with this additional insight:<\/p>\n<h3>Cost of TCP overhead<\/h3>\n<p>Consider the following responses:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>server-timing: cloudinary;dur=94;start=1516653847.986;total=94\nserver-timing: akam;dur=16;start=1516653847.922;total=207;desc=&quot;~(cache~'miss~rtt~57~id~'1ca34068~pconn~7~f_pconn~1)&quot;\nserver-timing: akam;dur=16;start=1516653847.879;total=278;desc=&quot;~(cache~'miss~rtt~26~id~'9ca8e39~pconn~1~f_pconn~1)&quot;\n<\/code><\/pre>\n<p>Here is the break down of the above (reading from bottom up, since the headers were added cumulatively):<\/p>\n<ul>\n<li>from the Browser\u2019s perspective, this resource took ~400ms:<\/li>\n<\/ul>\n<pre class=\"js-syntax-highlighted\"><code>let resTiming = window.performance.getEntries()[4];\nresTiming.responseStart - resTiming.requestEnd;\n\n398\n<\/code><\/pre>\n<ul>\n<li>the CDN edge node took 278 ms to complete this request (total=278)<\/li>\n<li>it was a cache-miss<\/li>\n<li>in turn, the CDN used a parent node which took 207ms from its perspective (total=207)<\/li>\n<li>it too was a cache-miss and required to go to <a href=\"https:\/\/cloudinary.com\/glossary\/origin-servers\">origin<\/a>\n<\/li>\n<li>finally, this turned around and made a request to our servers which took 94ms.<\/li>\n<\/ul>\n<p>Where did the time go?<\/p>\n<ul>\n<li>first the browser to the CDN needed a TCP connection. The RTT is 26ms, so ~100ms is used connecting TCP.<\/li>\n<li>the layers of the CDN needed to connect and so on to the origin<\/li>\n<li>the actual think-time is 94ms<\/li>\n<li>the extra time is in the TCP overhead, not on server think time.<\/li>\n<li>if we had a cache-hit none of this extra tax would be applied<\/li>\n<\/ul>\n<p><strong>Our lesson learned:<\/strong> Once again, caching is important &#8211; see #2 in Souder\u2019s web performance rules. A cache miss can cause the user to wait because of the TCP handshakes over the wire. All the more reason we need to maximize our use of CDNs.<\/p>\n<h3>Personalization &amp; cache efficiency<\/h3>\n<p>There are many interesting experiments that we hope this data could help illuminate. For example, is your personalized-hero image slow to load because it isn\u2019t being cached and is being generated on demand? What is the conversion rate for <a href=\"https:\/\/cloudinary.com\/glossary\/cache-hit-ratio\">cache-hits<\/a>? These are interesting hypotheses which are now easily observed. With <a href=\"https:\/\/en.wikipedia.org\/wiki\/Real_user_monitoring\">RUM tools<\/a> like Lux, you can add a little bit of Javascript to add to your performance dashboard:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>let LUX = window.LUX;\n\n\/\/find the hero image in the browser\u2019s server timing\nlet heroImg = window.performance.getEntriesByName(\u2018personalized-hero\u2019).serverTiming;\n\n\/\/ test for the cache hit\nlet cacheHit = \/cache~\u2019hit\/.test(heroImg[heroImg.length - 1].description); \n\n\/\/ add the value to the lux data\nLUX.addData('personalized-hero', cacheHit ? 1 : 0);\n<\/code><\/pre>\n<p>From there, you can easily graph the results from real-world impact for your users. Exciting!<\/p>\n<h2>Objections?!?!<\/h2>\n<p>As with anything \u201cnew\u201d there are many reasons why not to adopt or support it. Below is a list of the objections we\u2019ve quickly contemplated along with our current perspective:<\/p>\n<ol>\n<li>\n<p><strong>Our dev team &#8211; We will expose our technical debt and we don\u2019t know what skeletons might be in the closet!<\/strong><\/p>\n<p>Yup. We expect a few embarrassments. No company is perfect, and no technology is without technical debt. Yet, this will help us focus on what is important to our customers and help raise the bar in the quality of service we deliver.<\/p>\n<\/li>\n<li>\n<p><strong>Our product team &#8211; Won\u2019t this put us out of business? Won\u2019t we reveal too much and customers will build it themselves?<\/strong><\/p>\n<p>Maybe. But unlikely. Ideas are free and abundant. If the service we provide can be put out of business by being transparent with our performance, then we are not delivering enough value to our customers.<\/p>\n<\/li>\n<li>\n<p><strong>As a customer, won\u2019t this slow down the download for my users with these extra headers?<\/strong><\/p>\n<p>This is a concern that we share and why we want to act prudently. In reality, the extra <code>Server-Timing<\/code> headers will amount to ~100 Bytes. On a typical image that is 24KiB, this is a 0.4% increase. This will not increase the number of packets sent to the user since many packets are \u2018half-empty\u2019 anyway. This is something we will be observing and will report back in the near future before we turn this on by default.<\/p>\n<\/li>\n<\/ol>\n<h2>What\u2019s next?<\/h2>\n<p>We have many things planned. We want to expose more details, make this more relevant for you, and help drive insight to your business.<\/p>\n<p>First we need to find the balance between what is germane and actionable, in contrast to what is simply \u2018interesting\u2019. We will make more announcements of the details we are sharing in the near future. If you have opinions and thoughts, we\u2019d love to hear them.<\/p>\n<p>More importantly, we have some great ideas about how to use <code>Server-Timing<\/code> to improve your business. Really exciting ideas in fact. Stay tuned!<\/p>\n<p>The spec is still evolving. You\u2019ll notice that we are using a few non-standard fields like <a href=\"https:\/\/github.com\/w3c\/server-timing\/issues\/43\">total<\/a> and <a href=\"https:\/\/github.com\/w3c\/server-timing\/issues\/44\">start<\/a>. As well we are \u201cusing\u201d the <code>desc<\/code> field to provide <a href=\"https:\/\/github.com\/w3c\/server-timing\/issues\/45\">custom details<\/a>. We will make changes as the <a href=\"https:\/\/github.com\/w3c\/server-timing\/issues\">spec evolves<\/a>.<\/p>\n<h2>We need your help<\/h2>\n<p>As mentioned previously, this is the beginning. We are committed to providing you more transparency and insight to our services. If you have opinions, ideas, or concerns we would love to hear them. How can we provide you more details to help your business?  To help your operations teams? To help your marketing teams? We want to hear from you! Please leave your thoughts in the comment section below.<\/p>\n<h2>Up Next: Digging deeper into Server-Timing<\/h2>\n<p>In the next instalment we will explore <code>Server-Timing<\/code> in more detail and some of the exciting use cases we are pursuing.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21713,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[49,227],"class_list":["post-21712","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-cdn","tag-performance-optimization"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Server-Timing now available on Cloudinary<\/title>\n<meta name=\"description\" content=\"Cloudinary is committed to openness, transparency and accountability. We now support Server-Timing for all our customers.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Inside the Black Box with Server-Timing\" \/>\n<meta property=\"og:description\" content=\"Cloudinary is committed to openness, transparency and accountability. We now support Server-Timing for all our customers.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-03-28T17:51:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-09T12:40:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"1155\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Inside the Black Box with Server-Timing\",\"datePublished\":\"2018-03-28T17:51:41+00:00\",\"dateModified\":\"2023-07-09T12:40:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing\"},\"wordCount\":6,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2.jpg?_i=AA\",\"keywords\":[\"CDN\",\"Performance Optimization\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2018\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing\",\"url\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing\",\"name\":\"Server-Timing now available on Cloudinary\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2.jpg?_i=AA\",\"datePublished\":\"2018-03-28T17:51:41+00:00\",\"dateModified\":\"2023-07-09T12:40:41+00:00\",\"description\":\"Cloudinary is committed to openness, transparency and accountability. We now support Server-Timing for all our customers.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2.jpg?_i=AA\",\"width\":1540,\"height\":1155},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Inside the Black Box with Server-Timing\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Server-Timing now available on Cloudinary","description":"Cloudinary is committed to openness, transparency and accountability. We now support Server-Timing for all our customers.","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:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing","og_locale":"en_US","og_type":"article","og_title":"Inside the Black Box with Server-Timing","og_description":"Cloudinary is committed to openness, transparency and accountability. We now support Server-Timing for all our customers.","og_url":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing","og_site_name":"Cloudinary Blog","article_published_time":"2018-03-28T17:51:41+00:00","article_modified_time":"2023-07-09T12:40:41+00:00","og_image":[{"width":1540,"height":1155,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing"},"author":{"name":"","@id":""},"headline":"Inside the Black Box with Server-Timing","datePublished":"2018-03-28T17:51:41+00:00","dateModified":"2023-07-09T12:40:41+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing"},"wordCount":6,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2.jpg?_i=AA","keywords":["CDN","Performance Optimization"],"inLanguage":"en-US","copyrightYear":"2018","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing","url":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing","name":"Server-Timing now available on Cloudinary","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2.jpg?_i=AA","datePublished":"2018-03-28T17:51:41+00:00","dateModified":"2023-07-09T12:40:41+00:00","description":"Cloudinary is committed to openness, transparency and accountability. We now support Server-Timing for all our customers.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2.jpg?_i=AA","width":1540,"height":1155},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/inside_the_black_box_with_server_timing#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Inside the Black Box with Server-Timing"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649733481\/Web_Assets\/blog\/PerfMatters_Jeremy-2\/PerfMatters_Jeremy-2.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21712","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21712"}],"version-history":[{"count":6,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21712\/revisions"}],"predecessor-version":[{"id":30330,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21712\/revisions\/30330"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21713"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21712"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21712"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21712"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}