{"id":4976,"date":"2018-04-09T12:53:25","date_gmt":"2018-04-09T19:53:25","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4976"},"modified":"2023-06-13T05:26:43","modified_gmt":"2023-06-13T12:26:43","slug":"response-time-observability-with-the-java-sdk","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/response-time-observability-with-the-java-sdk\/","title":{"rendered":"Observabilidade do tempo de resposta com o Java SDK"},"content":{"rendered":"<p>Os blogs anteriores deram uma melhor compreens\u00e3o de como nossa abordagem para <strong>Observabilidade em tempo real<\/strong> (RTO) em geral ajuda a solucionar problemas de sistemas distribu\u00eddos e por que escolhemos o <a href=\"https:\/\/opentracing.io\/\">OpenTracing<\/a> como base e API p\u00fablica. Se ainda n\u00e3o o fez, voc\u00ea pode dar uma olhada nesses blogs <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/building-an-observation-deck\/\">aqui<\/a>\u00a0e <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/how-opentracing-became-important\/\">aqui<\/a>.<\/p>\n<p>Neste blog, voc\u00ea aprender\u00e1 como o RTO funciona com o <strong>Java SDK<\/strong> e como voc\u00ea pode us\u00e1-lo hoje para seu benef\u00edcio.<\/p>\n<h2>Primeiros passos<\/h2>\n<p>Assim que a vers\u00e3o do Java SDK 2.6.0 (ou posterior) for lan\u00e7ada, voc\u00ea poder\u00e1 obt\u00ea-la da maneira usual, conforme descrito <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/sdk\/java\/start-using-sdk.html\">aqui<\/a>. Como essa vers\u00e3o est\u00e1 agora em um estado de lan\u00e7amento pr\u00e9vio, voc\u00ea precisa acess\u00e1-la em nosso pr\u00f3prio reposit\u00f3rio maven. Por meio de um maven <code>pom.xml<\/code>:<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;dependencies&gt;\r\n  &lt;dependency&gt;\r\n\t&lt;groupId&gt;com.couchbase.client&lt;\/groupId&gt;\r\n\t&lt;artifactId&gt;java-client&lt;\/artifactId&gt;\r\n\t&lt;version&gt;2.6.0-dp1&lt;\/version&gt;\r\n  &lt;\/dependency&gt;\r\n&lt;\/dependencies&gt;\r\n\r\n&lt;repositories&gt;\r\n  &lt;repository&gt;\r\n\t&lt;id&gt;cb-pre&lt;\/id&gt;\r\n\t&lt;name&gt;Couchbase Prerelease Repo&lt;\/name&gt;\r\n\t&lt;url&gt;https:\/\/files.couchbase.com\/maven2&lt;\/url&gt;\r\n  &lt;\/repository&gt;\r\n&lt;\/repositories&gt;<\/pre>\n<p>A \u00fanica diferen\u00e7a que voc\u00ea notar\u00e1 \u00e9 uma nova depend\u00eancia chamada <code>API de rastreamento<\/code> sobre o qual falaremos daqui a pouco. Como esta n\u00e3o \u00e9 uma vers\u00e3o principal, todo o c\u00f3digo anterior funcionar\u00e1 como antes e voc\u00ea se beneficiar\u00e1 dos aprimoramentos imediatamente.<\/p>\n<p>Se precisar personalizar o pr\u00f3prio rastreador ou algumas de suas configura\u00e7\u00f5es, voc\u00ea poder\u00e1 fazer isso por meio do comando <code>CouchbaseEnvironment.Builder<\/code> como em todas as outras configura\u00e7\u00f5es. Aqui est\u00e1 um exemplo de como personalizar nosso rastreador padr\u00e3o para reduzir o intervalo de tempo em que as informa\u00e7\u00f5es s\u00e3o registradas:<\/p>\n<pre class=\"lang:java decode:true\">Tracer tracer = ThresholdLogTracer.create(ThresholdLogReporter.builder()\r\n  .logInterval(10, TimeUnit.SECONDS) \/\/ log every 10 seconds\r\n  .build());\r\n\r\nCouchbaseEnvironment env = DefaultCouchbaseEnvironment.builder()\r\n  .tracer(tracer)\r\n  .build();<\/pre>\n<h2>Explica\u00e7\u00e3o sobre o registro em log de limite<\/h2>\n<p>Para nos familiarizarmos com o rastreador de registro de limiares (que est\u00e1 ativado por padr\u00e3o), vamos personalizar um pouco suas configura\u00e7\u00f5es e reduzir os limiares a um n\u00edvel t\u00e3o baixo que praticamente todas as solicita\u00e7\u00f5es e respostas ser\u00e3o cobertas. Obviamente, essa n\u00e3o \u00e9 uma boa ideia para a produ\u00e7\u00e3o, mas nos ajudar\u00e1 a chegar rapidamente \u00e0 sa\u00edda de registro desejada e a afirmar sua funcionalidade.<\/p>\n<p>Aplique a seguinte configura\u00e7\u00e3o, conforme descrito acima:<\/p>\n<pre class=\"lang:java decode:true\">Tracer tracer = ThresholdLogTracer.create(ThresholdLogReporter.builder()\r\n  .kvThreshold(1) \/\/ 1 micros\r\n  .logInterval(1, TimeUnit.SECONDS) \/\/ log every second\r\n  .sampleSize(Integer.MAX_VALUE)\r\n  .pretty(true) \/\/ pretty print the json output in the logs\r\n  .build());<\/pre>\n<p>Isso definir\u00e1 nosso limite para opera\u00e7\u00f5es de chave\/valor para um microssegundo, registrar\u00e1 as opera\u00e7\u00f5es encontradas a cada segundo e definir\u00e1 o tamanho da amostra para um valor muito grande para que tudo seja registrado. Por padr\u00e3o, o registro ser\u00e1 feito a cada minuto (se algo for encontrado) e apenas uma amostra das 10 opera\u00e7\u00f5es mais lentas. O limite padr\u00e3o para a opera\u00e7\u00e3o de chave\/valor \u00e9 de 500 milissegundos.<\/p>\n<p>Com essas configura\u00e7\u00f5es em vigor, estamos prontos para executar algumas opera\u00e7\u00f5es. Sinta-se \u00e0 vontade para ajustar a configura\u00e7\u00e3o a seguir para que ela aponte para o seu servidor e aplique as credenciais apropriadas:<\/p>\n<pre class=\"lang:java decode:true\">\/\/ Connect\r\nCouchbaseEnvironment env = DefaultCouchbaseEnvironment.builder()\r\n    .tracer(tracer)\r\n    .build();\r\nCluster cluster = CouchbaseCluster.create(env, \"127.0.0.1\");\r\n\r\nBucket bucket = cluster.openBucket(\"travel-sample\");\r\n\r\n\/\/ Load a couple of docs and write them back\r\nfor(int i = 0; i &lt; 5; i++) {\r\n  JsonDocument doc = bucket.get(\"airline_1\" + i);\r\n  if (doc != null) {\r\n    bucket.upsert(doc);\r\n  }\r\n}\r\n\r\nThread.sleep(TimeUnit.MINUTES.toMillis(1));<\/pre>\n<p>Neste c\u00f3digo simples, estamos lendo alguns documentos do <code>amostra de viagem<\/code> e, se encontrado, escreva-o de volta com um <code>upsert<\/code>. Isso nos permite, de forma simples, realizar opera\u00e7\u00f5es de leitura e grava\u00e7\u00e3o. Quando o c\u00f3digo for executado, voc\u00ea ver\u00e1 uma sa\u00edda (semelhante) nos registros:<\/p>\n<pre class=\"lang:default decode:true\">Apr 04, 2018 9:42:57 AM com.couchbase.client.core.tracing.ThresholdLogReporter logOverThreshold\r\nWARNING: Operations over threshold: [ {\r\n  \"top\" : [ {\r\n    \"server_us\" : 8,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x6\",\r\n    \"dispatch_us\" : 315,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 576\r\n  }, {\r\n    \"server_us\" : 8,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x5\",\r\n    \"dispatch_us\" : 319,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 599\r\n  }, {\r\n    \"server_us\" : 8,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x4\",\r\n    \"dispatch_us\" : 332,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 632\r\n  }, {\r\n    \"server_us\" : 11,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x3\",\r\n    \"dispatch_us\" : 392,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 762\r\n  }, {\r\n    \"server_us\" : 23,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x1\",\r\n    \"decode_us\" : 9579,\r\n    \"dispatch_us\" : 947,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 16533\r\n  }, {\r\n    \"server_us\" : 56,\r\n    \"encode_us\" : 12296,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"upsert:0x2\",\r\n    \"dispatch_us\" : 1280,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 20935\r\n  } ],\r\n  \"service\" : \"kv\",\r\n  \"count\" : 6\r\n} ]<\/pre>\n<p>This is our threshold log reporter in action! For each service (only `kv` based on this workload) it will show you the total amount of recorded ops (through `count`) and give you the top slowest ops sorted by their latency. Since only `airline_10` exists in the bucket you see 5 document fetches but only one mutation happening.<\/p>\n<p>Vamos dar uma olhada em uma opera\u00e7\u00e3o espec\u00edfica e discutir cada campo com um pouco mais de detalhes:<\/p>\n<pre class=\"lang:js decode:true\">{\r\n\t\"server_us\" : 23,\r\n\t\"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n\t\"local_address\" : \"127.0.0.1:55011\",\r\n\t\"operation_id\" : \"get:0x1\",\r\n\t\"decode_us\" : 1203,\r\n\t\"dispatch_us\" : 947,\r\n\t\"remote_address\" : \"127.0.0.1:11210\",\r\n\t\"total_us\" : 1525\r\n}<\/pre>\n<p>Ele nos diz o seguinte:<\/p>\n<ul>\n<li><code>total_us<\/code>: O tempo total que levou para executar a opera\u00e7\u00e3o completa: aqui, cerca de 1,5 milissegundos<\/li>\n<li><code>server_us<\/code>: O servidor informou que seu trabalho realizado levou 23 microssegundos (isso n\u00e3o inclui o tempo de rede ou o tempo no buffer antes de ser coletado no cluster)<\/li>\n<li><code>decodificar_us<\/code>: A decodifica\u00e7\u00e3o da resposta levou 1,2 milissegundos para o cliente<\/li>\n<li><code>dispatch_us<\/code>: O tempo em que o cliente enviou a solicita\u00e7\u00e3o e obteve a resposta levou cerca de 1 milissegundo.<\/li>\n<li><code>endere\u00e7o_local<\/code>: O soquete local usado para essa opera\u00e7\u00e3o.<\/li>\n<li><code>endere\u00e7o_remoto<\/code>: O soquete remoto no servidor usado para essa opera\u00e7\u00e3o. \u00datil para descobrir qual n\u00f3 foi afetado.<\/li>\n<li><code>operation_id<\/code>: Uma combina\u00e7\u00e3o de tipo de opera\u00e7\u00e3o e id (nesse caso, o valor opaco), \u00fatil para diagnosticar e solucionar problemas em combina\u00e7\u00e3o com o <code>local_id<\/code>.<\/li>\n<li><code>local_id<\/code>: Com o Server 5.5 e posterior, esse ID \u00e9 negociado com o servidor e pode ser usado para correlacionar informa\u00e7\u00f5es de registro em ambos os lados de forma mais simples.<\/li>\n<\/ul>\n<p>Observe que o formato exato desse registro ainda est\u00e1 um pouco em fluxo e mudar\u00e1 entre as vers\u00f5es dp1 e beta\/GA.<\/p>\n<p>\u00c9 poss\u00edvel ver que, se os limites forem definidos da maneira correta com base nos requisitos de produ\u00e7\u00e3o, sem muito esfor\u00e7o as opera\u00e7\u00f5es lentas poder\u00e3o ser registradas e identificadas com mais facilidade do que antes.<\/p>\n<p>No entanto, h\u00e1 uma pe\u00e7a faltando no quebra-cabe\u00e7a que abordaremos a seguir: como isso se relaciona com o temido <code>TimeoutException<\/code>.<\/p>\n<h2>Visibilidade do tempo limite<\/h2>\n<p>Anteriormente, quando uma opera\u00e7\u00e3o demorava mais do que o tempo limite especificado permitia, uma mensagem <code>TimeoutException<\/code> \u00e9 lan\u00e7ado. Em geral, tem a seguinte apar\u00eancia:<\/p>\n<pre class=\"lang:java decode:true\">Exception in thread \"main\" java.lang.RuntimeException: java.util.concurrent.TimeoutException\r\n\tat com.couchbase.client.java.util.Blocking.blockForSingle(Blocking.java:77)\r\n\tat com.couchbase.client.java.CouchbaseBucket.get(CouchbaseBucket.java:131)\r\n\tat Main.main(Main.java:34)\r\nCaused by: java.util.concurrent.TimeoutException\r\n\t... 3 more<\/pre>\n<p>Observando esse rastreamento de pilha, voc\u00ea pode deduzir algumas coisas, como, por exemplo, que a opera\u00e7\u00e3o de tempo limite foi uma <code>ObterSolicita\u00e7\u00e3o<\/code>. Se, em tempo de execu\u00e7\u00e3o, voc\u00ea precisar de mais informa\u00e7\u00f5es, costumava envolv\u00ea-las com base em seu pr\u00f3prio contexto. Por exemplo:<\/p>\n<pre class=\"lang:java decode:true\">try {\r\n    bucket.get(\"foo\", 1, TimeUnit.MICROSECONDS);\r\n} catch (RuntimeException ex) {\r\n    if (ex.getCause() instanceof TimeoutException) {\r\n        throw new RuntimeException(new TimeoutException(\"id: foo, timeout: 1ms\"));\r\n    }\r\n}<\/pre>\n<p>Isso \u00e9 muito tedioso e ainda n\u00e3o lhe d\u00e1 uma vis\u00e3o do comportamento interno conforme necess\u00e1rio.<\/p>\n<p>Para remediar essa situa\u00e7\u00e3o, o novo cliente faz (aproximadamente) a coisa acima para voc\u00ea de forma transparente, mas acrescenta ainda mais informa\u00e7\u00f5es sem que voc\u00ea precise fazer nada. O mesmo tempo limite no novo SDK ter\u00e1 a seguinte apar\u00eancia:<\/p>\n<pre class=\"lang:java decode:true\">Exception in thread \"main\" java.lang.RuntimeException: java.util.concurrent.TimeoutException: localId: 2C12AAA6637FB4FF\/00000000147B092F, opId: 0x1, local: 127.0.0.1:60389, remote: 127.0.0.1:11210, timeout: 1000us\r\n\tat rx.exceptions.Exceptions.propagate(Exceptions.java:57)\r\n\tat rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:463)\r\n\tat rx.observables.BlockingObservable.singleOrDefault(BlockingObservable.java:372)\r\n\tat com.couchbase.client.java.CouchbaseBucket.get(CouchbaseBucket.java:131)\r\n\tat SimpleReadWrite.main(SimpleReadWrite.java:64)\r\nCaused by: java.util.concurrent.TimeoutException: localId: 2C12AAA6637FB4FF\/00000000147B092F, opId: 0x1, local: 127.0.0.1:60389, remote: 127.0.0.1:11210, timeout: 1000us\r\n\tat com.couchbase.client.java.bucket.api.Utils$1.call(Utils.java:75)\r\n\tat com.couchbase.client.java.bucket.api.Utils$1.call(Utils.java:71)\r\n\t*snip*<\/pre>\n<p>Talvez voc\u00ea se lembre de alguns dos campos da descri\u00e7\u00e3o do registro acima, e isso \u00e9 intencional. Agora, o pr\u00f3prio tempo limite fornece informa\u00e7\u00f5es valiosas, como os soquetes locais e remotos, o ID da opera\u00e7\u00e3o, bem como o tempo limite definido e o ID local usado para solu\u00e7\u00e3o de problemas. Sem esfor\u00e7o extra, voc\u00ea pode pegar essas informa\u00e7\u00f5es e correlacion\u00e1-las com as opera\u00e7\u00f5es mais lentas no log de limite.<\/p>\n<p>O <code>TimeoutException<\/code> agora fornece mais informa\u00e7\u00f5es sobre \"o que\" deu errado e, em seguida, voc\u00ea pode examinar o registro para descobrir \"por que\" ele estava lento.<\/p>\n<h2>Troca do Tracer<\/h2>\n<p>Por fim, h\u00e1 mais um recurso incorporado a isso. Conforme mencionado anteriormente, o novo <code>API de rastreamento<\/code> vem inclu\u00eddo por um motivo. Ele fornece apenas uma descri\u00e7\u00e3o da interface, mas isso \u00e9 suficiente para abrir todas essas m\u00e9tricas e estat\u00edsticas para todo um universo de implementa\u00e7\u00f5es de rastreamento compat\u00edveis com o OpenTracing. Voc\u00ea pode escolher uma das implementa\u00e7\u00f5es de c\u00f3digo aberto dispon\u00edveis, como <a href=\"https:\/\/jaegertracing.io\">jaeger<\/a>Voc\u00ea pode usar um fornecido pelos fornecedores de APM ou at\u00e9 mesmo criar o seu pr\u00f3prio. O ponto principal aqui \u00e9 que o SDK usa uma interface aberta e padronizada \u00e0 qual voc\u00ea pode conectar outras coisas, incluindo um Tracer b\u00e1sico e \u00fatil.<\/p>\n<p>Como exemplo, veja como voc\u00ea pode trocar o nosso rastreador padr\u00e3o por um do jaeger:<\/p>\n<pre class=\"lang:java decode:true\">Tracer tracer = new Configuration(\r\n  \"my_app\",\r\n  new Configuration.SamplerConfiguration(\"const\", 1),\r\n  new Configuration.ReporterConfiguration(\r\n    true, \"localhost\", 5775, 1000, 10000)\r\n).getTracer();\r\n\r\nCouchbaseEnvironment env = DefaultCouchbaseEnvironment.builder()\r\n  .tracer(tracer)\r\n  .build();<\/pre>\n<p>Sem nenhuma altera\u00e7\u00e3o no aplicativo real, todos os rastreamentos e intervalos agora ser\u00e3o alimentados em um mecanismo de rastreamento distribu\u00eddo, no qual voc\u00ea tem interfaces de usu\u00e1rio agrad\u00e1veis para visualizar o comportamento do cen\u00e1rio do aplicativo.<\/p>\n<p>Uma opera\u00e7\u00e3o de obten\u00e7\u00e3o, como no exemplo acima, pode ter a seguinte apar\u00eancia na p\u00e1gina de vis\u00e3o geral do jaeger:<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4977 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56-1024x473.png\" alt=\"\" width=\"900\" height=\"416\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56-1024x473.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56-300x139.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56-768x355.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56-1536x710.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56-20x9.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56-1320x610.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56.png 1994w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p>Ao analisar o tra\u00e7o espec\u00edfico, os tempos individuais do span e do sub-span se tornam vis\u00edveis:<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.13.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4979 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.13-1024x287.png\" alt=\"\" width=\"900\" height=\"252\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.13-1024x287.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.13-300x84.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.13-768x215.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.13-1536x430.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.13-2048x574.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.13-20x6.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.13-1320x370.png 1320w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p>Cada intervalo tamb\u00e9m cont\u00e9m tags que o SDK anexa para filtragem e an\u00e1lise avan\u00e7adas:<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.56.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4978 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.56-1024x510.png\" alt=\"\" width=\"900\" height=\"448\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.56-1024x510.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.56-300x149.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.56-768x382.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.56-1536x765.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.56-2048x1019.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.56-20x10.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-09-at-09.13.56-1320x657.png 1320w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<h2>Resumo<\/h2>\n<p>Aprimorando nossos SDKs com o Response Time Observability, agora podemos fornecer informa\u00e7\u00f5es mais detalhadas sobre o que e por que algo n\u00e3o est\u00e1 funcionando\/desempenhando conforme o esperado. Contando com o OpenTracing como interface, al\u00e9m disso, podemos torn\u00e1-lo independente do fornecedor e abrir a possibilidade de conectar a ferramenta APM\/rastreamento compat\u00edvel de sua prefer\u00eancia, se houver necessidade.<\/p>","protected":false},"excerpt":{"rendered":"<p>Previous blogs gave a better understanding on how our approach to Real Time Observability (RTO) in general helps troubleshooting distributed systems and why we chose OpenTracing as a foundation and public API. If you haven&#8217;t already, you can check out [&hellip;]<\/p>","protected":false},"author":19,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1818,2201],"tags":[2258,2182,1281,2202,2203],"ppma_author":[8987],"class_list":["post-4976","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-java","category-tools-sdks","tag-5-5","tag-devbuild","tag-logging","tag-opentracing","tag-timing"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Response Time Observability with the Java SDK - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Learn how RTO works with the Java SDK. We can have a deeper insight into what and why something is not working\/performing as expected.\" \/>\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.couchbase.com\/blog\/pt\/response-time-observability-with-the-java-sdk\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Response Time Observability with the Java SDK\" \/>\n<meta property=\"og:description\" content=\"Learn how RTO works with the Java SDK. We can have a deeper insight into what and why something is not working\/performing as expected.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/response-time-observability-with-the-java-sdk\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-04-09T19:53:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-13T12:26:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56-1024x473.png\" \/>\n<meta name=\"author\" content=\"Michael Nitschinger\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@daschl\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michael Nitschinger\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/\"},\"author\":{\"name\":\"Michael Nitschinger\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d\"},\"headline\":\"Response Time Observability with the Java SDK\",\"datePublished\":\"2018-04-09T19:53:25+00:00\",\"dateModified\":\"2023-06-13T12:26:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/\"},\"wordCount\":1176,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"5.5\",\"devbuild\",\"Logging\",\"opentracing\",\"timing\"],\"articleSection\":[\"Couchbase Server\",\"Java\",\"Tools &amp; SDKs\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/\",\"name\":\"Response Time Observability with the Java SDK - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-04-09T19:53:25+00:00\",\"dateModified\":\"2023-06-13T12:26:43+00:00\",\"description\":\"Learn how RTO works with the Java SDK. We can have a deeper insight into what and why something is not working\/performing as expected.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Response Time Observability with the Java SDK\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d\",\"name\":\"Michael Nitschinger\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/95e178617974d46e3b02dd1754a3f60b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g\",\"caption\":\"Michael Nitschinger\"},\"description\":\"Michael Nitschinger works as a Principal Software Engineer at Couchbase. He is the architect and maintainer of the Couchbase Java SDK, one of the first completely reactive database drivers on the JVM. He also authored and maintains the Couchbase Spark Connector. Michael is active in the open source community, a contributor to various other projects like RxJava and Netty.\",\"sameAs\":[\"https:\/\/nitschinger.at\",\"https:\/\/x.com\/daschl\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/michael-nitschinger\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Response Time Observability with the Java SDK - The Couchbase Blog","description":"Learn how RTO works with the Java SDK. We can have a deeper insight into what and why something is not working\/performing as expected.","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.couchbase.com\/blog\/pt\/response-time-observability-with-the-java-sdk\/","og_locale":"pt_BR","og_type":"article","og_title":"Response Time Observability with the Java SDK","og_description":"Learn how RTO works with the Java SDK. We can have a deeper insight into what and why something is not working\/performing as expected.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/response-time-observability-with-the-java-sdk\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-04-09T19:53:25+00:00","article_modified_time":"2023-06-13T12:26:43+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-09-at-09.12.56-1024x473.png","type":"","width":"","height":""}],"author":"Michael Nitschinger","twitter_card":"summary_large_image","twitter_creator":"@daschl","twitter_misc":{"Written by":"Michael Nitschinger","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/"},"author":{"name":"Michael Nitschinger","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d"},"headline":"Response Time Observability with the Java SDK","datePublished":"2018-04-09T19:53:25+00:00","dateModified":"2023-06-13T12:26:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/"},"wordCount":1176,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["5.5","devbuild","Logging","opentracing","timing"],"articleSection":["Couchbase Server","Java","Tools &amp; SDKs"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/","url":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/","name":"Response Time Observability with the Java SDK - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-04-09T19:53:25+00:00","dateModified":"2023-06-13T12:26:43+00:00","description":"Learn how RTO works with the Java SDK. We can have a deeper insight into what and why something is not working\/performing as expected.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Response Time Observability with the Java SDK"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d","name":"Michael Nitschinger","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/95e178617974d46e3b02dd1754a3f60b","url":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","caption":"Michael Nitschinger"},"description":"Michael Nitschinger trabalha como engenheiro de software principal na Couchbase. Ele \u00e9 o arquiteto e mantenedor do Couchbase Java SDK, um dos primeiros drivers de banco de dados totalmente reativos na JVM. Ele tamb\u00e9m \u00e9 o autor e mantenedor do Couchbase Spark Connector. Michael participa ativamente da comunidade de c\u00f3digo aberto e contribui para v\u00e1rios outros projetos, como RxJava e Netty.","sameAs":["https:\/\/nitschinger.at","https:\/\/x.com\/daschl"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/michael-nitschinger\/"}]}},"authors":[{"term_id":8987,"user_id":19,"is_guest":0,"slug":"michael-nitschinger","display_name":"Michael Nitschinger","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","first_name":"Michael","last_name":"Nitschinger, Principal Software Engineer, Couchbase","user_url":"https:\/\/nitschinger.at","author_category":"","description":"Michael Nitschinger trabalha como engenheiro de software principal na Couchbase. Ele \u00e9 o arquiteto e mantenedor do Couchbase Java SDK, um dos primeiros drivers de banco de dados totalmente reativos na JVM. Ele tamb\u00e9m \u00e9 o autor e mantenedor do Couchbase Spark Connector. Michael participa ativamente da comunidade de c\u00f3digo aberto e contribui para v\u00e1rios outros projetos, como RxJava e Netty."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=4976"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4976\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=4976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=4976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=4976"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=4976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}