Librerias de OpenTelemetry de .NET dan 401
En un rush de locura, se me ocurrio meterle Open Telemetry al blog (si, ya se, tiene 4 visitas, que vas a ver?), pero bueno, Grafana cloud tiene un free tier bastante generoso.
Esto no es un step-by-step para poner OTEL, para eso pueden ir al excelente articulo de Milan, Monitoring .NET Applications with OpenTelemetry and Grafana, sino que me voy a enfocar en cuando algo tiene un problema y no podemos "ver" realmente que pasa por dentro.
Para instalar OTEL, basicamente, hay que poner incluir unas librerias, poner unas variables de entorno, y listo, sale andando. O eso dice la teoria. En mi caso, yo segui todas las instrucciones, pero las librerias de OTEL me daban 401; como si el token de autenticacion estuviera mal. Pense que podia ser que la variable de entorno estuviera mal escrita, o que faltara escapar algun espacio o caracter raro. Pero no, seguia recibiendo 401.
Lo unico que veia era:
[17:42:40 INF] Start processing HTTP request POST https://otlp-gateway-prod-us-east-2.grafana.net/otlp/v1/traces
[17:48:12 INF] Received HTTP response headers after 302.8ms - 401
Aja, divino. 401 sabemos que es que Unauthorized, asi que seguro venia por el lado de la autenticacion. Pero como VES que le esta llegando? Pense en cambiar lo que logueaba, intentando que metiera un poco de info de los headers y el body, pero como usa internamente un HTTPClient
, no es tan facil de cambiar de forma general.
Entonces, como puedo hacer para SABER que le esta llegando?
Entra a la cancha Mitmproxy! Un pequeño programita open source que hace de proxy, con soporte para SSL.
Lo baje, lo instale y lo corri. No es muy atractivo visualmente, pero hace su trabajo: te muesta las URL, y podes elegir con el cursor, y te muestra todo (headers, request, response, etc).
Es justo lo que necesito! Una vez corriendo, configuro Firefox para que vaya por ese proxy y visito http://mitm.it para configurar el certificado SSL (estan todas las instrucciones).
Una vez andando y probado el proxy, como configuro mi API para que mande todo por este proxy? Facil!
HttpClient.DefaultProxy = new WebProxy("http://localhost:8888");
Corro la API, miro el proxy y me doy cuenta que ni siquiera recibia el header con el token. Modifico el codigo para mandarlo "a pata", en vez de usar la variable de entorno, y listo! Ahora con el proxy, puedo verificar que esta recibiendo 200 OK y los traces ahora aparecen en Grafana
services
.AddOpenTelemetry()
.ConfigureResource(resource => resource.AddService(SERVICE_NAME))
.WithTracing(tracing =>
{
tracing
.AddAWSLambdaConfigurations(opt => opt.DisableAwsXRayContextExtraction = true)
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation();
tracing.AddOtlpExporter(opt => opt.Headers = "Authorization=Basic " + grafanaSettings.GrafanaToken);
Y listo! Siempre esta bueno tener un proxy a mano para estos casos 👩💻
PD: no me acuerdo donde lei que decian que si tenes un blog de tecnologia, hagas un post por cada cosa que encuentres o cada bug que fixees, porque de esa manera, podes ayudar a alguien mas que puede tener el mismo problema (o un problema parecido). Asi que voy a intentar implementarlo.
Comentarios Recientes
No hay comentarios, porque no dejás alguno?

Deja un comentario
