Kodelinesoftware engineering
Platform Engineering · CI/CD

Built an observability layer that treats CI/CD pipelines as a queryable system and brings job results across repositories, services, environments, runs, runners, and commits into one diagnostic interface.

References
Technical scope

Open-source observability dashboard for CI/CD jobs and pipeline diagnosis

Platform-agnostic task instrumentation for build, test, deploy, scan, and release jobs, CI metadata normalization for GitHub Actions and GitLab CI, OpenTelemetry Collector Gateway, Grafana dashboards, optional JUnit test spans, logs, traces, runner metrics, and commit-aware regression detection.

Before

Failed build, test, deploy, scan, and release jobs were trapped inside individual CI runs, logs, artifacts, and provider-specific pages.

After

A Grafana observability surface connects task results, Loki logs, Tempo traces, Prometheus metrics, runner resource signals, and commit metadata across runs and repositories.

System context

Production platform, not a reporting demo.

The system instruments CI/CD tasks with a platform-agnostic Python wrapper, enriches execution telemetry with normalized CI metadata, and routes logs, traces, and metrics through OpenTelemetry Collectors into Grafana, Loki, Tempo, and Prometheus. The dashboard gives teams one diagnostic interface for failed builds, tests, deployments, scans, migrations, release jobs, and custom automation tasks.

System screens

Screenshots in project context

Selected views appear where they provide concrete proof of architecture, workflow, or reporting behavior.

Engineering challenge

CI/CD failures produce evidence, but the evidence is fragmented.

Modern delivery pipelines contain builds, tests, security scans, infrastructure checks, deployments, database migrations, releases, and custom scripts. Native CI interfaces are effective for inspecting one run, but weaker when the question spans jobs, repositories, services, environments, runners, commits, and time ranges.

  • Repeated failures require manual navigation through separate CI runs and job pages
  • Logs, artifacts, runner context, duration data, and commit history are split across interfaces
  • Regression diagnosis needs task status, commit metadata, logs, traces, and resource signals in one view
  • Cross-run analysis is especially costly in microservice and multi-repository delivery environments
  • The observability layer had to work without rewriting application code, scripts, or test frameworks
Architecture

CI Runner -> OpenTelemetry Collector Gateway -> Grafana observability stack.

A Python command wrapper runs inside the CI job and executes the original build, test, deploy, scan, migration, or release command as a subprocess. It captures stdout and stderr, emits task spans and status records, optionally parses JUnit XML into per-test-case spans, and exports telemetry over OTLP.

  • Language-independent task wrapping for commands such as dotnet test, npm test, pytest, Terraform, Docker, and Kubernetes checks
  • Local CI collection with remote OpenTelemetry Collector Gateway routing
  • Logs routed to Loki, traces to Tempo, and metrics to Prometheus
  • Traefik-based gateway deployment for TLS termination and authentication
  • Grafana dashboard as the single diagnostic interface across telemetry signals
Trace and metadata model

Short-lived CI processes need deterministic correlation.

CI tasks run as independent short-lived processes, so trace correlation cannot rely on shared in-memory state. The implementation derives trace and span identifiers from CI metadata and normalizes GitHub Actions and GitLab CI variables into a shared context.

  • Deterministic trace and span identifiers from run ID, run attempt, job name, runner identity, and task name
  • Normalized CI context for provider, repository, pipeline, job, namespace, service, task, branch, commit, runner, run URL, and commit URL
  • Provider-independent dashboard filters for namespace, service name, job target, and task target
  • Commit-aware task rows that connect result, branch, SHA, logs, trace, runner, and CI links
  • Optional test-case spans generated from JUnit XML reports
Diagnostic workflow

Task status, logs, traces, metrics and commits in one CI/CD view

The system turns build, test, deploy, scan, migration and release jobs into observable tasks that can be queried across providers, repositories, runs and commits.

Grafana CI/CD Dashboard

The dashboard provides cascading selectors for namespace, service name, job target, task target, and time range. It scopes from a full delivery landscape down to one task and keeps high-signal diagnostic panels visible.

  • Task results table with status, duration, commit SHA, branch, runner, and CI links
  • Task pass/fail aggregation and individual test-case results
  • Task duration over time for trend and regression detection
  • Host CPU and memory panels grouped by runner
  • Direct navigation from failed task rows to Loki logs and Tempo traces

Logs, Traces and Test Spans

Failed tasks can be inspected through raw Loki logs and Tempo traces without leaving the diagnostic workflow. When JUnit XML is available, the trace includes per-test-case spans so failed test evidence is correlated with the parent task.

  • stdout and stderr export to Loki
  • Task-level spans with status, duration, labels, and CI metadata
  • Per-test-case spans from JUnit XML reports
  • Trace waterfall for failing task execution
  • Fast handoff from aggregate dashboard row to raw execution evidence

Evaluation and Overhead

The prototype was evaluated with Microsoft eShop on GitHub Actions and Google Online Boutique on GitLab CI to test cross-provider and service-based workflows.

  • Aggregated task-level failures over recent time ranges
  • Navigation from failed task to raw logs and execution trace
  • Commit-aware tracing of task-level regressions
  • Keystroke-Level Model comparison against native CI navigation
  • Measured instrumentation overhead of approximately 12 to 17 seconds per run
Engineering

Technical contribution

  • Platform-agnostic Python command wrapper for CI task instrumentation
  • OpenTelemetry log, trace, and metric export from pipeline tasks
  • Optional JUnit XML parsing for per-test-case spans
  • Deterministic trace and span ID derivation for short-lived CI processes
  • CI metadata normalization across GitHub Actions and GitLab CI
  • Local OpenTelemetry Collector agent configuration for CI runners
  • Remote OpenTelemetry Collector Gateway for telemetry routing
  • Loki, Tempo, Prometheus, and Grafana backend deployment
  • Grafana dashboard with namespace, service, job, task, and time filters
  • Direct links from task result rows to raw Loki logs and Tempo traces
  • Commit-aware job and task visibility across repositories, services, environments, and runs
  • Evaluation of interaction effort and runtime overhead
Impact:

Business impact

The system turns CI/CD from a collection of isolated pipeline pages into a queryable diagnostic surface. The business value is faster failure investigation, clearer regression ownership, and less manual navigation through CI runs, logs, artifacts, and provider-specific screens.

  • Faster investigation of repeated failures across build, test, deploy, scan, migration, and release jobs
  • Clearer visibility into which commit introduced a regression
  • Reduced manual navigation through CI runs, logs, and artifacts
  • Better evidence for separating code failures from flaky tests, deployment problems, runner pressure, or external dependencies
  • Open-source observability stack instead of vendor-locked CI analytics
  • Reusable architecture for GitHub Actions, GitLab CI, and future CI providers
  • Stronger release confidence for projects with non-trivial CI/CD workflows
Screenshot gallery

Additional system views

The gallery collects additional anonymized screenshots without hiding the technical case study inside a slider.