← Back to Portfolio
Senior Backend Engineer / Lead Backend Developer

Backend Observability & Production Incident Handling for Microservices

Docker AWS GitHub Actions Grafana Loki

Overview

I worked on backend services for a multi-tenant B2B learning platform. As the platform grew, it became harder to understand what was happening in production from application behavior alone.

The system had several backend services, database-driven workflows, asynchronous processing, and external integrations. My work focused on helping investigate backend issues, reviewing logs and monitoring data, and improving how the team handled production debugging.

Problem

When issues happened in production, the source was not always obvious. It could be related to API logic, database queries, queue processing, service communication, infrastructure settings, or an external dependency.

Without enough context from logs and monitoring, debugging could take longer because engineers had to check several parts of the system before finding the problem.

We needed a clearer way to investigate backend issues without relying too much on guesswork.

My Role

I contributed as a Senior Backend Engineer / Lead Backend Developer, with hands-on involvement in production debugging and reliability improvement.

My work included reviewing logs, checking service behavior, investigating backend flows, optimizing queries or backend logic when needed, and coordinating with other engineers during issue investigation.

I also supported code reviews and technical discussions, especially when issues were related to service boundaries, API behavior, database access, or asynchronous processing.

Approach

My first focus was making backend behavior easier to understand from logs and monitoring.

When a production issue happened, I usually started by narrowing down the possible area: API, database, queue, service communication, infrastructure, or external integration. This helped the team avoid jumping into assumptions too early.

For performance-related issues, I reviewed the affected backend flow, checked database access patterns, examined logs, and looked for operations that could be simplified or optimized.

In some cases, the fix was query optimization. In others, it was improving asynchronous handling or making the responsibility between services clearer.

For asynchronous workflows, RabbitMQ helped move work that did not need to happen inside a single request-response cycle. This made some backend flows easier to manage, but it also meant we needed better visibility into queue behavior, failure cases, and retry handling.

One practical trade-off was logging. Too little logging made issues harder to investigate, but too much logging created noise. The goal was to keep logs useful for debugging without overwhelming the team.

Impact

After these improvements, investigating backend issues became easier because the team had more context from logs, monitoring, and service behavior.

The work helped make production debugging more structured and supported follow-up improvements around database access, asynchronous processing, and service reliability.

It also reminded me that backend work does not stop when a feature is released. The service also needs to be easy to debug, monitor, and maintain once it is running in production.