Publicidad

Como hacer el seguimiento a una petición HTTP con un unique_id


Por Alex el 09/11/2025, Comentar el artículo

Comparte este artículo:      




Como rastrear y correlacionar peticiones HTTP en Apache2 · PHP · MySql usando el módulo mod_unique_id y generar un identificador único por solicitud y seguir su rastro en los acceso, logs de error, los de base de datos y logs de aplicaciones ...


Para hacer un seguimiento a una petición HTTP hay que incluir el unique_id en los logs.

La teoría es muy sencilla se añade un unique_id cuando la petición llega a Apache2 y se pasa como header a la aplicación web o API donde se almacenará en los headers.

Una vez en la aplicación podemos grabarla en logs o tablas para tener todo relacionado una petición de entrada y salida.

Para el ejemplo utilizare:

  • Ubuntu Server con Apache2 donde añadir el unique_id cuando una petición llega y registrar en el acces_log y error_log el unique_id
  • Una API en PHP, muy simple, sin framework, para ver como registramos en un log el unique_id y en base de datos y log de base de datos
  • Servidor de base de datos MySql para ver el seguimiento de ese unique_id en las consultas.
He utilizado este entorno dockerizado listo para trabajar https://github.com/depruebas/docker-ubuntu-server-mysql-phpmyadmin.git levanta un servidor Ubuntu Server 24.04 con Apache2, MySql, PHP y phpMyAdmin. Por si lo queréis utilizar :-)

Esta es la base del proyecto, al final dejo el repo del proyecto completo.

1) Añadir un unique_id al log de Apache2

Voy a crear el directorio del proyecto de test, sino tenemos creada la ruta del proyecto al reiniciar apache nos dará error /data/code/testid/api

y podemos crear dentro un index.php para el código que después pondremos

Vamos con la parte del servidor Apache2, ahora asignamos un , un id único a cada petición que llega a Apache2

En Apache2 tenemos que tener habilitar los mods

sudo a2enmod unique_id
sudo a2enmod headers

Y reiniciar el apache2

sudo service apache2 restart

Ahora en el fichero de virtualhost del dominio que queréis hacer el seguimiento añadir los siguiente en la parte final del VirtualHost

# Follow the request.
 #
 # --- Header con el UNIQUE_ID real generado por Apache ---
 Header set X-Trace-Id "%{UNIQUE_ID}e"


 # --- Log de errores personalizado con UNIQUE_ID ---
 ErrorLog ${APACHE_LOG_DIR}/error_testuid.log
 ErrorLogFormat "[%t] [pid %P:tid %T] [client %{REMOTE_ADDR}e] [%{UNIQUE_ID}e] %M"


 # --- Log de acceso con el UNIQUE_ID  ---
 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{UNIQUE_ID}e" combined_with_trace
 CustomLog ${APACHE_LOG_DIR}/access_testuid.log combined_with_trace
 #
</VirtualHost>



Al acceder al web en el registro del log access_testui.log queda registrado una línea como la siguiente:

192.168.65.1 - - [05/Nov/2025:16:55:20 +0100] "GET / HTTP/1.1" 200 857 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:144.0) Gecko/20100101 Firefox/144.0" aQt0ks0MqoURL4qS90CdAwAAAAI

donde el ultimo parametro aQt0ks0MqoURL4qS90CdAwAAAAI es el unique_id de la petición

Si generamos un error el formato del error será el siguiente:

[Wed Nov 05 16:56:57 2025] [pid 467:tid [client 192.168.65.1] [aQtzybVhXkICAWgVyKGengAAAAE] PHP Fatal error: Test page error in /data/code/testid/web/error.php on line 3

donde el código aQtzybVhXkICAWgVyKGengAAAAE entre corchetes es el unique_id de la petición

Para probar el error puedes crear una página .php con este código dentro:

trigger_error("Test page error", E_USER_ERROR);


Los parámetros que se pueden poner en la configuración de los logs son variados y aquí los podéis encontrar https://httpd.apache.org/docs/2.4/mod/mod_log_config.html

Ahora lo pasamos a nuestra aplicación web o api con la siguiente línea pasamos el ID a la aplicación

RequestHeader set uniqueid %{UNIQUE_ID}e


2) Recoger el unique_id en la aplicación web o api

En PHP este unique id lo recogemos desde la variable de entorno $_SERVER

¿Cómo utilizar el unique_id generado en la petición para realizar un seguimiento?

Utilizaré un ejemplo de una API, el ejemplo es muy simple en PHP pero podréis ver como utilizar este unique_id a lo largo de todo el programa.

La API recibí un json con datos:
  • Guardamos el json recibido en un log con el unique_id para identificar la petición
  • Hacemos modificaciones en el json a lo largo de la aplicación y cada modificación la guardamos en un log junto al unique_id
  • Antes de devolver el resultado guardamos en un log lo que devolvemos.

Este es el código

# Store the input data in a variable
$_input = file_get_contents( 'php://input');

$unique_id = $_SERVER['UNIQUE_ID'];

# Save the input json along with the unique_id that comes from Apache2
error_log( "[" . date("Y-m-d H:s:i") . "] - input - " . $unique_id . " - " . $_input, 3, "./app.log");

# Decode the JSON
$obj_input = json_decode( $_input);

# Delete libros obtject
unset($obj_input->libreria->libros);
error_log( "[" . date("Y-m-d H:s:i") . "] - output - " . $unique_id . " - Eliminado el objeto libros", 3, "./app.log");

# Add usuarios object
$obj_input->usuarios = new stdClass();
$obj_input->usuarios->total = 25;
error_log( "[" . date("Y-m-d H:s:i") . "] - output - " . $unique_id . " - Añadido el objeto usuarios", 3, "./app.log");

# Log response
error_log( "[" . date("Y-m-d H:s:i") . "] - output - " . $unique_id . " - " . json_encode( $obj_input), 3, "./app.log");

# Return the result of the request.
echo ( json_encode( $obj_input));


Lo mismo podría ser una aplicación Web

3) Registrar el unique_id en MySql

Igual que registramos este unique_id en los logs para identificar una petición podemos relacionar también los logs de MySql para saber que consultas están relacionadas con una petición dada.

Lo primero para esto es activar los logs de MySql porque por lo general no vienen activados.

Para hacerlo de forma temporal lanzar este comando desde el terminal.

mysql -u root -proot -e "set global general_log=1; set global general_log_file='/var/log/mysql/mysql.log'"

Y con un tail se pueden ver los mensajes que van al MySql, esto registra todo lo que va al MySql así que cuidado en producción porque el log tiende al infinito.

tail -f /var/log/mysql/mysql.log

Ahora vamos a añadir el unique_id en la consulta para que quede reflejado en los logs.

Se añade en /* unique_id */ delante de la sentencia SQL

Desde PHP lo haremos así:

$unique_id = $_SERVER['UNIQUE_ID'];
$conn->query(" /* " . $unique_id . " */ SELECT * FROM usuarios");


Y en el log se veran asi los registros:

2025-11-06T13:55:32.686756Z 162 Quit
2025-11-06T13:56:14.007907Z 163 Connect root@localhost on testdb using TCP/IP
2025-11-06T13:56:14.008280Z 163 Query /* aQyo_hQoGatvW0S1-rmyRQAAAAY */ SELECT * FROM usuarios
2025-11-06T13:56:14.008722Z 163 Quit


4) Conclusiones

De esta forma podemos hacer un seguimiento a una determinada petición y ver por donde va pasando en los logs:
  • Logs de Apache2
  • Logs de aplicación
  • Logs de MySql

Cuanta mas información tengamos mejor, y mejores decisiones tomaremos.

También podemos hacer este seguimiento en otros entornos nginx, Python, PostgreSQL, SQL Server, la idea es sencilla al recibir una petición se ha de generar un unique_id y ir pasandolo.

Repo del artículo https://github.com/depruebas/follow-the-request

Y esto es todo, feliz programming!!!
Saludos
Alex
:-)
/


Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN


ARCHIVO

Publicidad

.