{"id":5392,"date":"2020-06-09T13:09:33","date_gmt":"2020-06-09T11:09:33","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=5392"},"modified":"2022-01-05T20:05:12","modified_gmt":"2022-01-05T19:05:12","slug":"troubleshooting-debugging-microservices","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/","title":{"rendered":"Troubleshooting &#038; Debugging Microservices"},"content":{"rendered":"\t\t\t\t<div class=\"wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-2d8b8cad-d986-4403-851e-5cd3ce278d4f      \"\n\t\t\t\t\tdata-scroll= \"1\"\n\t\t\t\t\tdata-offset= \"30\"\n\t\t\t\t\tstyle=\"\"\n\t\t\t\t>\n\t\t\t\t<div class=\"uagb-toc__wrap\">\n\t\t\t\t\t\t<div class=\"uagb-toc__title\">\n\t\t\t\t\t\t\tTable Of Contents\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"uagb-toc__list-wrap \">\n\t\t\t\t\t\t<ol class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#how-to-test-microservices\" class=\"uagb-toc-link__trigger\">How to test microservices<\/a><li class=\"uagb-toc__list\"><a href=\"#best-practices-for-debugging-microservices\" class=\"uagb-toc-link__trigger\">Best practices for debugging microservices<\/a><li class=\"uagb-toc__list\"><a href=\"#challenges-changes-with-microservices\" class=\"uagb-toc-link__trigger\">Challenges &amp; changes with microservices<\/a><li class=\"uagb-toc__list\"><a href=\"#logging-and-crash-reporting\" class=\"uagb-toc-link__trigger\">Logging and crash reporting<\/a><li class=\"uagb-toc__list\"><a href=\"#key-takeaways\" class=\"uagb-toc-link__trigger\">Key Takeaways<\/a><\/ol>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\n\n\n<p>From Hoverfly to Lyft Envoy, there are a number of <span id=\"urn:enhancement-d6c83503\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/programming_tool\">tools<\/span> available for troubleshooting and <span id=\"urn:enhancement-c3b0ca43\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> microservices. But even with <span id=\"urn:enhancement-6a806ade\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/programming_tool\">tools<\/span> in hand, <span id=\"urn:enhancement-6a19e3f6\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> microservices can be a challenge. With so many layers of potential <span id=\"urn:enhancement-717855e4\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/abstraction\">abstraction<\/span> and <span id=\"urn:enhancement-8d52ca53\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/complexity\">complexity<\/span>, <span id=\"urn:enhancement-1f3912ff\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developers<\/span> have to dig deep into their logs, dependencies, and reporting. <a href=\"https:\/\/lightstep.com\/blog\/microservices-architecture-when-and-how-to-move-to-microservices\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener nofollow\" class=\"ek-link\">Microservices architecture<\/a> gets only more complicated as it scales, and many <span id=\"urn:enhancement-292ad3c5\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/system_administrator\">administrators<\/span> and <span id=\"urn:enhancement-449061b\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developers<\/span> may find themselves struggling to manage and maintain a <span id=\"urn:enhancement-cfc6ec9c\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/system\">system<\/span> that has outgrown them.<\/p>\n\n\n\n<p>Still, <span id=\"urn:enhancement-544c945f\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> microservices is essential. How can <span id=\"urn:enhancement-5a9b3880\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developers<\/span> make their <span id=\"urn:enhancement-e4b203a8\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/job\">jobs<\/span> easier? What are the <span id=\"urn:enhancement-b41c017d\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/best_practice\">best practices<\/span> and easiest <span id=\"urn:enhancement-af73677\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/method_computer_programming\">methods<\/span> of testing microservices\u2014and ensuring that the issues are found?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to test microservices<\/h2>\n\n\n\n<p>With any element of architectural <span id=\"urn:enhancement-19045ff8\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/complexity\">complexity<\/span>, it&#8217;s important that testing is conducted in a structured, refined, and optimized way. Manually testing <span id=\"urn:enhancement-47b2546c\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">microservices<\/span> happens in a step-by-step <span id=\"urn:enhancement-8200496f\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/process_computing\">process<\/span>:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Validating each code branch<\/li><li>Digging into the latest code available<\/li><li>Making sure dependencies have been updated<\/li><li>Verifying database validity<\/li><li>Restarting the service<\/li><\/ul>\n\n\n\n<p>But there are also automated <span id=\"urn:enhancement-87d8fc7d\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/process_computing\">processes<\/span> that can be used for the <span id=\"urn:enhancement-8f027049\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/process_computing\">process<\/span> of testing <span id=\"urn:enhancement-1da38bfb\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">microservices<\/span>. <span id=\"urn:enhancement-389ba29a\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/unit_testing\">Unit testing<\/span>, contract testing, integration testing, <span id=\"urn:enhancement-41c0d17c\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/end-to-end_principle\">end-to-end<\/span> testing, and <span id=\"urn:enhancement-71d78eb2\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/user_interface\">UI<\/span> functional testing are all segments of microservice testing, dependent on what areas of the <span id=\"urn:enhancement-5be15c3f\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">microservice<\/span> are being tested, and how the <span id=\"urn:enhancement-4bdbac09\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">microservice<\/span> is malfunctioning.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Unit testing<\/strong>. This ensures that the microservice itself is operating correctly. Given the correct parameters, the microservice provides the right information. This is usually done before deploying the microservice and gives the developer information regarding whether the microservice is performing its own work with the consistency that it needs to. If an issue is traced directly back to the microservice, the microservice will need to undergo unit testing again until the issue can be replicated and resolved. Docker, Kubernetes, and other containerization solutions can help reduce scale.<\/li><li><strong>Contract testing<\/strong>. Contract testing tests the communication layer between the microservice and anything that the microservice is communicating with. The goal is to validate that data isn&#8217;t being corrupted or altered as it is being transmitted. This is generally done when the microservice is being added to the organization&#8217;s existing infrastructure, but may need to be repeated if the microservice has been updated, or the systems that it&#8217;s integrated with have been updated.<\/li><li><strong>Integration testing<\/strong>. Microservices are often tied into other, third-party solutions, and it becomes necessary to test to make sure that these other third-party solutions are operating the right way along with the microservice. Integration testing should be performed in full not only when the microservice is introduced but also whenever the solutions are patched or updated.<\/li><li><strong>End-to-end testing<\/strong>. This testing involves testing the entirety of the system from the microservice to the end of the chain. This can involve many different services communicating with each other, but it&#8217;s the best way to ensure that data is maintaining its fidelity throughout and that the correct actions are being taken. Because it is so involved, it takes more time, but it is often what developers need to resort to if they don&#8217;t have accurate logs. Without specific logs, most tests will become end to end tests because there&#8217;s no way of knowing where the issue occurred.<\/li><\/ul>\n\n\n\n<p>Testing <span id=\"urn:enhancement-73c5b9f\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">microservices<\/span> when they are already experiencing issues is often going to relate to trying to track the issue down first, which is where logging and <span id=\"urn:enhancement-dcbe25eb\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/tracing_software\">tracing<\/span> comes in. While <span id=\"urn:enhancement-74385128\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">microservices<\/span> are going to be tested <em>before they<\/em> are operative, they also need to be tested afterward, often within a live environment. A lot of this can be done manually or through a <span id=\"urn:enhancement-e27a170b\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugger\">debugger<\/span>, depending on <a href=\"https:\/\/www.codemotion.com\/magazine\/dev-hub\/backend-dev\/2020-upskilling-enterprise-devops-skills-report-%E2%80%A2\/\" class=\"ek-link\"><span id=\"urn:local-annotation-780089\" class=\"textannotation disambiguated\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/devops\">DevOps<\/span><\/a> <span id=\"urn:enhancement-e739b3dc\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/process_computing\">processes<\/span>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices for debugging microservices<\/h2>\n\n\n\n<p>In development, <span id=\"urn:enhancement-5ef6ed24\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/best_practice\">best practices<\/span> are the perfect way to start. While they don&#8217;t always have to be followed, they provide the easiest and most expedient methods for product <span id=\"urn:enhancement-cacc448\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span>. Here are some of the <span id=\"urn:enhancement-c5ddd325\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/best_practice\">best practices<\/span> for <a href=\"https:\/\/www.slideshare.net\/jbaruch\/troubleshooting-debugging-production-microservices-in-kubernetes-as-presented-in-devoxx-2017\">debugging microservices<\/a> in any environment, whether using <span id=\"urn:enhancement-a461bfd6\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/open_source\">open source<\/span> or commercial <span id=\"urn:enhancement-11fb5817\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/programming_tool\">tools<\/span>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Make Sure Your Logs are Searchable<\/h3>\n\n\n\n<p><span id=\"urn:enhancement-e3c2473f\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">Microservices<\/span> <span id=\"urn:enhancement-91f9f05b\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> really requires high fidelity logs. Make sure that the logs are searchable and that you can change your logging level at will. Being able to change your logging level at will means that you&#8217;ll be able to drill down to issues much faster, rather than having to search through the entirety of the system. Since the system is not a monolith, it can be difficult to trace.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Return Transactional References Back to the Client<\/h3>\n\n\n\n<p>Returning references to the client makes it much easier to track and <span id=\"urn:enhancement-332ce3da\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debug<\/span> any issues as they occur. One of the major problems with microservices architecture is that it&#8217;s extremely challenging to track issues on a higher level. By returning references regularly, a breadcrumb of trails is provided. <span id=\"urn:enhancement-ee23cb11\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/distributed_computing\">Distributed systems<\/span> are notoriously difficult to track; this makes it easier.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Invest in Setting Up a Logging Framework<\/h3>\n\n\n\n<p>Since logging is the most important <span id=\"urn:enhancement-81010ab6\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/component-based_software_engineering\">component<\/span> to <span id=\"urn:enhancement-df2d735c\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> microservices, you may want to invest in a logging framework. A logging framework will give your logs the structure that you might need, so that the log is both easy to read and also <span id=\"urn:enhancement-b194ad59\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/computer_performance\">high performance<\/span>. Consider Node-Loggly, NLog, or <span id=\"urn:enhancement-d975e852\" class=\"textannotation disambiguated wl-creative-work\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/log4j\">Log4J<\/span> if you need to improve your <span id=\"urn:enhancement-bf86f34a\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/stack_abstract_data_type\">stack<\/span> trace tooling.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Consider Monitoring Tools<\/h3>\n\n\n\n<p>Monitoring <span id=\"urn:enhancement-afe572df\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/programming_tool\">tools<\/span> can automate the <span id=\"urn:enhancement-c26713d3\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/process_computing\">process<\/span> of <span id=\"urn:enhancement-77187bad\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> and make it easier for you to identify potential issues, especially performance issues that might otherwise cause problems without outright failing. Monitoring <span id=\"urn:enhancement-ed4262c7\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/programming_tool\">tools<\/span> can cut down on a significant amount of <span id=\"urn:enhancement-4b45d63b\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> time by at least drilling down to the service that is responsible. In software development, more automation is always better.<\/p>\n\n\n\n<p>At its core, microservices <span id=\"urn:enhancement-18ded7a4\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> is going to be about logs and reporting. Whether you upload your logs into a <span id=\"urn:enhancement-dbf63404\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/database\">database<\/span> or use a log framework, you should start to take more detailed, comprehensive logging. These aren&#8217;t the only <span id=\"urn:enhancement-3c0f2ed\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/best_practice\">best practices<\/span> you should be following, but they are the key <span id=\"urn:enhancement-ad5505d5\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/best_practice\">best practices<\/span> you should use. The <span id=\"urn:enhancement-1f771d7\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/goal\">goal<\/span> is to ensure that you have the information you need to trace issues back to the source\u2014and that getting that <span id=\"urn:enhancement-ae49196c\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/data\">data<\/span> isn&#8217;t a <span id=\"urn:enhancement-80b25a83\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/process_computing\">processing<\/span> or <span id=\"urn:enhancement-3e493f0a\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/performance\">performance<\/span> burden that could ultimately tax the <span id=\"urn:enhancement-90082cda\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/system\">system<\/span>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Challenges &amp; changes with microservices<\/h2>\n\n\n\n<p>Foremost, the challenge with <span id=\"urn:enhancement-4d5e75de\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">microservices<\/span> involves sheer volume. With an ever-increasing number of <span id=\"urn:enhancement-4bffe0ad\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">microservices<\/span> available, it can be very difficult for anyone to manage and monitor their <span id=\"urn:enhancement-3d225b18\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/system\">systems<\/span>. This is where <span id=\"urn:enhancement-2204a752\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/programming_tool\">tools<\/span> and automation come in: Without <span id=\"urn:enhancement-f2ee2d82\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/programming_tool\">tools<\/span> and automation, it becomes very difficult for any <span id=\"urn:enhancement-cb8596f4\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developer<\/span> or development team to track down issues.<\/p>\n\n\n\n<p>But there are other issues, too:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Dependencies<\/strong>. Systems often depend on each other, and these increasing integrations can cause services to operate in unpredictable ways. Everything has to be working correctly in a single ecosystem, and when an integration isn&#8217;t working properly, it can be difficult to determine which service is failing. Any time there is an update, things can break, and they can break in potentially unpredictable ways.<\/li><li><strong>Logging distribution<\/strong>. When logging is distributed, it can be hard for developers to even know where they begin debugging a certain problem. With inconsistent logging or logging that&#8217;s in multiple locations, developers have to hunt bugs down throughout the entire environment. Greater consistency with logging is essential to systems that are constantly growing in complexity. Heightened observability, real-time monitoring, and opentracing protocols will help.<\/li><li><strong>Lack of familiarity<\/strong>. Many developers are only now working with microservices on a large scale, and this increased unfamiliarity to the environment can make it much harder for developers to troubleshoot their systems. As developers become more familiar with microservices, this will become less of an issue. Developers may want to go to seminars and learn more about microservices if they don&#8217;t feel confident with it.<\/li><\/ul>\n\n\n\n<p>Much of this simply has to do with the increased <span id=\"urn:enhancement-7c058a10\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/complexity\">complexity<\/span> of the <span id=\"urn:enhancement-379135aa\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/system\">system<\/span>. Preparation is always key. The more preparation <span id=\"urn:enhancement-ce6a4364\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developers<\/span> and development teams do to ensure that they are able to properly manage their <span id=\"urn:enhancement-5f77b649\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microservices_2\">microservices<\/span>, the better\u2014and the more they do to improve their log <span id=\"urn:enhancement-ea8758bd\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/data\">data<\/span>, the more they&#8217;ll thank themselves later.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Logging and crash reporting<\/h2>\n\n\n\n<p>It cannot be emphasized enough that logging and crash reporting is the most important part of troubleshooting and <span id=\"urn:enhancement-8702a94c\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> microservices. Obfuscation and <span id=\"urn:enhancement-9d57ab2b\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/complexity\">complexity<\/span> are the key enemies when <span id=\"urn:enhancement-763dbd26\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> microservice architecture, so the best way to defeat it is to ensure that logs are robust enough, high <span id=\"urn:enhancement-9d48bfd3\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/performance\">performing<\/span>, and also able to be filtered and searched for information.<\/p>\n\n\n\n<p>There are many solutions that provide for better logging and crash reporting. There are solutions that can save logs to <span id=\"urn:enhancement-2e31d946\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/database\">databases<\/span> so that the information can easily be pulled up by <span id=\"urn:enhancement-e89d6ad7\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developers<\/span>. There are also solutions that can monitor services for erratic behavior and report back to the <span id=\"urn:enhancement-7c042c77\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developer<\/span>, sometimes, even more, a crash or other issue has occurred. Either way, the <span id=\"urn:enhancement-d5264e65\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developer<\/span> needs to be able to understand their <span id=\"urn:enhancement-53b09830\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/tool\">tools<\/span> and work well with them.<\/p>\n\n\n\n<p>A frequent mistake with logging is to take very robust logs but not have a way to filter or <span id=\"urn:enhancement-6f0c3798\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/search_engine_technology\">search<\/span> through them. In this way, the logs themselves become a barrier to understanding what&#8217;s going on. On the other end of the spectrum, logs may be very easy to <span id=\"urn:enhancement-13e4495d\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/search_engine_technology\">search<\/span> through, but may not be useful because they aren&#8217;t logging the most important events.<\/p>\n\n\n\n<p>A log framework gives a <span id=\"urn:enhancement-61c471ee\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developer<\/span> a starting point with their logging, so they don&#8217;t have to try to develop their log structure on their own. However, <span id=\"urn:enhancement-80eeb65b\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developers<\/span> will often need to tailor their logs at some point to give them the most relevant <span id=\"urn:enhancement-e99c45f3\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/data\">data<\/span>, as every architecture is going to be unique, and the <span id=\"urn:enhancement-ffec9a02\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/data\">data<\/span> that&#8217;s needed will vary between systems and environments.<\/p>\n\n\n\n<p>When troubleshooting and <span id=\"urn:enhancement-a47e5bc8\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> microservices, <span id=\"urn:enhancement-485ce9f7\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/software_developer\">developers<\/span> should consider whether they&#8217;re getting the information they need from their existing log files, or whether they feel that their log files need to be enhanced. <span id=\"urn:enhancement-e92930db\" class=\"textannotation disambiguated wl-creative-work\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/github\">GitHub<\/span> has a number of solutions, depending on whether someone is looking for a <span id=\"urn:enhancement-193f2929\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/java\">Java<\/span>, <span id=\"urn:enhancement-48091229\" class=\"textannotation disambiguated wl-creative-work\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/microsoft_visual_studio\">Visual Studio<\/span>, or other environment loggers. The <span id=\"urn:enhancement-f4b51ef0\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/debugging\">debugging<\/span> <span id=\"urn:enhancement-e7a04a35\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/process_computing\">process<\/span> may vary depending on <span id=\"urn:enhancement-6a25965e\" class=\"textannotation disambiguated wl-thing\" itemid=\"http:\/\/data.wordlift.io\/wl01770\/entity\/programming_languages\">programming language<\/span> and service.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tracing microservices<\/h3>\n\n\n\n<p><a href=\"https:\/\/lightstep.com\/distributed-tracing\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener nofollow\" class=\"ek-link\">Distributed tracing<\/a> makes it possible to trace requests through services, making it easier to identify the locations of issues as they occur. Tracing has a fairly narrow band, not only does the service have to be identified, but also when the incident took place. Much like space and time coordinates are necessary to capture a moving body, multiple coordinates are needed to capture an issue, especially if that issue is intermittent by nature. Distributed tracing allows for end-to-end visibility and ultimately makes it far easier for developers to trace issues in their system.<\/p>\n\n\n\n<p>Tracing microservices is naturally complex because the issues in the system aren&#8217;t always noticed where they originate. Because errors can be passed through a multitude of systems, they can also be divorced from where they first started. And because of that, tracing microservices can take an exceptional amount of time, especially if they pass through services that aren&#8217;t owned by the organization. But distributed tracing is a scalable and powerful method of tracing throughout a system, to yield better, faster, and more consistent results.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Key Takeaways<\/h2>\n\n\n\n<p>Debugging microservices is always likely to be a challenge for many developers, simply because of the inherent complexity in the task. As companies grow, they are going to use more microservices than ever before, and the number of microservices an entity uses is likely to only increase and rarely decrease. But by following best practices, developers can continue to manage these microservices effectively\u2014even as they scale.<\/p>\n\n\n\n<p>The right processes, procedures, and technology are, in fact, essential for organizations that are going to be scaling their architecture and shifting their needs. For developers who are already struggling with debugging their microservices architecture, investing in additional tools, seminars, and training can help.<\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>From Hoverfly to Lyft Envoy, there are a number of tools available for troubleshooting and debugging microservices. But even with tools in hand, debugging microservices can be a challenge. With so many layers of potential abstraction and complexity, developers have to dig deep into their logs, dependencies, and reporting. Microservices architecture gets only more complicated&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/\">Read more<\/a><\/p>\n","protected":false},"author":98,"featured_media":5393,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[3355],"tags":[4359],"collections":[],"class_list":{"0":"post-5392","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-microservices","8":"tag-testing","9":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Microservices: Troubleshooting &amp; Debugging - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"Testing and debugging microservices may be a challenge: in this article we summarize the best practices and easiest methods of testing microservices.\" \/>\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.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Troubleshooting &amp; Debugging Microservices\" \/>\n<meta property=\"og:description\" content=\"Testing and debugging microservices may be a challenge: in this article we summarize the best practices and easiest methods of testing microservices.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-09T11:09:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-01-05T19:05:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1013\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Laila Mahran\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laila Mahran\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/\"},\"author\":{\"name\":\"Laila Mahran\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/d845be994d3312eeaebf06a4cd90e602\"},\"headline\":\"Troubleshooting &#038; Debugging Microservices\",\"datePublished\":\"2020-06-09T11:09:33+00:00\",\"dateModified\":\"2022-01-05T19:05:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/\"},\"wordCount\":1969,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg\",\"keywords\":[\"Testing\"],\"articleSection\":[\"Microservices\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/\",\"name\":\"Microservices: Troubleshooting & Debugging - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg\",\"datePublished\":\"2020-06-09T11:09:33+00:00\",\"dateModified\":\"2022-01-05T19:05:12+00:00\",\"description\":\"Testing and debugging microservices may be a challenge: in this article we summarize the best practices and easiest methods of testing microservices.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg\",\"width\":1013,\"height\":675,\"caption\":\"debug\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/backend\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Troubleshooting &#038; Debugging Microservices\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/d845be994d3312eeaebf06a4cd90e602\",\"name\":\"Laila Mahran\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/62733b1fe918f8014ed451840a370fee105750ec6e00b58b09b635bd830072e2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/62733b1fe918f8014ed451840a370fee105750ec6e00b58b09b635bd830072e2?s=96&d=mm&r=g\",\"caption\":\"Laila Mahran\"},\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/laila-mahran\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Microservices: Troubleshooting & Debugging - Codemotion Magazine","description":"Testing and debugging microservices may be a challenge: in this article we summarize the best practices and easiest methods of testing microservices.","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.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/","og_locale":"en_US","og_type":"article","og_title":"Troubleshooting & Debugging Microservices","og_description":"Testing and debugging microservices may be a challenge: in this article we summarize the best practices and easiest methods of testing microservices.","og_url":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2020-06-09T11:09:33+00:00","article_modified_time":"2022-01-05T19:05:12+00:00","og_image":[{"width":1013,"height":675,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg","type":"image\/jpeg"}],"author":"Laila Mahran","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Laila Mahran","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/"},"author":{"name":"Laila Mahran","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/d845be994d3312eeaebf06a4cd90e602"},"headline":"Troubleshooting &#038; Debugging Microservices","datePublished":"2020-06-09T11:09:33+00:00","dateModified":"2022-01-05T19:05:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/"},"wordCount":1969,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg","keywords":["Testing"],"articleSection":["Microservices"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/","url":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/","name":"Microservices: Troubleshooting & Debugging - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg","datePublished":"2020-06-09T11:09:33+00:00","dateModified":"2022-01-05T19:05:12+00:00","description":"Testing and debugging microservices may be a challenge: in this article we summarize the best practices and easiest methods of testing microservices.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg","width":1013,"height":675,"caption":"debug"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/microservices\/troubleshooting-debugging-microservices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/backend\/"},{"@type":"ListItem","position":3,"name":"Troubleshooting &#038; Debugging Microservices"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/d845be994d3312eeaebf06a4cd90e602","name":"Laila Mahran","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/62733b1fe918f8014ed451840a370fee105750ec6e00b58b09b635bd830072e2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/62733b1fe918f8014ed451840a370fee105750ec6e00b58b09b635bd830072e2?s=96&d=mm&r=g","caption":"Laila Mahran"},"url":"https:\/\/www.codemotion.com\/magazine\/author\/laila-mahran\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-600x400.jpeg","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-600x600.jpeg","author_info":{"display_name":"Laila Mahran","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/laila-mahran\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg",1013,675,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-150x150.jpeg",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-300x200.jpeg",300,200,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-768x512.jpeg",768,512,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg",1013,675,false],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg",1013,675,false],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg",1013,675,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843.jpeg",100,67,false],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-180x128.jpeg",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-896x504.jpeg",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-400x225.jpeg",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-600x400.jpeg",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2020\/06\/pexels-photo-2756843-600x600.jpeg",600,600,true]},"uagb_author_info":{"display_name":"Laila Mahran","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/laila-mahran\/"},"uagb_comment_info":0,"uagb_excerpt":"From Hoverfly to Lyft Envoy, there are a number of tools available for troubleshooting and debugging microservices. But even with tools in hand, debugging microservices can be a challenge. With so many layers of potential abstraction and complexity, developers have to dig deep into their logs, dependencies, and reporting. Microservices architecture gets only more complicated&#8230;&hellip;","lang":"en","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/5392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/98"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=5392"}],"version-history":[{"count":4,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/5392\/revisions"}],"predecessor-version":[{"id":5460,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/5392\/revisions\/5460"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/5393"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=5392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=5392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=5392"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=5392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}