{"id":10004,"date":"2016-05-03T17:49:26","date_gmt":"2016-05-03T15:49:26","guid":{"rendered":"https:\/\/blog.zhaw.ch\/icclab\/?p=10004"},"modified":"2019-08-05T14:35:42","modified_gmt":"2019-08-05T12:35:42","slug":"making-tools-robust-and-breaking-robust-tools","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/","title":{"rendered":"Making Tools Robust and Breaking Robust Tools"},"content":{"rendered":"\n<p>by <a href=\"https:\/\/blog.zhaw.ch\/icclab\/josef-spillner\/\">Josef Spillner<\/a><\/p>\n\n\n<p>Cloud services are meant to be elastically scalable and robust against all kinds of failures. The core services are <a href=\"http:\/\/cloudcurve.eiu.com\/\">very mature nowadays<\/a>, but the tools which glue them together are often in need of quality improvements. Two common risks in networked environments are (1) unavailability and (2) slowness of services. The first risk is easier to detect but more severe in its effects. Furthermore, there is a dependency between the two as timeouts in many layers of the software cause unavailability failures upon strong slowdown. Timeouts <a href=\"https:\/\/repositories.lib.utexas.edu\/handle\/2152\/31376\">should be<\/a> <a href=\"http:\/\/research.microsoft.com\/en-us\/um\/people\/lamport\/pubs\/using-time.pdf\">avoided<\/a> but are often part of protocols, libraries, framework and stacks with almost arbitrary combinations, so that in practice, failures happen more often than necessary. This post shows how research initiatives in the <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/labs\/splab\/\">Service Prototyping Lab<\/a> work on improving the situation to make cloud services access more robust and easier to handle for application developers.<\/p>\n<p><!--more--><\/p>\n<p>Imagine the scenario of uploading a virtual machine or container image with a footprint of several hundred megabytes with the goal of making it available to compute instances. On faulty network connections, any upload can be interrupted which would require subsequent retries until the upload succeeds. <a href=\"http:\/\/aws.amazon.com\/s3\/\">AWS S3<\/a>, Git and Git-hosted cloud offerings (e.g. OpenShift) are such services with tooling issues related to these interruptions. The AWS and Git command-line tools will not attempt any re-uploads and will instead report failures. For automated scenarios in which such tools are used, this is not always the desired behaviour. In our work, we have observed, measured and improved the service behaviour of AWS S3 but generalise the results for similar services.<\/p>\n<p>The figure below shows how many 33 MB file upload attempts are necessary at an (artificially emulated) slow network connection with a packet delay of 5s. Of 29 attempts, only two have been successful, and 12 retries are needed on average. This suggests that although such a retry functionality is desirable, it is not economically to push the same file again and again, and a better solution is needed. An advantage is that the functionality can be and has been implemented in a drop-in wrapper script to <em>aws-cli<\/em> without further modifications.<\/p>\n<figure id=\"attachment_10005\" aria-describedby=\"caption-attachment-10005\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-10005 size-medium\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-300x226.png\" alt=\"awsretry-exp\" width=\"300\" height=\"226\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-300x226.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-768x579.png 768w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-398x300.png 398w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp.png 812w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-10005\" class=\"wp-caption-text\">A spotty network connection will not let many files through to S3.<\/figcaption><\/figure>\n<p>Multiple tools support the incremental (delta) transmission of files. Git does not support it, but Rsync is a traditional example, and the S3 tool of <em>aws-cli<\/em> also supports it. But again, it does not automate retries for uploads, even though the functionality is foreseen in several other methods. It merely offers multi-part uploads which can however be a building block towards more fine-grained retries. The next figure shows how the success rate depends on the file sizes (9 to 33 MB) and, by extension, on the underlying part sizes for multi-part uploads (4.5 to 8.25 MB). While the quantity of measurements is small, the observation that mid-sized parts have the least success rate suggest that there is most likely no linear correlation between the two metrics, and hence, no optimal start configuration. Still, we have added a new parameter <em>&#8211;chunk-size<\/em> so that each session of <em>aws-cli<\/em> can be invoked with custom values instead of relying on the global configuration.<\/p>\n<figure id=\"attachment_10007\" aria-describedby=\"caption-attachment-10007\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/aws-s3-test.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-10007 size-medium\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/aws-s3-test-300x226.png\" alt=\"aws-s3-test\" width=\"300\" height=\"226\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/aws-s3-test-300x226.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/aws-s3-test-768x579.png 768w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/aws-s3-test-398x300.png 398w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/aws-s3-test.png 812w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-10007\" class=\"wp-caption-text\">No linear correlation found between file sizes, part sizes and success\/failure rates.<\/figcaption><\/figure>\n<p>The next figure details the same observation for a single file with fixed size (33 MB \u00e0 7 parts using the S3-imposed minimum part size of 5 MB).<\/p>\n<figure id=\"attachment_10008\" aria-describedby=\"caption-attachment-10008\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/failtest-adaptive.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-10008 size-medium\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/failtest-adaptive-300x226.png\" alt=\"failtest-adaptive\" width=\"300\" height=\"226\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/failtest-adaptive-300x226.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/failtest-adaptive-768x579.png 768w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/failtest-adaptive-398x300.png 398w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/failtest-adaptive.png 812w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-10008\" class=\"wp-caption-text\">No linear correlation between part size and success\/failure rate.<\/figcaption><\/figure>\n<p>With some minor modifications, the <em>aws-cli<\/em> tool obeys to user policies on whether and how often to retry uploads, either in whole or in parts. Each unimpaired upload consists of a prepare statement, <em>n<\/em> * parallel part uploads, and a commit statement. With retries, which are executed directly after failures, the <em>(n+2)<\/em> factor is multiplied with another one which depends on the average retry rate. Advanced tools such as <a href=\"https:\/\/github.com\/joe42\/CloudFusion\">CloudFusion<\/a> offer retries with exponential back-off times, but for our observation, we are merely interested in the trade-off between success rate and retransmission overhead. The policy is therefore expressed through two environment variables, <em>AWSRETRY<\/em> (positive number for limited attempts, negative one for unlimited attempts) and <em>AWSRETRYDEBUG<\/em> (for experiments).<\/p>\n<p>The figure below shows how depending on the network delay (5-15s) and the maximum attempts for repeated uploading (3, 5 or \u221e) the trade-off is between pure quality (at any cost), pure cost (no matter what quality), or anything in between. Depending on the scenario, all configurations are useful. For instance, an application transmitting mass data can be hosted much cheaper if occasionally lost messages are tolerated, and <em>AWSRETRY=0<\/em> is appropriate. An application transmitting records with individual value will go for <em>AWSRETRY=-1<\/em> (\u221e). The ideal situation would be 100% success rate with an overhead factor of 1.0, which can be reached with any configuration only in case of perfect networks.<\/p>\n<p><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-parts.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10006 aligncenter\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-parts-300x226.png\" alt=\"awsretry-parts\" width=\"300\" height=\"226\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-parts-300x226.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-parts-768x579.png 768w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-parts-398x300.png 398w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-parts.png 812w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Yet, the results show that even in extreme network conditions, unlimited file-part retries work and are still economically viable compared to limited whole-file uploads due the failure probability distribution over all parts. Furthermore, these retries simplify the creation of automation tools with <a href=\"http:\/\/www.cs.usfca.edu\/~parrt\/course\/601\/lectures\/programming.by.contract.html\">contract programming<\/a> which requires a clear specification of the behaviour of tools given user policies.<\/p>\n<p>The <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/research-approach\/themes\/service-tooling\/\">Service Tooling<\/a> research initiative in the Service Prototyping Lab hence investigates more appropriate tooling for service-based cloud applications, and the <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/research-approach\/themes\/active-service-management\/\">Active Service Management<\/a> research initiative considers controlled active fault provocation and injection to trigger the robustness and resilience properties of <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/research-approach\/themes\/cloud-native-applications\/\">Cloud-Native Applications<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/research-approach\/themes\/cloud-application-development-tooling\/\">Cloud Application Development Tooling<\/a> and other cloud tools.<\/p>\n<p>A <a href=\"https:\/\/github.com\/serviceprototypinglab\/aws-cli-retry\">Git repository <em>aws-cli-retry<\/em><\/a> is available to fetch the necessary code modifications in <em>aws-cli<\/em>. Among them are the introduction of the <a href=\"https:\/\/github.com\/serviceprototypinglab\/aws-cli-retry\/commit\/025fb5bb89d3997876339f90ebcfebb1c0eca9b8\"><em>AWSRETRY<\/em> environment variable<\/a> as well as a <a href=\"https:\/\/github.com\/serviceprototypinglab\/aws-cli-retry\/commit\/af5c74fc93056e797eed03a0e67a71188ee6c34e\">bugfix against wrong part counting<\/a>. According to scientific research expectations, all experiment scripts (including the <em>awsretry<\/em> wrapper) and logs containing the raw data are available as well in another repository called <em><a href=\"https:\/\/github.com\/serviceprototypinglab\/aws-cli-experiments\">aws-cli-experiments<\/a><\/em>.<\/p><div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/aws\/\">AWS<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/experiment\/\">experiment<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/splab\/\">splab<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/tooling\/\">tooling<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>Cloud services are meant to be elastically scalable and robust against all kinds of failures. The core services are very mature nowadays, but the tools which glue them together are often in need of quality improvements. Two common risks in networked environments are (1) unavailability and (2) slowness of services. The first risk is easier [&hellip;]<\/p>\n","protected":false},"author":486,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1],"tags":[594,778,769,777],"features":[],"class_list":["post-10004","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-aws","tag-experiment","tag-splab","tag-tooling"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Making Tools Robust and Breaking Robust Tools - Service Engineering (ICCLab &amp; SPLab)<\/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:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Making Tools Robust and Breaking Robust Tools\" \/>\n<meta property=\"og:description\" content=\"Cloud services are meant to be elastically scalable and robust against all kinds of failures. The core services are very mature nowadays, but the tools which glue them together are often in need of quality improvements. Two common risks in networked environments are (1) unavailability and (2) slowness of services. The first risk is easier [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Engineering (ICCLab &amp; SPLab)\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-03T15:49:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-05T12:35:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-300x226.png\" \/>\n<meta name=\"author\" content=\"icclab\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"icclab\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/\"},\"author\":{\"name\":\"icclab\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\"},\"headline\":\"Making Tools Robust and Breaking Robust Tools\",\"datePublished\":\"2016-05-03T15:49:26+00:00\",\"dateModified\":\"2019-08-05T12:35:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/\"},\"wordCount\":982,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-300x226.png\",\"keywords\":[\"AWS\",\"experiment\",\"splab\",\"tooling\"],\"articleSection\":[\"*.*\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/\",\"name\":\"Making Tools Robust and Breaking Robust Tools - Service Engineering (ICCLab &amp; SPLab)\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-300x226.png\",\"datePublished\":\"2016-05-03T15:49:26+00:00\",\"dateModified\":\"2019-08-05T12:35:42+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#primaryimage\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp.png\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp.png\",\"width\":812,\"height\":612},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/icclab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Making Tools Robust and Breaking Robust Tools\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/\",\"name\":\"Service Engineering (ICCLab &amp; SPLab)\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\",\"name\":\"icclab\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"caption\":\"icclab\"},\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/author\/icclab\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Making Tools Robust and Breaking Robust Tools - Service Engineering (ICCLab &amp; SPLab)","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:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/","og_locale":"en_US","og_type":"article","og_title":"Making Tools Robust and Breaking Robust Tools","og_description":"Cloud services are meant to be elastically scalable and robust against all kinds of failures. The core services are very mature nowadays, but the tools which glue them together are often in need of quality improvements. Two common risks in networked environments are (1) unavailability and (2) slowness of services. The first risk is easier [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/","og_site_name":"Service Engineering (ICCLab &amp; SPLab)","article_published_time":"2016-05-03T15:49:26+00:00","article_modified_time":"2019-08-05T12:35:42+00:00","og_image":[{"url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-300x226.png","type":"","width":"","height":""}],"author":"icclab","twitter_card":"summary_large_image","twitter_misc":{"Written by":"icclab","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/"},"author":{"name":"icclab","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563"},"headline":"Making Tools Robust and Breaking Robust Tools","datePublished":"2016-05-03T15:49:26+00:00","dateModified":"2019-08-05T12:35:42+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/"},"wordCount":982,"commentCount":0,"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-300x226.png","keywords":["AWS","experiment","splab","tooling"],"articleSection":["*.*"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/","url":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/","name":"Making Tools Robust and Breaking Robust Tools - Service Engineering (ICCLab &amp; SPLab)","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp-300x226.png","datePublished":"2016-05-03T15:49:26+00:00","dateModified":"2019-08-05T12:35:42+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#primaryimage","url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp.png","contentUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/05\/awsretry-exp.png","width":812,"height":612},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/icclab\/making-tools-robust-and-breaking-robust-tools\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/icclab\/"},{"@type":"ListItem","position":2,"name":"Making Tools Robust and Breaking Robust Tools"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/icclab\/#website","url":"https:\/\/blog.zhaw.ch\/icclab\/","name":"Service Engineering (ICCLab &amp; SPLab)","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563","name":"icclab","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","caption":"icclab"},"url":"https:\/\/blog.zhaw.ch\/icclab\/author\/icclab\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/10004","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/users\/486"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/comments?post=10004"}],"version-history":[{"count":7,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/10004\/revisions"}],"predecessor-version":[{"id":12509,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/10004\/revisions\/12509"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/media?parent=10004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/categories?post=10004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/tags?post=10004"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/features?post=10004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}