{"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\/es\/response-time-observability-with-the-java-sdk\/","title":{"rendered":"Observabilidad del tiempo de respuesta con el SDK de Java"},"content":{"rendered":"<p>En blogs anteriores se explicaba mejor nuestro enfoque de la <strong>Observabilidad en tiempo real<\/strong> (RTO) en general ayuda a solucionar los problemas de los sistemas distribuidos y por qu\u00e9 elegimos <a href=\"https:\/\/opentracing.io\/\">OpenTracing<\/a> como base y API p\u00fablica. Si a\u00fan no lo ha hecho, puede consultar estos blogs <a href=\"https:\/\/www.couchbase.com\/blog\/es\/building-an-observation-deck\/\">aqu\u00ed<\/a>\u00a0y <a href=\"https:\/\/www.couchbase.com\/blog\/es\/how-opentracing-became-important\/\">aqu\u00ed<\/a>.<\/p>\n<p>En este blog, aprender\u00e1 c\u00f3mo funciona RTO con el <strong>SDK de Java<\/strong> y c\u00f3mo puede utilizarlo hoy en su beneficio.<\/p>\n<h2>Primeros pasos<\/h2>\n<p>En cuanto se publique la versi\u00f3n 2.6.0 (o posterior) del SDK de Java, podr\u00e1 obtenerla por los medios habituales descritos a continuaci\u00f3n <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/sdk\/java\/start-using-sdk.html\">aqu\u00ed<\/a>. Dado que esta versi\u00f3n se encuentra ahora mismo en estado de versi\u00f3n preliminar, es necesario acceder a ella desde nuestro propio repositorio maven. A trav\u00e9s de un 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>La \u00fanica diferencia que notar\u00e1 es una nueva dependencia llamada <code>opentracing-api<\/code> de la que hablaremos m\u00e1s adelante. Dado que no se trata de una versi\u00f3n mayor, todo el c\u00f3digo anterior funcionar\u00e1 como antes y te beneficiar\u00e1s de las mejoras de inmediato.<\/p>\n<p>Si necesita personalizar el propio trazador o parte de su configuraci\u00f3n, puede hacerlo a trav\u00e9s de la funci\u00f3n <code>CouchbaseEntorno.Builder<\/code> como con el resto de ajustes. Este es un ejemplo de c\u00f3mo personalizar nuestro trazador predeterminado para reducir el intervalo de tiempo en el que se registra la informaci\u00f3n:<\/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>Explicaci\u00f3n del registro de umbrales<\/h2>\n<p>Para mojarnos los pies con el rastreador de registro de umbrales (que est\u00e1 activado por defecto) vamos a personalizar un poco su configuraci\u00f3n y bajar los umbrales tan bajos que pr\u00e1cticamente todas las peticiones y respuestas est\u00e9n cubiertas. Obviamente esto no es una buena idea para producci\u00f3n, pero nos ayudar\u00e1 a llegar a la salida de registro deseada r\u00e1pidamente y afirmar su funcionalidad.<\/p>\n<p>Aplique la siguiente configuraci\u00f3n como se ha indicado anteriormente:<\/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>Esto fijar\u00e1 nuestro umbral para las operaciones clave\/valor en un microsegundo, registrar\u00e1 las operaciones encontradas cada segundo y fijar\u00e1 el tama\u00f1o de la muestra en un valor muy grande para que se registre todo. Por defecto, se registrar\u00e1 cada minuto (si se encuentra algo) y s\u00f3lo se muestrear\u00e1n las 10 operaciones m\u00e1s lentas. El umbral por defecto para las operaciones clave\/valor es de 500 milisegundos.<\/p>\n<p>Con estas configuraciones en su lugar estamos listos para ejecutar algunas operaciones. Si\u00e9ntase libre de ajustar la siguiente configuraci\u00f3n para que apunte a su servidor y aplique las credenciales apropiadas:<\/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>En este sencillo c\u00f3digo estamos leyendo algunos documentos de la base de datos <code>viaje-muestra<\/code> y si lo encuentra lo escribe de vuelta con un <code>upsert<\/code>. Esto nos permite de forma sencilla realizar operaciones tanto de lectura como de escritura. Una vez ejecutado el c\u00f3digo, ver\u00e1s una salida (similar) en los logs:<\/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>Veamos una operaci\u00f3n concreta y hablemos de cada campo con un poco m\u00e1s de detalle:<\/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>Nos dice lo siguiente:<\/p>\n<ul>\n<li><code>total_us<\/code>: El tiempo total que se tard\u00f3 en realizar la operaci\u00f3n completa: aqu\u00ed alrededor de 1,5 milisegundos.<\/li>\n<li><code>servidor_us<\/code>: El servidor inform\u00f3 de que su trabajo realizado tard\u00f3 23 microsegundos (esto no incluye el tiempo de red ni el tiempo en el b\u00fafer antes de ser recogido en el cl\u00faster).<\/li>\n<li><code>decodificar_nos<\/code>: El cliente tard\u00f3 1,2 milisegundos en descodificar la respuesta.<\/li>\n<li><code>enviar_nos<\/code>: El tiempo en que el cliente envi\u00f3 la solicitud y obtuvo la respuesta fue de aproximadamente 1 milisegundo.<\/li>\n<li><code>direcci\u00f3n_local<\/code>: El socket local utilizado para esta operaci\u00f3n.<\/li>\n<li><code>direcci\u00f3n_remota<\/code>: El socket remoto en el servidor utilizado para esta operaci\u00f3n. \u00datil para averiguar qu\u00e9 nodo est\u00e1 afectado.<\/li>\n<li><code>operation_id<\/code>: Una combinaci\u00f3n de tipo de operaci\u00f3n e id (en este caso el valor opaco), \u00fatil para diagnosticar y solucionar problemas en combinaci\u00f3n con la funci\u00f3n <code>local_id<\/code>.<\/li>\n<li><code>local_id<\/code>: Con Server 5.5 y posteriores, este id se negocia con el servidor y se puede utilizar para correlacionar la informaci\u00f3n de registro en ambos lados de una manera m\u00e1s sencilla.<\/li>\n<\/ul>\n<p>Tenga en cuenta que el formato exacto de este registro es todav\u00eda un poco en flujo y va a cambiar entre dp1 y beta \/ GA versiones.<\/p>\n<p>Se puede ver que si los umbrales se fijan de la forma correcta en funci\u00f3n de los requisitos de producci\u00f3n, sin mucho esfuerzo se pueden registrar y localizar las operaciones lentas con m\u00e1s facilidad que antes.<\/p>\n<p>Sin embargo, hay una pieza que falta en el rompecabezas y que vamos a tratar a continuaci\u00f3n: c\u00f3mo se relaciona esto con el temido <code>TimeoutException<\/code>.<\/p>\n<h2>Tiempo de espera Visibilidad<\/h2>\n<p>Anteriormente, cuando una operaci\u00f3n tardaba m\u00e1s de lo que permit\u00eda el tiempo de espera especificado, aparec\u00eda un <code>TimeoutException<\/code> se lanza. Normalmente tiene este aspecto:<\/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>Mirando este stack trace se pueden inferir un par de cosas, por ejemplo que la operaci\u00f3n timed out era un <code>GetRequest<\/code>. Si en tiempo de ejecuci\u00f3n necesitas m\u00e1s informaci\u00f3n, sol\u00edas tener que envolverla bas\u00e1ndote en tu propio contexto. Por ejemplo:<\/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>Esto es muy tedioso y todav\u00eda no le da una idea del comportamiento interno seg\u00fan sea necesario.<\/p>\n<p>Para remediar esta situaci\u00f3n, el nuevo cliente hace (m\u00e1s o menos) lo anterior por ti de forma transparente, pero a\u00f1ade a\u00fan m\u00e1s informaci\u00f3n sin que tengas que hacer nada. El mismo tiempo de espera en el nuevo SDK tendr\u00e1 el siguiente aspecto:<\/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>Puede que recuerdes algunos de los campos de la descripci\u00f3n del registro anterior, y eso es lo que se pretende. Ahora el propio tiempo de espera te proporciona informaci\u00f3n valiosa como los sockets local y remoto, el id de la operaci\u00f3n as\u00ed como el tiempo de espera establecido y el ID local utilizado para la resoluci\u00f3n de problemas. Sin esfuerzo extra puedes tomar esta informaci\u00f3n y correlacionarla con las operaciones m\u00e1s lentas en el registro de umbrales.<\/p>\n<p>En <code>TimeoutException<\/code> ahora le proporciona m\u00e1s informaci\u00f3n sobre \"qu\u00e9\" fue mal y entonces usted puede ir a mirar el registro para averiguar \"por qu\u00e9\" era lento.<\/p>\n<h2>Cambiar el Tracer<\/h2>\n<p>Por \u00faltimo, hay una funci\u00f3n m\u00e1s. Como ya se ha dicho, el nuevo <code>opentracing-api<\/code> viene incluido por una raz\u00f3n. S\u00f3lo proporciona una descripci\u00f3n de la interfaz, pero esto es suficiente para abrir todas estas m\u00e9tricas y estad\u00edsticas a todo un universo de implementaciones de trazadores compatibles con OpenTracing. Puedes elegir uno de los disponibles en c\u00f3digo abierto como <a href=\"https:\/\/jaegertracing.io\">jaeger<\/a>Utiliza uno proporcionado por los proveedores de APM o incluso escribe el tuyo propio. El punto clave aqu\u00ed es que el SDK utiliza una interfaz abierta y estandarizada a la que se pueden conectar otras cosas, incluyendo un Tracer \u00fatil y b\u00e1sico.<\/p>\n<p>Como ejemplo, aqu\u00ed est\u00e1 c\u00f3mo usted puede intercambiar en nuestro trazador por defecto con uno de 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>Sin ning\u00fan cambio en la aplicaci\u00f3n real, todas las trazas y barridos se introducir\u00e1n ahora en un motor de trazado distribuido en el que dispondr\u00e1s de bonitas interfaces de usuario para visualizar el comportamiento del entorno de tu aplicaci\u00f3n.<\/p>\n<p>Una operaci\u00f3n get como la del ejemplo anterior puede tener este aspecto en la p\u00e1gina de resumen de 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>Al profundizar en la traza espec\u00edfica, se hacen visibles los tiempos de cada tramo y subtramo:<\/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 tramo tambi\u00e9n contiene etiquetas que el SDK adjunta para un filtrado y an\u00e1lisis avanzados:<\/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>Resumen<\/h2>\n<p>Al mejorar nuestros SDK con Response Time Observability, ahora podemos proporcionar una visi\u00f3n m\u00e1s profunda de qu\u00e9 y por qu\u00e9 algo no funciona\/rendimiento como se esperaba. Confiando en OpenTracing como interfaz, adem\u00e1s, podemos hacer que sea independiente del proveedor y abrir la posibilidad de conectar la herramienta APM\/tracing compatible de su elecci\u00f3n si es necesario.<\/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 v26.1 (Yoast SEO v26.1.1) - 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\/es\/response-time-observability-with-the-java-sdk\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/author\/michael-nitschinger\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Response Time Observability with the Java SDK - The Couchbase Blog","description":"Aprenda c\u00f3mo funciona RTO con el SDK de Java. Podemos tener una visi\u00f3n m\u00e1s profunda de qu\u00e9 y por qu\u00e9 algo no est\u00e1 funcionando\/rendiendo como se esperaba.","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\/es\/response-time-observability-with-the-java-sdk\/","og_locale":"es_MX","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\/es\/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":"es","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":"Aprenda c\u00f3mo funciona RTO con el SDK de Java. Podemos tener una visi\u00f3n m\u00e1s profunda de qu\u00e9 y por qu\u00e9 algo no est\u00e1 funcionando\/rendiendo como se esperaba.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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":"es","@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 trabaja como Ingeniero de Software Principal en Couchbase. Es el arquitecto y mantenedor del SDK Java de Couchbase, uno de los primeros controladores de bases de datos completamente reactivos en la JVM. Tambi\u00e9n es autor y mantiene el conector Spark de Couchbase. Michael participa activamente en la comunidad de c\u00f3digo abierto, contribuyendo a otros proyectos como RxJava y Netty.","sameAs":["https:\/\/nitschinger.at","https:\/\/x.com\/daschl"],"url":"https:\/\/www.couchbase.com\/blog\/es\/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","author_category":"","last_name":"Nitschinger, Principal Software Engineer, Couchbase","first_name":"Michael","job_title":"","user_url":"https:\/\/nitschinger.at","description":"Michael Nitschinger trabaja como Ingeniero de Software Principal en Couchbase. Es el arquitecto y mantenedor del SDK Java de Couchbase, uno de los primeros controladores de bases de datos completamente reactivos en la JVM. Tambi\u00e9n es autor y mantiene el conector Spark de Couchbase. Michael participa activamente en la comunidad de c\u00f3digo abierto, contribuyendo a otros proyectos como RxJava y Netty."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4976"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4976\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4976"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}