krakend / krakend-ce

KrakenD Community Edition: High-performance, stateless, declarative, API Gateway written in Go.
https://www.krakend.io
Apache License 2.0
1.86k stars 443 forks source link

Error: Krakend a veces devuelve Status Code "2" cuando el backend devuelve un "200" #885

Closed ridgarou closed 2 weeks ago

ridgarou commented 1 month ago

Environment info:

Describe the bug Hola chicos, ante todo disculpad que escriba el issue en español pero es algo tan raro que me resulta complejo explicarme en ingles.

Tengo desplegado KrankenD en un Cluster de AKS en Azure y se encuentra replicado en dos nodos. Esta configurado para mandar las métricas a Azure Application Insight mediante opencensus y un agente otel-collector

A lo largo del día de hoy, en unas pruebas de nuestras apis hemos detectado algunos errores aparentemente aleatorios que quedaban reflejados en el log de krakend de la siguiente forma:

[KRAKEND] 2024/05/30 - 19:08:07.637 ▶ ERROR [ENDPOINT: /v2/user/profile] Error #0: context canceled
[GIN] 2024/05/30 - 19:08:07 | 200 |  143.655729ms |   83.33.197.234 | GET      "/v2/user/profile"
Error #01: context canceled

.....

[KRAKEND] 2024/05/30 - 20:20:19.777 ▶ ERROR [ENDPOINT: /v2/user/notification/register] context canceled
[GIN] 2024/05/30 - 20:20:19 | 500 |  177.503302ms |   83.33.197.234 | POST     "/v2/user/notification/register"
Error #01: context canceled

Y es que esto no ocurre siempre, hay otras llamada a los mismos metodos que devuelven un 200

Es curioso por que la respuesta unas veces es un 200, otras es un 500 pero siempre responde context canceled que si no recuerdo mal es el error que se devuelve cuando en la llamada al backend, esta termina inesperadamente sin devolver respuesta.

Todas las urls utilizadas en la configuración son nombres de servicios de kubernetes, es decir, que la llamada es "interna" de servicio a servicio dentro del cluster y por http

En el log del Azure Application Insight queda reflejado el failure así, como si el backend devolviera un 2 como status_code

image

Pero he revisado la ejecución de la llamada al backend y esta se ha ejecutado correctamente y devuelve un 200

image

La verdad es que no se donde mas puedo mirar o como hacer que el log del kranked sea mas detallado. y el caso es que es algo que se produce bastante (y hasta ahora no lo había visto)

image

Your configuration file:

{
  "version": 3,
  "name": "API Gateway",
  "port": 9090,
  "host": [ "http://krakend-apigw.api-gateway:9090" ],
  "timeout": "10s",
  "output_encoding": "json",
  "debug_endpoint": true,
  "echo_endpoint": true, 
  "disable_compression": false,
  "extra_config":     {
.........
        "telemetry/logging": {
            "level": "DEBUG",
            "prefix": "[KRAKEND]",
            "syslog": false,
            "stdout": true
        },
        "telemetry/metrics": {
            "collection_time": "60s",
            "proxy_disabled": false,
            "router_disabled": false,
            "backend_disabled": false,
            "endpoint_disabled": false,
            "listen_address": ":9091"
        },
        "router": {
            "return_error_msg": true,
            "hide_version_header": true,
            "error_body": {
                "404": {
                    "msg": "Unknown endpoint",
                    "status": 404
                },
                "405": {
                    "oh-my-god": "What on earth are you requesting?"
                }
            },
            "disable_health": false,
            "health_path": "/__health",
            "logger_skip_paths": ["/__health"],
            "auto_options": true,
            "disable_redirect_fixed_path": true
        },
........
  },
  "endpoints":  [ 
........
   {  "@comment": "/v2/user/notification/register - Crea/Actualiza el token de Firebase (FCM) de un usuario+dispositvo en BDD.",
      "endpoint": "/v2/user/notification/register",
      "method": "POST",
      "input_headers": [ "Content-Type", "Authorization", "Accept-Language" ],
      "input_query_strings": [ ],
      "output_encoding": "json",
      "backend": [
        {
          "host": [ "http://webapi-messenger.default-pro:6001" ],
          "url_pattern": "/push-registration",
          "method": "POST",
          "encoding": "json",
          "extra_config": { "backend/http": { "return_error_code": true } }
        }
      ], 
      "extra_config": {
        "auth/validator": {     
          "alg": "HS256",
          "jwk_url": "http://krakend-fakeapi.api-gateway:9093/auth/keys.json",
          "cache": true,
          "cache_duration": 3600,
          "disable_jwk_security": true,
          "operation_debug": true,
          "issuer": "https://auth.id.blinapp.com",
          "audience": [ "229240097764253" ],
          "propagate_claims": [
              [ "jti",   "x-jti"   ],
              [ "sub",   "x-user"  ],
              [ "scope", "x-scope" ],
              [ "token", "x-token" ]
          ]
        }
      }
   }

Expected behavior Entiendo que lo suyo seria que devolviera un 200 y no se interrumpiera la ejecución. Tampoco se donde mas mirar, así que si me podéis orientar para averigua que puede estar ocurriendo, os lo agradeceria muchisimo.

Un saludo, Jesus

ridgarou commented 1 month ago

Aquí tenéis un ejemplo de una ejecución correcta del mismo método

El log de krankend en Application Insight: image

El log del servicio de backend en Application Insight: image

ridgarou commented 2 weeks ago

Después de muchas pruebas, hemos conseguido aislar el problema, y este venia por culpa de los clientes, que efectivamente cerraban la conexión antes de tiempo. Cierro el issue directamente.